Ich habe es geschafft, eine kleine und voll funktionsfähige Live-Linux-CD zu erstellen, die nur Kernel (kompiliert mit Standardoptionen) und BusyBox (kompiliert mit Standardoptionen + statisch, alle vorhandenen Applets, einschließlich /sbin/init
) enthält. Ich hatte keine Probleme beim Erstellen initrd
und Auffüllen /dev
, /proc
und /sys
ich hatte auch überhaupt keine Probleme mit meinem /init
Shell-Skript.
Kürzlich habe ich gelesen, dass BusyBox /etc/inittab
Konfigurationen unterstützt (zumindest bis zu einem gewissen Grad), und ich würde sehr gerne eine der folgenden Aktionen ausführen :
- Vergessen Sie mein
/init
Shell-Skript und verlassen Sie sich ausschließlich auf die/etc/inittab
Konfiguration. - Verwenden Sie sowohl das
/init
Shell-Skript als auch die/etc/inittab
Konfiguration.
Nun das eigentliche Problem - es scheint, dass /etc/inittab
das völlig ignoriert wird, wenn meine Distribution hochfährt. Die Symptome sind:
- Wenn ich nur entferne
/init
und gehe, bekomme/etc/inittab
ich Kernel-Panik. Ich gehe davon aus, dass der Kernel überhaupt nicht ausgeführt/sbin/init
wird oder dass er/sbin/init
nicht findet (oder liest)/etc/inittab
. - Ich habe gelesen, dass BusyBox auch ohne funktionieren sollte
/etc/inittab
. Also entfernte ich beide/init
und/etc/inittab
und rate mal, was - Kernel-Panik wieder. - Ich habe versucht , die Ausführung
/sbin/init
von meiner Schale und nach einigen Vermutungen , die eingeschlossenexec /sbin/init
,setsid /sbin/init
undexec setsid /sbin/init
ich endete mit Kernel - Panik auf. Sowohl mit als auch ohne / etc / inittab im Dateisystem.
Hier ist der Inhalt meines /init
Shell-Skripts:
#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
setsid cttyhack /bin/sh
An dieser Stelle ist es mir egal, wie der Inhalt von aussehen /etc/inittab
würde, solange ich eine Möglichkeit habe zu wissen, dass die Konfiguration dort tatsächlich funktioniert. Ich habe verschiedene /etc/inittab
Konfigurationen ausprobiert , die alle auf den Informationen basieren, die ich hier gefunden habe .
Als Minimum enthielt mein / etc / inittab nur diese eine Zeile:
::sysinit:/bin/sh
Wieder - ich hatte Kernel-Panik und es scheint, dass dies /etc/inittab
ignoriert wurde.
Vorschläge, wie ich meine kleine Live-Distribution dazu zwingen kann, gut mit BusyBox zu arbeiten, /etc/inittab
werden sehr geschätzt!
Aktualisieren:
- Nur um es klar zu machen: Ich habe keine Probleme mit der Kernel-Panik mit meinem aktuellen
/init
Shell-Skript, sowohl mit als auch ohne/etc/inittab
. Es funktioniert alles gut, meine/bin/ash
Konsole funktioniert hervorragend und ich habe keine unerwarteten Probleme. Das einzige Problem ist, dass/etc/inittab
es vollständig ignoriert wird, wie ich oben beschrieben habe. - Ich habe 3 verschiedene Live-Linux-Distributionen untersucht: Slax, Finnix und SysResCD. Alle von ihnen haben
/init
und keiner von ihnen hat/etc/inittab
. Außerdem schließt dieser Wiki-Artikel meinen Verdacht, der überhaupt/sbin/init
nicht geltend gemacht wird.
Antworten:
OK, ich habe viel recherchiert und herausgefunden, was los ist. Beginnen wir eins nach dem anderen:
initramfs
Boot-Schema verwenden, ist der erste Prozess, den der Kernel aufruft, das/init
Skript. Der Kernel wird niemals versuchen,/sbin/init
direkt auszuführen ./init
wird Prozesskennung 1 zugewiesen. Dies ist sehr wichtig!/sbin/init
nur als gestartet werden kann,PID 1
aber wir laufen bereits/init
als PID 1.exec /sbin/init
während wir uns noch im Inneren befinden/init
. Auf diese Weise/sbin/init
erbt der neue Prozess ( dh) die PID von seiner übergeordneten (/init
mit PID 1) und das ist alles, was wir tun müssen.Das Problem, das ich bei meiner Erstkonfiguration hatte (siehe Frage), war auf die Tatsache zurückzuführen, dass mein
/init
Skript als letztes einen neuen/bin/sh
Prozess erzeugt, dem eine brandneue PID zugewiesen wurde. Ab diesem Zeitpunkt ist es nicht mehr möglich,/sbin/init
direkt von der interaktiven Konsole aus zu arbeiten, da wir selbst bei Ausführung der Befehlszeileexec /sbin/init
am besten dieselbe PID zuweisen, die bereits der Shell zugewiesen wurde, und diese PID definitiv nicht PID 1 ist.Lange Rede, kurzer Sinn - führen Sie die Befehlszeile
exec /sbin/init
direkt aus/init
und das ist alles.quelle