====== 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. 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 [[software:linux:buildroot:start|hier]]). Die Unterschiede werden in diesem [[http://mind.be/content/Presentation_Emdedded-distro-shootout.pdf|Artikel]] gut gezeigt. ===== Multistrap ===== Wir benutzen [[http://www.emdebian.org/multistrap/|Multistrap]] für die Erstellung eines Root-Filesystems. Dort befinden sich auch Beispiele für die notwendigen Konfigurationsdateien. Ein weiteres Beispiel findet sich unter [[http://wiki.ntb.ch/collaboration/beo_it_smart_meter/rootfs/multistrap_konfiguration|Projekt Beo-IT]] ==== Vorbereitung: Tools installieren ==== - Debian Multistrap installieren: apt-get install multistrap - Emdebian-Archiv-Schlüssel installieren: apt-get install emdebian-archive-keyring - Qemu installieren, es wird Version 1.5 oder neuer benötigt. - **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: - 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 - Paket-Liste aktualisieren: apt-get update - Qemu aus den Backports installieren: apt-get -t wheezy-backports install qemu qemu-user-static - **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 - Unterstützung für zusätliche Binärformate installieren: apt-get install binfmt-support - schroot installieren: apt-get install schroot - mtd-utils installieren: apt-get install mtd-utils ==== Erstellen ==== - 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 [General] ... [Grip] ... [Debian] ... - Root File System bootstrappen. Dies erstellt ein Grundsystem im Verzeichnis ''/opt/multistrap/'': multistrap -f myBoard.multistrap - Skript für automatische Konfiguration erstellen: nano /opt/multistrap/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 - Konfigurationsskript ausführbar machen: chmod 755 /opt/multistrap/autoconfig.sh - schroot Konfiguration erstellen: nano /etc/schroot/chroot.d/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 - Untere Adresslimitierung für Qemu deaktivieren: echo 0 > /proc/sys/vm/mmap_min_addr - 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/ - chroot Umgebung betreten (in Arbeitsverzeichnis ausführen): schroot -c my-emdebian-grip - Konfigurationsskipt ausführen: (my-emdebian-grip)$ /autoconfig.sh - Root Passwort festlegen: (my-emdebian-grip)$ passwd - APT Cache löschen: (my-emdebian-grip)$ apt-get clean - chroot Umgebung wieder verlassen: (my-emdebian-grip)$ exit - Mount-Punkte festlegen: nano /opt/multistrap/etc/fstab #/etc/fstab /dev/root / jffs2 defaults 0 0 proc /proc proc defaults 0 0 ... - Serielles Terminal konfigurieren (board-spezifisch). * Editieren von ''/opt/multistrap/etc/inittab'' * 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. - Netzwerkkonfiguration (passend für NTB-Netz): nano /opt/multistrap/etc/network/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 - Hostname konfigurieren: echo myBoard > /opt/multistrap/etc/hostname - Bash primary promt string (PS1-String) anpassen: nano /opt/multistrap/etc/bash.bashrc - Die Zeile: PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' - Ersetzen durch: PS1='[MY_TARGET] \u@\h:\w\$ ' - 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 - Device Node Tabelle im aktuellen Arbeitsverzeichnis erstellen (board-spezifisch): # nano device_table # name type mode uid gid major minor start inc count /dev/console c 600 0 0 5 1 0 0 - ... - 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 {{:software:linux:emdebian:buildscript.sh|Skript}} zeigt ein Beispiel.