Cela dépend entièrement des services que vous souhaitez avoir sur votre appareil.
Programmes
Vous pouvez faire démarrer Linux directement dans un shell . Ce n'est pas très utile en production - qui voudrait juste avoir un shell assis là - mais c'est utile comme mécanisme d'intervention lorsque vous avez un chargeur de démarrage interactif: passez init=/bin/sh
à la ligne de commande du noyau. Tous les systèmes Linux (et tous les systèmes Unix) ont un shell de style Bourne / POSIX /bin/sh
.
Vous aurez besoin d'un ensemble d' utilitaires shell . BusyBox est un choix très courant; il contient un shell et des utilitaires communs pour la manipulation de fichiers et le texte ( cp
, grep
, ...), la configuration du réseau ( ping
, ifconfig
, ...), la manipulation des processus ( ps
, nice
, ...), et divers autres outils système ( fdisk
, mount
, syslogd
, ...). BusyBox est extrêmement configurable: vous pouvez sélectionner les outils que vous souhaitez et même les fonctionnalités individuelles au moment de la compilation, pour obtenir le bon compromis taille / fonctionnalité pour votre application. Mis à part sh
, le strict minimum que vous ne pouvez pas vraiment faire quoi que ce soit sans est mount
, umount
et halt
, mais ce serait atypique de ne pas avoir aussi cat
, cp
, mv
, rm
,mkdir
, rmdir
, ps
, sync
Et quelques autres. BusyBox s'installe comme un seul binaire appelé busybox
, avec un lien symbolique pour chaque utilitaire.
Le premier processus sur un système Unix normal est appelé init
. Son travail consiste à démarrer d'autres services. BusyBox contient un système d'initialisation. En plus du init
binaire (généralement situé dans /sbin
), vous aurez besoin de ses fichiers de configuration (généralement appelés /etc/inittab
- certains remplacements d'init modernes suppriment ce fichier mais vous ne les trouverez pas sur un petit système intégré) qui indiquent les services à démarrer et quand. Pour BusyBox, /etc/inittab
est facultatif; s'il est manquant, vous obtenez un shell racine sur la console et le script /etc/init.d/rcS
(emplacement par défaut) est exécuté au démarrage.
C'est tout ce dont vous avez besoin, au-delà bien sûr des programmes qui font que votre appareil fait quelque chose d'utile. Par exemple, sur mon routeur domestique exécutant une variante OpenWrt , les seuls programmes sont BusyBox nvram
(pour lire et modifier les paramètres dans NVRAM) et les utilitaires de mise en réseau.
À moins que tous vos exécutables ne soient liés statiquement, vous aurez besoin du chargeur dynamique ( ld.so
, qui peut être appelé par des noms différents selon le choix de libc et des architectures de processeur) et de toutes les bibliothèques dynamiques ( /lib/lib*.so
, peut-être certaines d'entre elles /usr/lib
) requises par ces exécutables.
Structure du répertoire
La norme de hiérarchie du système de fichiers décrit la structure de répertoires commune des systèmes Linux. Il est orienté vers les installations de postes de travail et de serveurs: une grande partie peut être omise sur un système embarqué. Voici un minimum typique.
/bin
: programmes exécutables (certains peuvent être à la /usr/bin
place).
/dev
: nœuds de périphérique (voir ci-dessous)
/etc
: fichiers de configuration
/lib
: bibliothèques partagées, y compris le chargeur dynamique (sauf si tous les exécutables sont liés statiquement)
/proc
: point de montage pour le système de fichiers proc
/sbin
: programmes exécutables. La distinction avec /bin
est /sbin
pour les programmes qui ne sont utiles qu'à l'administrateur système, mais cette distinction n'a pas de sens sur les périphériques intégrés. Vous pouvez créer /sbin
un lien symbolique vers /bin
.
/mnt
: pratique à avoir sur les systèmes de fichiers racine en lecture seule comme point de montage scratch pendant la maintenance
/sys
: point de montage pour le système de fichiers sysfs
/tmp
: emplacement pour les fichiers temporaires (souvent un tmpfs
montage)
/usr
: contient des sous bin
- répertoires lib
et sbin
. /usr
existe pour les fichiers supplémentaires qui ne sont pas sur le système de fichiers racine. Si vous n'en avez pas, vous pouvez créer /usr
un lien symbolique vers le répertoire racine.
Fichiers de périphérique
Voici quelques entrées typiques dans un minimum /dev
:
console
full
(y écrire signale toujours «plus d'espace sur l'appareil»)
log
(un socket que les programmes utilisent pour envoyer des entrées de journal), si vous avez un syslogd
démon (tel que BusyBox) qui le lit
null
(agit comme un fichier toujours vide)
ptmx
et un pts
répertoire , si vous souhaitez utiliser des pseudo-terminaux (c'est -à- dire tout terminal autre que la console) - par exemple, si le périphérique est en réseau et que vous souhaitez telnet ou ssh dans
random
(retourne des octets aléatoires, risque de blocage)
tty
(désigne toujours le terminal du programme)
urandom
(retourne des octets aléatoires, ne bloque jamais mais peut être non aléatoire sur un appareil fraîchement démarré)
zero
(contient une séquence infinie d'octets nuls)
Au-delà, vous aurez besoin d'entrées pour votre matériel (à l'exception des interfaces réseau, celles-ci ne sont pas entrées /dev
): ports série, stockage, etc.
Pour les périphériques intégrés, vous devez normalement créer les entrées de périphérique directement sur le système de fichiers racine. Les systèmes haut de gamme ont un script appelé MAKEDEV
pour créer des /dev
entrées, mais sur un système intégré, le script n'est souvent pas intégré à l'image. Si certains matériels peuvent être branchés à chaud (par exemple si le périphérique a un port hôte USB), alors ils /dev
devraient être gérés par udev (vous pouvez toujours avoir un ensemble minimal sur le système de fichiers racine).
Actions au démarrage
Au-delà du système de fichiers racine, vous devez en monter quelques autres pour un fonctionnement normal:
- procfs on
/proc
(assez indispensable)
- sysfs sur
/sys
(à peu près indispensable)
tmpfs
système de fichiers activé /tmp
(pour permettre aux programmes de créer des fichiers temporaires qui seront en RAM, plutôt que sur le système de fichiers racine qui peut être en flash ou en lecture seule)
- tmpfs, devfs ou devtmpfs sur
/dev
si dynamique (voir udev dans «Fichiers de périphérique» ci-dessus)
- devpts sur
/dev/pts
si vous voulez utiliser [pseudo-terminaux (voir la remarque au sujet pts
ci - dessus)
Vous pouvez créer un /etc/fstab
fichier et appeler mount -a
ou exécuter mount
manuellement.
Démarrez un démon syslog (ainsi que klogd
pour les journaux du noyau, si le syslogd
programme ne s'en occupe pas), si vous avez un endroit où écrire des journaux.
Après cela, l'appareil est prêt à démarrer des services spécifiques à l'application.
Comment créer un système de fichiers racine
C'est une histoire longue et diversifiée, donc tout ce que je vais faire ici est de donner quelques conseils.
Le système de fichiers racine peut être conservé dans la RAM (chargé à partir d'une image (généralement compressée) dans la ROM ou le flash), ou sur un système de fichiers sur disque (stocké dans la ROM ou le flash), ou chargé à partir du réseau (souvent via TFTP ) le cas échéant . Si le système de fichiers racine est en RAM, faites-en l' initramfs - un système de fichiers RAM dont le contenu est créé au démarrage.
Il existe de nombreux frameworks pour assembler des images racine pour les systèmes embarqués. Il y a quelques pointeurs dans la FAQ BusyBox . Buildroot est populaire, vous permettant de construire une image racine entière avec une configuration similaire au noyau Linux et BusyBox. OpenEmbedded est un autre tel cadre.
Wikipedia a une liste (incomplète) de distributions Linux embarquées populaires . Un exemple de Linux embarqué que vous pouvez avoir près de chez vous est la famille de systèmes d'exploitation OpenWrt pour les appliances réseau (populaire sur les routeurs domestiques des bricoleurs). Si vous voulez apprendre par expérience, vous pouvez essayer Linux from Scratch , mais il est orienté vers les systèmes de bureau pour les amateurs plutôt que vers les appareils intégrés.
Une note sur Linux vs noyau Linux
Le seul comportement intégré au noyau Linux est le premier programme lancé au démarrage. (Je n'entrerai pas dans les subtilités initrd et initramfs ici.) Ce programme, traditionnellement appelé init , a l'ID de processus 1 et a certains privilèges (immunité aux signaux KILL ) et responsabilités (récolter des orphelins ). Vous pouvez exécuter un système avec un noyau Linux et démarrer tout ce que vous voulez comme premier processus, mais ce que vous avez est un système d'exploitation basé sur le noyau Linux, et non pas ce qui est normalement appelé «Linux» - Linux , dans le sens commun du terme, est un système d' exploitation de type Unix dont le noyau est le noyau Linux. Par exemple, Android est un système d'exploitation qui n'est pas de type Unix mais basé sur le noyau Linux.