====== 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.