Linux von CompactFlash


Bei dem vorliegen Dokument handelt es sich sowohl um eine Dokumentation einer Linuxinstallation auf CF-Card als auch um einen Erfahrungsbericht. Die Arbeiten beruhen auf den Ausführungen unter http://silent.gumph.org/content/4/1/011-linux-on-cf.html [1].


Die Motivation


Der Ausgangspunkt bestand in der Absicht, einen Server bereitzustellen, der über USB externe Geber (Kontaktgeber, digitale Temperaturgeber DS1820) abfragt und bei unerlaubten Ereignissen reagiert. Weiterhin „lauscht“ er am ISDN S0 Bus und wertet die gewählten Rufnummern aus, um Schaltvorgänge einzuleiten. Es sollte ein Festplattenbasiertes System abgelöst werden, das nach langer zuverlässiger Laufzeit im entscheidenden Moment wegen Plattenfehler ausfiel.

Das vorliegende System basiert auf einem Serverrechner mit 1GB RAM. Bei dieser Größenordnung kann man schon recht großzügig eine Ramdisk einrichten und behält dennoch genügend Arbeitsspeicher. Das system arbeitet ohne swap.


Das passende Linux


Erste Versuche, ein Linux auf CF Card zu installieren wurden mit DSL-Linux (http://www.damnsmalllinux.org ) erfolgreich angestellt. Für die angestrebte Lösung wurde dann aber auf eisfair Linux zurückgegriffen. Dabei handelt es sich um ein hervorragend ausgebautes Linux für verschiedene Serveranwendungen, einschließlich isdn-Unterstützung. Eisfair ist zu beziehen unter http://www.eisfair.org/home/download


Aufteilung der CF


Die CompactFlashCard wurde entgegen anderer Lösungen partitioniert. Es wurden 2 Partitionen verwendet, die zusammen etwa 1GB belegen. Eine Partition enthält die Bootdateien, einschließlich der möglicherweise gezippten Ramdisk(lite oder lite.gz), des Kernels (vmlinuz), ldlinux.sys und syslinux.cfg. Die Ramdisk enthält den kompletten Verzeichnisbaum des Linuxsystems außer dem /usr -Verzeichnis. Da von diesem Verzeichnis generell nur gelesen wird, kann es als Partition read only gemounted werden. Das spart Platz im Ram und vereinfacht nachträgliches Installieren von Programmen unter beispielsweise /usr/local. Änderungen, die in der Ramdisk permanent vorgenommen werden sollen, erfordern einen hohen Aufwand und können bei fehlerhaften oder unbedachten Änderungen die Funktion des ganzen Systems stillegen. Liegt das Ramdiskimage ungepackt vor, dauert das Laden beim Hochfahren des Systems zwar deutlich länger, aber das Image kann als Loopdevice gemounted werden, so dass dann Änderungen an dem Image noch möglich sind, die dann beim nächsten Systemstart wirksam werden.


Die Arbeitsschritte


  1. Installation von Linux auf Festplatte

    Die Installation erfolgt zu nächst in eine oder mehrere Linuxpartitionen. Es ist darauf zu achten, dass die Paketauswahl schlank bleibt, d.h. Den Anforderungen angemessen.

    Eine swap Partion wird nicht angelegt, da das Zielsystem über keine Festplatte verfügt. Möglicherweise muss für die Installation selbst eine swap Partition zunächst eingerichtet werden, die aber später wieder aus dem System entfernt werden muss.

  2. Um die Größe des Systems zu ermitteln, bedient man sich des Kommandos df. Die Spalte „used“ gibt die Größe des durch das System belegten Platzes an. Hinzugerechnet werden muss noch der Platz, den logfiles während des Laufes des Systems benötigen und ggf. Platz für Userdaten in Homedirectories. Im vorliegenden System wurde die Größe der Ramdisk reichlich bemessen, um auch noch Systemerweiterungen vornehmen zu können.

  3. Im Gegensatz zu [1] scheint es dem Autor im Nachhinein günstiger, an dieser Stelle das neue System herunterzufahren und ein geeignetes Knoppix zu booten. Der Grund liegt darin, dass man sonst den aktiven Zustand des Systems auf die CF bannt. Dies bringt vor allem beim Hochfahren des Systems insbesondere beim mounten Probleme, da auf Grund der Einträge in der Datei /etc/mtab das System „meint“, dass die erforderlichen Disks und Partitionen schon gemounted seien. Nach erfolgreichem Start von Knoppix fährt man als Superuser fort (sudo su) und führt die nachfolgenden Schritte wie in [1] aus.

  4. Anlegen der Ramdisk

    Mit Hilfe des Systemkommandos dd wird zunächst eine Datei definierter Größe erzeugt, die später das Image aufnehmen wird.

dd if=/dev/zero of=/tmp/lite bs=1k count=250000

250000+0 Datensätze ein

250000+0 Datensätze aus

  1. Nun wird ein Filesystem in dieser Datei angelegt.

    mkfs -t ext2 -i 1024 -b 1024 -F /tmp/lite

  1. In der Datei /tmp/lite ist nun ein vollwertiges Filesystem eingerichtet, das gemountet werden kann. Hierzu ist zunächst ein mountpoint einzurichten

    mkdir /tmp/loop

    mount -o loop /tmp/lite /tmp/loop

  2. Nun werden die einzelnen Verzeichnisse in die künftige Ramdisk kopiert.

    cp -a /bin /tmp/loop

    cp -a /boot /tmp/loop

    cp -a /dev /tmp/loop

    cp -a /etc /tmp/loop

    cp -a /home /tmp/loop

    cp -a /lib /tmp/loop

    mkdit /tmp/loop/mnt

    mkdir /tmp/loop/proc

    cp -a /root /tmp/loop

    cp -a /sbin /tmp/loop

    cp -a /usr /tmp/loop

    cp -a /var /tmp/loop

Soll für /usr eine gesonderte Partition eingerichtet werden, so entfällt hier das entsprechende Kopierkommando bzw. ist zu auf das Ziel der dafür vorgesehenen Partition zu kopieren. Im Wurzelverzeichnis der Ramdisk ist mit mkdir usr der entsprechende Mountpoint einzurichten.

mount /dev/hdc2 /mnt

cp -a /usr/mnt

Im Zielsystem muss diese Partition dann auf /usr gemountet werden.

  1. Nun muss die Datei /etc/fstab angepasst werden. Sie hat im Flashdisksystem folgenden Aufbau:

    Rahmen1

  2. Nach [1] ist die Datei /etc/mtab zu löschen, im vorliegenden system wurde die /etc/mtab modifiziert.

/dev/ram0 / ext2 rw,errors=remount-ro,acl,user_xattr 0 0

devpts /dev/pts devpts rw 0 0





  1. Das Filesystem ist nun feriggestellt. Es kann nun komprimiert werden. Will man nachträglich am System noch Veränderungen vornehmen, so kann man auch aus das Komprimieren verzichten, was zu deutlich längeren Ladezeiten beim Hochfahren des Systems führt.

    Umount /tmp/loop

    gzip -c -9 /tmp/lite > tmp/lite.gz

  2. Nun ist der Bootloader zu installieren. Der Autor hat auf seinem System syslinux verwendet. Die Installation ist denkbar einfach. Das System wird mit Knoppix gebootet. Unter diesem System wird dann das Kommando

    syslinux /dev/hdc1

    ausgeführt. /dev/hdc1 ist dabei die CF-Card, die über einen geeigneten Adapter in das System integriert wurde.

    Bei Erfolg sollte die Datei ldlinux.sys im Wurzelverzeichnis der Partition zu sehen sein.

  3. Nun werden die restlichen Dateien auf die CF-Card übertragen. Dies kann sowohl unter

    Knoppix als auch unter dem auf die CF-Card zu übertragenden System erfolgen.

    1. mounten der CF_Card:

      mkdir /tmp/cf

      mount /dev/hdc /tmp/cf

  1. erstellen einer Datei syslinux.cfg im Wurzelverzeichnis der CF-Card

    DEFAULT Lite

    PROMPT 1

    IMPLICIT 0

    TIMEOUT 150


    LABEL Lite

    KERNEL vmlinuz

    APPEND initrd=lites ramdisk=256000 rw root=/dev/ram0

    3. kopieren des Kernels /boot/vmlinuz aus dem zu übetragenden System ebenfalls in das Wurzelverzeichnis der CF-Card

    4. übertragen des Ramdiskimages lite oder lite.gz auf die CF-Card.

    Die CF-Card hat nun den folgenden Inhalt:

ldlinux.sys lite.gz syslinux.cfg vmlinuz

  1. Schließlich wird mit fdisk für die Partition /dev/hdc1 das bootable-Flag gesetzt. Es ergibt sich die nachfolgende Partitiontabelle

    fdisk /dev/hdc



    Command (m for help): p



    Disk /dev/hdc: 64 heads, 63 sectors, 992 cylinders

    Units = cylinders of 4032 * 512 bytes



    Device Boot Start End Blocks Id System

    /dev/hdc1 * 1 407 820480+ b Win95 FAT32

    /dev/hdc2 408 668 526176 83 Linux

Nun wird es spannend,das System sollte bootfähig sein. Einbau der CF-Card in das Zielsystem als 1. Festplatte. Alle anderen Festplatten sollten entfernt werden.


Literatur:

[1] silent.guph.org