Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
Nächste ÜberarbeitungBeide Seiten der Revision
software:linux:emdebian:rootfs_erstellen [2014-10-08 15:19] grafsoftware:linux:emdebian:rootfs_erstellen [2014-10-09 10:00] graf
Zeile 3: Zeile 3:
 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.  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. 
  
-<box red right 25% | **Wichtig**> +<box red right 60% | **Wichtig**> 
- Ein Root-Filesystem kann mit Multistrap sehr einfach und elegant erstellt werden. Allerdings sind die Speicheranforderungen relativ hoch.+ 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 weiter unten). Die Unterschiede werden in diesem [[http://mind.be/content/Presentation_Emdedded-distro-shootout.pdf|Artikel]] gut gezeigt.
 </box> </box>
  
Zeile 10: Zeile 10:
 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]] 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 zum Erstellen des Root File Systems ==== +==== Vorbereitung: Tools installieren ==== 
-  - Debian Multistrap installieren: <code>apt-get install multistrap</code> +  - Debian Multistrap installieren: <code>apt-get install multistrap</code> 
-  - Emdebian-Archiv-Schlüssel installieren: <code>apt-get install emdebian-archive-keyring</code>+  - Emdebian-Archiv-Schlüssel installieren: <code>apt-get install emdebian-archive-keyring</code>
   - Qemu installieren, es wird Version 1.5 oder neuer benötigt.   - 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:     - **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): <code>nano -w /etc/apt/sources.list</code> <code>wheezy backports+      - Backport Quellen eintragen (am Ende der Datei hinzufügen): <code>nano -w /etc/apt/sources.list</code> <code>wheezy backports
 deb http://mirror.switch.ch/ftp/mirror/debian/ wheezy-backports main</code> deb http://mirror.switch.ch/ftp/mirror/debian/ wheezy-backports main</code>
-      - Paket-Liste aktualisieren: <code>apt-get update</code> +      - Paket-Liste aktualisieren: <code>apt-get update</code> 
-      - Qemu aus den Backports installieren: <code>apt-get -t wheezy-backports install qemu qemu-user-static</code> +      - Qemu aus den Backports installieren: <code>apt-get -t wheezy-backports install qemu qemu-user-static</code> 
-    - **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: <code>apt-get install qemu qemu-user-static</code> +    - **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: <code>apt-get install qemu qemu-user-static</code> 
-  - Unterstützung für zusätliche Binärformate installieren: <code>apt-get install binfmt-support</code> +  - Unterstützung für zusätliche Binärformate installieren: <code>apt-get install binfmt-support</code> 
-  - schroot installieren: <code>apt-get install schroot</code> +  - schroot installieren: <code>apt-get install schroot</code> 
-  - mtd-utils installieren: <code>apt-get install mtd-utils</code>+  - mtd-utils installieren: <code>apt-get install mtd-utils</code>
  
-===== Erstellen =====+==== 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): <code>nano myBoard.multistrap</code> <file - myBoard.multistrap> [General] 
 +...
  
-==== Automatisches Build Skript ==== +[Grip] 
-Das folgende Skript erstellt automatisch ein neues RootFS-Image. +...
-<code bash> +
-#!/bin/bash+
  
-MULTISTRAP_CONFIG=myConfig.grip.multistrap # give name of configuration file +[Debian] 
-ROOTFS_DIR=/opt/multistrap +..
-ROOTFS_IMG=rootfs.jffs2 choose a suitable file system format +</file> 
-FILE_DIR=files +  - Root File System bootstrappen. Dies erstellt ein Grundsystem im Verzeichnis ''/opt/multistrap/'': <code>multistrap -f myBoard.multistrap </code> 
-DEV_TABLE=device_table+  - Skript für automatische Konfiguration erstellen: <code>nano /opt/multistrap/autoconfig.sh</code>  <file bash 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</file
 +  - Konfigurationsskript ausführbar machen: <code>chmod 755 /opt/multistrap/autoconfig.sh</code> 
 +  - schroot Konfiguration erstellen: <code>nano /etc/schroot/chroot.d/my-emdebian-grip.conf</code> <file - 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</file> 
 +  - Untere Adresslimitierung für Qemu deaktivieren: <code>echo 0 > /proc/sys/vm/mmap_min_addr</code> 
 +  - Qemu-Binary in das eben erstellte Root-Filesystem kopieren: <code>cp /usr/bin/qemu-ppc-static /opt/multistrap/usr/bin/</code> 
 +  - chroot Umgebung betreten (in Arbeitsverzeichnis ausführen): <code>schroot -c my-emdebian-grip</code> 
 +  - Konfigurationsskipt ausführen: <code>(my-emdebian-grip)$ /autoconfig.sh</code> 
 +  - Root Passwort festlegen: <code>(my-emdebian-grip)$ passwd</code> 
 +  - APT Cache löschen: <code>(my-emdebian-grip)$ apt-get clean</code> 
 +  - chroot Umgebung wieder verlassen: <code>(my-emdebian-grip)$ exit</code> 
 +  - Mount-Punkte festlegen: <code>nano /opt/multistrap/etc/fstab</code> <file - fstab>#/etc/fstab 
 +/dev/root  /               jffs2    defaults                        0  0 
 +proc       /proc           proc     defaults                        0  0 
 +...</file> 
 +  - 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. 
 +  - Netzwerkkonfiguration (passend für NTB-Netz): <code>nano /opt/multistrap/etc/network/interfaces</code> <file - interfaces>auto lo 
 +iface lo inet loopback
  
-set -e+auto eth0 
 +iface eth0 inet static 
 +           address 146.136.36.x 
 +           netmask 255.255.252.0 
 +           gateway 146.136.36.1</file> 
 +  - Hostname konfigurieren: <code>echo myBoard > /opt/multistrap/etc/hostname</code> 
 +  - Bash primary promt string (PS1-String) anpassen: <code>nano /opt/multistrap/etc/bash.bashrc</code> 
 +    - Die Zeile: <code>PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '</code> 
 +    - Ersetzen durch: <code>PS1='[MY_TARGET] \u@\h:\w\$ '</code> 
 +  - Qemu-Binary im erstellten Root FS wieder löschen: <code>rm /opt/multistrap/usr/bin/qemu-ppc-static</code> 
 +  - Device Node Tabelle im aktuellen Arbeitsverzeichnis erstellen (board-spezifisch): <code># nano device_table</code> <file - device_table># name type mode uid gid major minor start inc count 
 +/dev/console c 600 0 0 5 1 0 0 - 
 +...</file> 
 +  - Dateisystemabbild erzeugen: <code># mkfs.jffs2 -n -e 0x40000 -p 0x40000 -b -d /opt/multistrap -D device_table -o my-rfs.jffs2</code> 
 +<WRAP center round tip 80%> 
 +Man kann das Image mit etwas Handarbeit verkleinern, indem vor dem Erzeugen des Iamges 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/''
 +</WRAP>
  
-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..." +==== Automatisches Build Skript ==== 
-if [ ! -d $ROOTFS_DIR/etc/network ]; then mkdir -p $ROOTFS_DIR/etc/network; fi +Ein Root-Filesystem kann auch mit einem automatischen Build-Script erstellt werdenDas folgende {{:software:linux:emdebian:buildscript.sh|Skript}} zeigt ein Beispiel.
-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!" +===== Buildroot ===== 
-</code>+Wir benutzen [[http://buildroot.uclibc.org/|Buildroot]] für die Erstellung eines Root-Filesystems. 
 +TODO