Aufbau eines Embedded Linux Systems


[ Seminar Linux und Apache ] [ Inhalt ] [ Embedded Linux ] [ System ]

Übersicht: Aufbau eines Embedded Linux Systems


Startkonzepte

Beim Startvorgang muss der Kernel geladen, entpackt und gestartet werden. Bei der x86 Architektur läuft das folgendermaßen ab: Der BIOS (Basic Input Output System) Interrupt 0x19 lädt den ersten Sektor des Bootmediums, welcher den MBR (Master Boot Record) enthält. Im Falle von Linux liegt dort in der Regel LILO (Linux Loader). Zunächst wird der First Stage Loader geladen, der dann des Second Stage Loader lädt. Es kann nur von Medien gebootet werden, die vom BIOS unterstützt werden.
Während des Bootvorganges gibt der Kernel Meldungen auf der Konsole aus. Welches Gerät das ist, kann am LILO Bootprompt angegeben werden:

console=device,options (Beispiel für erste serielle Schnittstelle: console=/dev/ttyS0).

Der Kernel sucht zunächst nach einer VGA-Karte und dann nach einer seriellen Schnittstelle, so dass obige Angabe meist entfallen kann. Bei Embedded Systemen kann also der Boot-Vorgang auch verfolgt werden, wenn das Gerät kein Display besitzt. Nach dem Boot-Vorgang startet der Kernel ein Programm. Welches das ist, kann am Bootprompt festgelegt werden:

init=myinitprog

Ansonsten ist die Suchreihenfolge nach dem Startprogramm wie folgt:

/sbin/init, /etc/init, /bin/init, /bin/sh

Normalerweise wird der Init-Prozess gestartet, welcher wiederum systemnahe Dienste, die Deamons, startet. Diese stellen Funktionen wie Logins und Netzwerkdienste bereit. Konfiguriert wird Init in der /etc/inittab. Dort wird festgelegt, welche Dienste gestartet werden. Es werden verschiedene Runlevel vorgesehen, bei denen verschiedene Dienste gestartet werden.
Der Standard für die Runlevel sieht wie folgt aus: Der Standard ist jedoch nicht zwingend.

Üblicherweise werden in der Inittab getty (get tty (tty<=>Teletype device, ehemals Hersteller von Unix Terminals)) Programme gestartet, welche auf Verbindungen warten und Logins bereitstellen. Hier kann das Programm mgetty eingetragen werden, welches den Login von außen, z.B. über eine Modemleitung, ermöglicht. In der inittab wird auch festgelegt, wie sich das System bei Stromausfällen verhalten soll (dafür ist eine USV erforderlich).
Eine weitere interessante Möglichkeit von Init ist die Option respawn: Über sie kann festgelegt werden, dass ein Programm, welches sich beendet, sofort erneut gestartet werden soll.


Starten von Programmen

Zum automatischen Starten von Programmen beim Systemstart gibt es folgende Möglichkeiten: Außerdem hilfreich ist sudo. Mit diesem Programm können Programme unter einem bestimmten Benutzeraccount ausgeführt werden. sudo funktioniert allerdings nicht mit uClibc (siehe unten).


Entwicklungsumgebung

Nachfolgend soll eine beispielhafte Entwicklungskonfiguration beschrieben werden, wie sie in [1] dargestellt ist: Anstelle des Zielsystems kann ein PC mit Grafikkarte, Monitor und ggf. Tastatur verwendet werden. Auf so einem Rechner ist die Entwicklung einfacher, da Programmausgaben beobachtet werden können und über die Tastatur Einfluss auf den Programmablauf genommen werden kann. Der Testrechner mountet sein Dateisystem über NFS vom Entwicklungsrechner. Es wird lediglich ein Bootfähiger Kernel benötigt, der dann das Dateisystem mountet. Dieser Kernel kann von Diskette geladen werden, so dass die Festplatte des Testsystems unberührt bleibt. Zum erstellen einer Bootdiskette kann syslinux [5] verwendet werden.
Es wird ein Kernel benötigt, bei dem NFS Unterstützung und Root-over-NFS enthalten sind. Auf dem Entwicklungsrechner muss ein bootp-Server laufen. Dieser erhält vom Client eine Broadcast-Anfrage über Ethernet und antwortet mit den relevanten Informationen wie der zu verwendenden IP Adresse.
bootp muss in /etc/inetd.conf eingetragen sein. inetd startet den Deamon dann bei Bedarf. Die Konfiguration erfolgt in /etc/bootptab. Zur Konfiguration wird die MAC-Adresse des Clients benötigt, welche sich nach dem ersten (fehlgeschlagenen) Verbindungsaufbau in /var/log/messages wiederfindet. Der NFS-Server läßt sich konfigurieren in der Datei /etc/exports.

Das Debugging von Embedded Anwendungen kann besondere Verfahren erfordern, wenn dem Gerät Ein- oder Ausgabemöglichkeiten fehlen. Ein Möglichkeit ist, Meldungen per printf auszugeben und über Telnet zu kontrollieren: Wenn ein Prozess über Telnet gestartet wird, werden die Ausgaben übertragen. Eine andere Möglichkeit ist der Einsatz von gdbserver: Aus dem Client wird das Programm mit

gdbserver 192.168.0.1:2222 ./MeinProgram

gestartet. Auf dem Server startet man gdb und gibt das Kommando target remote 192.168.0.126:2222 ein (IP Adressen und der Programmname müssen natürlich an die Situation angepasst werden).


[ Seminar Linux und Apache ] [ Inhalt ] [ Embedded Linux ] [ Nach oben ] [ System ]