Dies ist eine alte Version des Dokuments!


Root-Filesystem

Auf einem Linux-System wird zuerst der Kernel booten. Dabei werden alle seine Subsysteme initialisiert. Anschliessend wird versucht das Root-Filesystem zu mounten. Dieses befindet sich im Wurzelverzeichnis »/«. Das Root-Filesystem beinhaltet Login- und Shellprogramme, die Systemkonfiguration und ladbare Kernel-Module. Fix installierte Module befinden sich im Kernel selber.
Der Speicherort des Root-Filesystems ist im Kernel fix einprogrammiert und lässt sich ändern mit rdev. Zum Root-Filesystem gehören einige wenige Toplevel-Verzeichnisse und die darin enthaltenen Unterverzeichnisse.

Wichtig

Ein Root-Filesystem kann mit Multistrap sehr einfach und elegant erstellt werden. Allerdings sind die Speicheranforderungen relativ hoch.

Multistrap

Wir benutzen Multistrap für die Erstellung eines Root-Filesystems. Dort befinden sich auch Beispiele für die notwendigen Konfigurationsdateien. Ein weiteres Beispiel findet sich unter Projekt Beo-IT

Vorbereitung: Tools installieren

  1. Debian Multistrap installieren:
    apt-get install multistrap
  2. Emdebian-Archiv-Schlüssel installieren:
    apt-get install emdebian-archive-keyring
  3. Qemu installieren, es wird Version 1.5 oder neuer benötigt.
    1. Für Debian 7: Da in den Paketquellen von Debian Wheezy nur Version 1.2 verfügbar ist, muss das Paket aus dem Backports-Repository verwendet werden. Dazu sind folgende Schritte notwendig:
      1. Backport Quellen eintragen (am Ende der Datei hinzufügen):
        nano -w /etc/apt/sources.list
        wheezy backports
        deb http://mirror.switch.ch/ftp/mirror/debian/ wheezy-backports main
      2. Paket-Liste aktualisieren:
        apt-get update
      3. Qemu aus den Backports installieren:
        apt-get -t wheezy-backports install qemu qemu-user-static
    2. Für Ubuntu und Linux Mint: In den Paketarchiven von Ubuntu 14.04 und Linux Mint 17 liegt QEmu 2.0 bereit, welches direkt verwendet werden kann:
      apt-get install qemu qemu-user-static
  4. Unterstützung für zusätliche Binärformate installieren:
    apt-get install binfmt-support
  5. schroot installieren:
    apt-get install schroot
  6. mtd-utils installieren:
    apt-get install mtd-utils

Erstellen

Achtung: Problem mit Ubuntu: siehe https://bugs.launchpad.net/ubuntu/+source/multistrap/+bug/1313787

  1. Multistrap-Konfiguration im aktuellen Arbeitsverzeichnis erstellen:
    nano myBoard.multistrap
    myBoard.multistrap
     [General]
    ...
    
    [Grip]
    ...
    
    [Debian]
    ...
  2. Root File System bootstrappen. Dies erstellt ein Grundsystem im Verzeichnis /opt/multistrap/:
    multistrap -f myBoard.multistrap 
  3. Skript für automatische Konfiguration erstellen:
    # nano /opt/multistrap/autoconfig.sh
    autoconfig.sh
    #!/bin/sh
    export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true
    export LC_ALL=C LANGUAGE=C LANG=C
    /var/lib/dpkg/info/dash.preinst install
    dpkg --configure -a
    mount proc -t proc /proc
    dpkg --configure -a
  4. Konfigurationsskript ausführbar machen:
    # chmod 755 /opt/multistrap/autoconfig.sh
  5. schroot Konfiguration erstellen:
    # nano /etc/schroot/chroot.d/emdebian-grip-my.conf
    my-emdebian-grip.conf
    [my-emdebian-grip]
    description=My schroot Configuration for Emdebian Grip Wheezy
    aliases=my-emdebian
    type=directory
    directory=/opt/multistrap
    root-groups=root
    users=$USER
    groups=sbuild
  6. Untere Adresslimitierung für Qemu deaktivieren:
    # echo 0 > /proc/sys/vm/mmap_min_addr

