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:
- 0: halt
- S: single-user
- 1: multi-user ohne Netzwerk
- 2: multi-user mit Netzwerk
- 3: multi-user mit Netzwerk und xdm (grafischer Login)
- 6: reboot
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:
- Init ersetzen. Es werden keine Deamons gestartet. Das Programm hat root-Rechte.
- Programm in der inittab eintragen, ggf. mit der
respawn
Option.
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 ]