Das hängt ganz davon ab, welche Dienste Sie auf Ihrem Gerät haben möchten.
Programme
Sie können Linux direkt in eine Shell booten lassen . In der Produktion ist es nicht sehr nützlich - wer möchte nur eine Shell haben -, aber es ist nützlich als Interventionsmechanismus, wenn Sie einen interaktiven Bootloader haben: Übergeben Sie ihn init=/bin/sh
an die Kernel-Befehlszeile. Alle Linux-Systeme (und alle Unix-Systeme) haben eine Bourne / POSIX-ähnliche Shell /bin/sh
.
Sie benötigen eine Reihe von Shell-Dienstprogrammen . BusyBox ist eine sehr häufige Wahl; es enthält eine Shell und gemeinsamen Dienstprogramme für die Datei- und Textmanipulation ( cp
, grep
, ...), Netzwerk - Setup ( ping
, ifconfig
, ...), Prozessmanipulation ( ps
, nice
, ...) und verschiedene andere Systemtools ( fdisk
, mount
, syslogd
, ...). BusyBox ist äußerst konfigurierbar: Sie können auswählen, welche Tools Sie möchten, und sogar einzelne Funktionen zum Zeitpunkt der Kompilierung auswählen, um den richtigen Kompromiss zwischen Größe und Funktionalität für Ihre Anwendung zu erzielen. Neben sh
dem bloße Minimum , dass Sie nicht wirklich etwas tun können , ohne ist mount
, umount
und halt
, aber es wäre untypisch nicht auch haben cat
, cp
, mv
, rm
,mkdir
, rmdir
, ps
, sync
Und ein paar mehr. BusyBox wird als einzelne Binärdatei busybox
mit einem symbolischen Link für jedes Dienstprogramm installiert .
Der erste Prozess auf einem normalen Unix-System wird aufgerufen init
. Seine Aufgabe ist es, andere Dienste zu starten. BusyBox enthält ein Init-System. Zusätzlich zu der init
Binärdatei (in der Regel in /sbin
) benötigen Sie die Konfigurationsdateien (in der Regel als /etc/inittab
- einige moderne Init-Ersetzungen beseitigen diese Datei, aber Sie werden sie nicht auf einem kleinen eingebetteten System finden), die angeben, welche Dienste gestartet werden sollen und wann. Bei BusyBox /etc/inittab
ist dies optional. Wenn es fehlt, erhalten Sie eine Root-Shell auf der Konsole und das Skript /etc/init.d/rcS
(Standardverzeichnis) wird beim Booten ausgeführt.
Das ist alles, was Sie brauchen, abgesehen von den Programmen, die Ihr Gerät zu etwas Nützlichem machen. Auf meinem Heimrouter, auf dem eine OpenWrt- Variante ausgeführt wird, sind die einzigen Programme BusyBox nvram
(zum Lesen und Ändern von Einstellungen im NVRAM) und Netzwerkdienstprogramme.
Sofern nicht alle Ihre ausführbaren Dateien statisch verknüpft sind, benötigen Sie den Dynamic Loader ( ld.so
der abhängig von der Wahl von libc und den Prozessorarchitekturen unter verschiedenen Namen aufgerufen werden kann) und alle dynamischen Bibliotheken ( /lib/lib*.so
möglicherweise einige davon in /usr/lib
), die von benötigt werden diese ausführbaren Dateien.
Verzeichnisaufbau
Der Filesystem Hierarchy Standard beschreibt die allgemeine Verzeichnisstruktur von Linux-Systemen. Es richtet sich an Desktop- und Serverinstallationen: Viele davon können auf einem eingebetteten System weggelassen werden. Hier ist ein typisches Minimum.
/bin
: ausführbare Programme (einige können /usr/bin
stattdessen in sein).
/dev
: Geräteknoten (siehe unten)
/etc
: Konfigurationsdateien
/lib
: gemeinsam genutzte Bibliotheken, einschließlich des Dynamic Loader (sofern nicht alle ausführbaren Dateien statisch verknüpft sind)
/proc
: Einhängepunkt für das proc-Dateisystem
/sbin
: ausführbare Programme. Die Unterscheidung mit /bin
ist /sbin
für Programme, die nur für den Systemadministrator nützlich sind, aber diese Unterscheidung ist auf eingebetteten Geräten nicht sinnvoll. Sie können /sbin
einen symbolischen Link zu erstellen /bin
.
/mnt
: Praktisch, um schreibgeschützte Root-Dateisysteme als Scratch-Mount-Punkt während der Wartung zu verwenden
/sys
: Einhängepunkt für das sysfs-Dateisystem
/tmp
: Speicherort für temporäre Dateien (oft ein tmpfs
Mount)
/usr
: Enthält Unterordner bin
, lib
und sbin
. /usr
existiert für zusätzliche Dateien, die sich nicht im Root-Dateisystem befinden. Wenn Sie das nicht haben, können Sie /usr
einen symbolischen Link zum Stammverzeichnis erstellen.
Gerätedateien
Hier sind einige typische Einträge in einem Minimum /dev
:
console
full
(Beim Schreiben wird immer "kein Platz mehr auf dem Gerät" gemeldet.)
log
(Ein Socket, über den Programme Protokolleinträge senden), wenn ein syslogd
Daemon (z. B. BusyBox) davon liest
null
(verhält sich wie eine Datei, die immer leer ist)
ptmx
und ein pts
Verzeichnis , wenn Sie Pseudo-Terminals verwenden möchten (dh ein anderes Terminal als die Konsole) - z. B. wenn das Gerät vernetzt ist und Sie telnet- oder ssh-in möchten
random
(liefert zufällige Bytes, riskiert das Blockieren)
tty
(bezeichnet immer das Terminal des Programms)
urandom
(Gibt zufällige Bytes zurück, blockiert niemals, kann aber auf einem frisch gebooteten Gerät nicht zufällig sein.)
zero
(enthält eine unendliche Folge von Null-Bytes)
Darüber hinaus benötigen Sie Einträge für Ihre Hardware (mit Ausnahme der Netzwerkschnittstellen, in die keine Einträge eingehen /dev
): serielle Anschlüsse, Speicher usw.
Bei eingebetteten Geräten erstellen Sie die Geräteeinträge normalerweise direkt im Root-Dateisystem. High-End-Systeme verfügen über ein Skript MAKEDEV
zum Erstellen von /dev
Einträgen. Auf einem eingebetteten System ist das Skript jedoch häufig nicht im Image enthalten. Wenn eine Hardware per Hotplug angeschlossen werden kann (z. B. wenn das Gerät über einen USB-Host-Port verfügt), /dev
sollte dies von udev verwaltet werden (möglicherweise ist im Root-Dateisystem noch ein Mindestsatz festgelegt).
Boot-Time-Aktionen
Über das Root-Dateisystem hinaus müssen Sie für den normalen Betrieb einige weitere bereitstellen:
- procfs on
/proc
(so ziemlich unverzichtbar)
- Sysfs auf
/sys
(so ziemlich unverzichtbar)
tmpfs
Dateisystem ein /tmp
(damit Programme temporäre Dateien erstellen können, die sich im RAM befinden, und nicht im Root-Dateisystem, das sich möglicherweise in Flash oder schreibgeschützt befindet)
- tmpfs, devfs oder devtmpfs on
/dev
if dynamic (siehe udev in " Gerätedateien " oben)
- devpts on,
/dev/pts
wenn Sie [Pseudo-Terminals verwenden möchten (siehe Bemerkung pts
oben)
Sie können eine /etc/fstab
Datei erstellen und aufrufen mount -a
oder mount
manuell ausführen .
Starten Sie einen Syslog- Daemon (sowie klogd
für Kernel-Protokolle, wenn das syslogd
Programm sich nicht darum kümmert), wenn Sie einen Platz zum Schreiben von Protokollen haben.
Danach ist das Gerät bereit, anwendungsspezifische Dienste zu starten.
So erstellen Sie ein Root-Dateisystem
Dies ist eine lange und abwechslungsreiche Geschichte. Alles, was ich hier tun werde, ist ein paar Hinweise zu geben.
Das Root-Dateisystem kann im RAM (geladen von einem (normalerweise komprimierten) Image in ROM oder Flash) oder auf einem festplattenbasierten Dateisystem (gespeichert in ROM oder Flash) oder gegebenenfalls vom Netzwerk (häufig über TFTP ) geladen werden . Wenn sich das Root-Dateisystem im RAM befindet, machen Sie es zum initramfs - einem RAM-Dateisystem, dessen Inhalt beim Booten erstellt wird.
Es gibt viele Frameworks zum Zusammenstellen von Root-Images für eingebettete Systeme. In den BusyBox-FAQ gibt es einige Hinweise . Buildroot ist ein beliebtes Tool , mit dem Sie ein vollständiges Root-Image mit einem ähnlichen Setup wie der Linux-Kernel und die BusyBox erstellen können. OpenEmbedded ist ein weiteres solches Framework.
Wikipedia hat eine (unvollständige) Liste der gängigen Embedded Linux-Distributionen . Ein Beispiel für Embedded Linux in Ihrer Nähe ist die OpenWrt- Betriebssystemfamilie für Netzwerkgeräte (beliebt bei Heimroutern von Bastlern). Wenn Sie aus Erfahrung lernen möchten, können Sie Linux von Grund auf ausprobieren. Es richtet sich jedoch eher an Desktopsysteme für Bastler als an eingebettete Geräte.
Ein Hinweis zu Linux vs. Linux-Kernel
Das einzige Verhalten, das in den Linux-Kernel eingearbeitet ist, ist das erste Programm, das beim Booten gestartet wird. (Ich werde hier nicht auf die Feinheiten von initrd und initramfs eingehen.) Dieses Programm, das traditionell als init bezeichnet wird , hat die Prozess-ID 1 und verfügt über bestimmte Berechtigungen (Immunität gegen KILL-Signale ) und Verantwortlichkeiten (ernten von Waisen ). Sie können ein System mit einem Linux-Kernel ausführen und als ersten Prozess das starten, was Sie möchten. Dann haben Sie jedoch ein Betriebssystem, das auf dem Linux-Kernel basiert, und nicht das, was normalerweise als „Linux“ - Linux im allgemeinen Sinne - bezeichnet wird Der Begriff ist ein Unix- ähnliches Betriebssystem, dessen Kernel der Linux-Kernel ist. Beispielsweise ist Android ein Betriebssystem, das nicht wie Unix ist, sondern auf dem Linux-Kernel basiert.