Automatisches Build Skript

Das folgende Skript erstellt automatisch ein neues RootFS-Image.

#!/bin/bash
 
MULTISTRAP_CONFIG=myConfig.grip.multistrap # give name of configuration file
ROOTFS_DIR=/opt/multistrap
ROOTFS_IMG=rootfs.jffs2 # choose a suitable file system format
FILE_DIR=files
DEV_TABLE=device_table
 
set -e
 
echo "Multistrapping... "
if [ ! -d $ROOTFS_DIR ]; then mkdir -p $ROOTFS_DIR; fi
export MULTISTRAP_OUTPUT_DIR=$ROOTFS_DIR
multistrap -f $MULTISTRAP_CONFIG
 
echo "Create missing folders on rootfs..."
if [ ! -d $ROOTFS_DIR/etc/network ]; then mkdir -p $ROOTFS_DIR/etc/network; fi
if [ ! -d $ROOTFS_DIR/etc/init.d ]; then mkdir -p $ROOTFS_DIR/etc/init.d; fi
if [ ! -d $ROOTFS_DIR/etc/dhcp3 ]; then mkdir -p $ROOTFS_DIR/etc/dhcp3; fi
if [ ! -d $ROOTFS_DIR/etc/apt/apt.conf.d/ ]; then mkdir -p $ROOTFS_DIR/etc/apt/apt.conf.d; fi
if [ ! -d $ROOTFS_DIR/lib/modules/2.6.31 ]; then mkdir -p $ROOTFS_DIR/lib/modules/2.6.31; fi
if [ ! -d $ROOTFS_DIR/dev/shm ]; then mkdir -p $ROOTFS_DIR/dev/shm; fi
if [ ! -d $ROOTFS_DIR/usr/share/man/man1 ]; then mkdir -p $ROOTFS_DIR/usr/share/man/man1; fi
if [ ! -d $ROOTFS_DIR/usr/share/man/man7 ]; then mkdir -p $ROOTFS_DIR/usr/share/man/man7; fi
# more folders ...
 
echo "Copying config files to rootfs..."
cp -v $FILE_DIR/fstab $ROOTFS_DIR/etc/
cp -v $FILE_DIR/hostname $ROOTFS_DIR/etc/
cp -v $FILE_DIR/passwd $ROOTFS_DIR/etc/
touch $ROOTFS_DIR/lib/modules/2.6.31/modules.dep
# more config files ...
 
echo "Copying scripts to rootfs..."
cp -v $FILE_DIR/kversion $ROOTFS_DIR/opt/ntb/
cp -v $FILE_DIR/hwversion $ROOTFS_DIR/opt/ntb/
cp -v $FILE_DIR/hwclockfirst.sh $ROOTFS_DIR/etc/init.d/hwclockfirst.sh
cp -v $FILE_DIR/serial_config $ROOTFS_DIR/opt/ntb/
# more scripts ...
 
echo "Creating missing links on rootfs..."
if [ ! -L $ROOTFS_DIR/etc/mtab ]; then ln -v -s /proc/mounts $ROOTFS_DIR/etc/mtab; fi
if [ ! -L $ROOTFS_DIR/etc/rcS.d/S99smartmeter-init.sh ]; then ln -v -s ../init.d/smartmeter-init.sh $ROOTFS_DIR/etc/rcS.d/S99smartmeter-init.sh; fi
if [ ! -L $ROOTFS_DIR/etc/resolv.conf ]; then ln -v -s /var/run/resolv.conf $ROOTFS_DIR/etc/resolv.conf; fi
if [ ! -L $ROOTFS_DIR/etc/adjtime ]; then ln -v -s /var/local/adjtime $ROOTFS_DIR/etc/adjtime; fi
 
echo "Generating rootfs image file..."
mkfs.jffs2 -n -e 0x20000 -p 0x20000 -D $DEV_TABLE -l -d $ROOTFS_DIR -o $ROOTFS_IMG
 
echo "All done!"