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 [2013-11-19 13:30] grafsoftware:linux:emdebian:rootfs_erstellen [2014-10-09 09:25] 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. 
  
-===== Erstellen ===== +<box red right 60% | **Wichtig**> 
-==== Multistrap ====+ 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> 
 + 
 +===== 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]] 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]]
  
-==== Automatisches Build Skript ==== +==== Vorbereitung: Tools installieren ==== 
-Das folgende Skript erstellt automatisch ein neues RootFS-Image+  - Debian Multistrap installieren: <code>apt-get install multistrap</code> 
-<code bash+  - Emdebian-Archiv-Schlüssel installieren: <code>apt-get install emdebian-archive-keyring</code> 
-#!/bin/bash+  - 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): <code>nano -w /etc/apt/sources.list</code> <code>wheezy backports 
 +deb http://mirror.switch.ch/ftp/mirror/debian/ wheezy-backports main</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> 
 +    - **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> 
 +  - schroot installieren: <code>apt-get install schroot</code> 
 +  - mtd-utils installieren: <code>apt-get install mtd-utils</code>
  
-MULTISTRAP_CONFIG=myConfig.grip.multistrap # give name of configuration file +==== Erstellen ==== 
-ROOTFS_DIR=/opt/multistrap +  - 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] 
-ROOTFS_IMG=rootfs.jffs2 # choose a suitable file system format +...
-FILE_DIR=files +
-DEV_TABLE=device_table+
  
-set -e+[Grip] 
 +...
  
-echo "Multistrapping... " +[Debian] 
-if [ ! -d $ROOTFS_DIR ]; then mkdir -p $ROOTFS_DIR; fi +... 
-export MULTISTRAP_OUTPUT_DIR=$ROOTFS_DIR +</file> 
-multistrap -$MULTISTRAP_CONFIG+  - Root File System bootstrappen. Dies erstellt ein Grundsystem im Verzeichnis ''/opt/multistrap/'': <code>multistrap -f myBoard.multistrap </code> 
 +  - 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
  
-echo "Create missing folders on rootfs..." +auto eth0 
-if [ ! -d $ROOTFS_DIR/etc/network ]; then mkdir -p $ROOTFS_DIR/etc/network; fi +iface eth0 inet static 
-if [ ! -d $ROOTFS_DIR/etc/init.d ]; then mkdir -p $ROOTFS_DIR/etc/init.d; fi +           address 146.136.36.x 
-if [ ! -$ROOTFS_DIR/etc/dhcp3 ]; then mkdir -p $ROOTFS_DIR/etc/dhcp3; fi +           netmask 255.255.252.0 
-if ! -d $ROOTFS_DIR/etc/apt/apt.conf.d/ ]; then mkdir -p $ROOTFS_DIR/etc/apt/apt.conf.d; fi +           gateway 146.136.36.1</file> 
-if [ ! -d $ROOTFS_DIR/lib/modules/2.6.31 ]; then mkdir -p $ROOTFS_DIR/lib/modules/2.6.31; fi +  Hostname konfigurieren: <code>echo myBoard > /opt/multistrap/etc/hostname</code> 
-if [ ! -d $ROOTFS_DIR/dev/shm ]; then mkdir -p $ROOTFS_DIR/dev/shm; fi +  - Bash primary promt string (PS1-String) anpassen: <code>nano /opt/multistrap/etc/bash.bashrc</code> 
-if [ ! -d $ROOTFS_DIR/usr/share/man/man1 ]; then mkdir -p $ROOTFS_DIR/usr/share/man/man1; fi +    Die Zeile: <code>PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '</code> 
-if [ ! -d $ROOTFS_DIR/usr/share/man/man7 ]; then mkdir -p $ROOTFS_DIR/usr/share/man/man7; fi +    - Ersetzen durch: <code>PS1='[MY_TARGET\u@\h:\w\'</code> 
-# more folders ...+  - 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>
  
-echo "Copying config files to rootfs..." +==== Automatisches Build Skript ==== 
-cp -v $FILE_DIR/fstab $ROOTFS_DIR/etc/ +Ein Root-Filesystem kann auch mit einem automatischen Build-Script erstellt werdenDas folgende {{:software:linux:emdebian:buildscript.sh|Skript}} zeigt ein Beispiel.
-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