J'ai réussi à créer un petit CD Linux live entièrement fonctionnel qui ne contient que le noyau (compilé avec les options par défaut) et BusyBox (compilé avec les options par défaut + statique, toutes les applets présentes, y compris /sbin/init
). Je n'ai eu aucun problème à créer initrd
et à remplir /dev
, /proc
et /sys
je n'ai eu aucun problème avec mon /init
script shell.
Récemment, j'ai lu que BusyBox prend en charge les /etc/inittab
configurations (au moins à un certain niveau) et j'aimerais beaucoup faire l'une des choses suivantes:
- Oubliez mon
/init
script shell et comptez entièrement sur la/etc/inittab
configuration. - Utilisez à la fois le
/init
script shell et la/etc/inittab
configuration.
Maintenant, le problème réel - il semble que ce /etc/inittab
soit complètement ignoré lorsque ma distribution démarre. Les symptômes sont:
- Quand je retire
/init
et laisse seulement,/etc/inittab
je me retrouve avec la panique du noyau. Mon hypothèse est que le noyau ne s'exécute pas/sbin/init
du tout, ou qu'il/sbin/init
ne trouve pas (ou ne lit pas)/etc/inittab
. - J'ai lu que BusyBox devrait bien fonctionner même sans
/etc/inittab
. Donc, j'ai supprimé les deux/init
et/etc/inittab
et devinez quoi - la panique du noyau à nouveau. - J'ai essayé d'exécuter à
/sbin/init
partir de mon shell et après plusieurs suppositions qui comprenaientexec /sbin/init
,setsid /sbin/init
etexec setsid /sbin/init
je me suis retrouvé avec la panique du noyau. Avec et sans / etc / inittab présent sur le système de fichiers.
Voici le contenu de mon /init
script shell:
#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
setsid cttyhack /bin/sh
À ce stade, je me fiche du contenu du /etc/inittab
, tant que j'ai un moyen de savoir que la configuration y fonctionne réellement. J'ai essayé plusieurs /etc/inittab
configurations, toutes basées sur les informations que j'ai trouvées ici .
Au minimum, mon / etc / inittab ne contenait qu'une seule ligne:
::sysinit:/bin/sh
Encore une fois - je me suis retrouvé avec une panique du noyau et il semble que cela ait /etc/inittab
été ignoré.
Toutes les suggestions pour forcer ma petite distribution en direct à fonctionner correctement avec BusyBox /etc/inittab
sont très appréciées!
Mise à jour:
- Juste pour être clair - je n'ai pas de problèmes de panique du noyau avec mon
/init
script shell actuel avec et sans/etc/inittab
. Tout fonctionne bien, ma/bin/ash
console fonctionne très bien et je ne rencontre aucun problème inattendu. Le seul problème est qu'il/etc/inittab
est complètement ignoré, comme je l'ai décrit ci-dessus. - J'ai examiné 3 distributions Linux live différentes: Slax, Finnix et SysResCD. Tous l'ont fait
/init
et aucun ne l'a fait/etc/inittab
. De plus, cet article Wiki conclut ma suspicion qui/sbin/init
n'est pas du tout invoquée.
Réponses:
OK, j'ai fait beaucoup de recherches approfondies et j'ai découvert ce qui n'allait pas. Commençons un par un:
initramfs
le schéma de démarrage, le premier processus que le noyau invoque est le/init
script. Le noyau n'essaiera jamais de s'exécuter/sbin/init
directement./init
se voit attribuer l'identifiant de processus 1. C'est très important!/sbin/init
cela ne peut être démarré qu'en tant quePID 1
mais nous fonctionnons déjà en/init
tant que PID 1.exec /sbin/init
alors que nous sommes encore à l'intérieur/init
. De cette façon, le nouveau processus (qui est/sbin/init
) héritera du PID de son parent (/init
avec PID 1) et c'est tout ce que nous avons à faire.Le problème que j'ai rencontré avec ma configuration initiale (voir la question) est dû au fait que la dernière chose que mon
/init
script fait est de générer un nouveau/bin/sh
processus auquel est attribué un tout nouveau PID. À partir de là, il est impossible de s'exécuter/sbin/init
directement à partir de la console interactive, car même lorsque nous exécutons la ligne de commandeexec /sbin/init
, le mieux que nous obtenons est d'attribuer le même PID qui a déjà été attribué au shell et ce PID n'est certainement pas le PID 1.Pour faire court - exécutez la ligne de commande
exec /sbin/init
directement depuis/init
et c'est tout.la source