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. Mit Buildroot reduziert sich die Grösse stark, allerdings bedingt das einen grösseren Aufwand (siehe hier). Die Unterschiede werden in diesem Artikel gut gezeigt.

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

  1. Multistrap-Konfiguration im aktuellen Arbeitsverzeichnis erstellen (Achtung: Problem mit Ubuntu: siehe https://bugs.launchpad.net/ubuntu/+source/multistrap/+bug/1313787, /usr/sbin/multistrap muss abgeändert werden):
    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/my-emdebian-grip.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
  7. Qemu-Binary in das eben erstellte Root-Filesystem kopieren (Achtung: hier muss das passende Binary ausgewählt werden):
    cp /usr/bin/qemu-ppc-static /opt/multistrap/usr/bin/
  8. chroot Umgebung betreten (in Arbeitsverzeichnis ausführen):
    schroot -c my-emdebian-grip
  9. Konfigurationsskipt ausführen:
    (my-emdebian-grip)$ /autoconfig.sh
  10. Root Passwort festlegen:
    (my-emdebian-grip)$ passwd
  11. APT Cache löschen:
    (my-emdebian-grip)$ apt-get clean
  12. chroot Umgebung wieder verlassen:
    (my-emdebian-grip)$ exit
  13. Mount-Punkte festlegen:
    nano /opt/multistrap/etc/fstab
    fstab
    #/etc/fstab
    /dev/root  /               jffs2    defaults                        0  0
    proc       /proc           proc     defaults                        0  0
    ...
  14. Serielles Terminal konfigurieren (board-spezifisch).
    • Editieren von /opt/multistrap/etc/inittab</code>
    • Sicherstellen, dass der Benutzer root sich am seriellen Terminal anmelden kann. Dazu muss in der Datei /opt/multistrap/etc/securetty die aktive tty Verbindung eingetragen sein.
  15. Netzwerkkonfiguration (passend für NTB-Netz):
    nano /opt/multistrap/etc/network/interfaces
    interfaces
    auto lo
    iface lo inet loopback
    
    auto eth0
    iface eth0 inet static
               address 146.136.36.x
               netmask 255.255.252.0
               gateway 146.136.36.1
  16. Hostname konfigurieren:
    echo myBoard > /opt/multistrap/etc/hostname
  17. Bash primary promt string (PS1-String) anpassen:
    nano /opt/multistrap/etc/bash.bashrc
    1. Die Zeile:
      PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    2. Ersetzen durch:
      PS1='[MY_TARGET] \u@\h:\w\$ '
  18. Qemu-Binary im erstellten Root FS wieder löschen (Achtung: hier muss wiederum das passende Binary ausgewählt werden):
    rm /opt/multistrap/usr/bin/qemu-ppc-static
  19. Device Node Tabelle im aktuellen Arbeitsverzeichnis erstellen (board-spezifisch):
    # nano device_table
    device_table
    # name		type	mode	uid	gid	major	minor	start	inc	count
    /dev/console	c	600	0	0	5	1	0	0	-
    ...
  20. Dateisystemabbild erzeugen:
    # mkfs.jffs2 -n -e 0x40000 -p 0x40000 -b -d /opt/multistrap -D device_table -o my-rfs.jffs2

Man kann das Image mit etwas Handarbeit verkleinern, indem vor dem Erzeugen des Images z.B. folgende Verzeichnisse gelöscht werden: /var/cache/, /var/lib/dpkg/info/, /usr/share/zoneinfo/, /usr/share/perl/, /usr/share/perl5/, /usr/share/doc/.

Automatisches Build Skript

Ein Root-Filesystem kann auch mit einem automatischen Build-Script erstellt werden. Das folgende Skript zeigt ein Beispiel.