Minimales Linux mit Kernel und BusyBox: / etc / inittab wird ignoriert, nur / init wird ausgeführt

12

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 initrdund Auffüllen /dev, /procund /sysich hatte auch überhaupt keine Probleme mit meinem /initShell-Skript.

Kürzlich habe ich gelesen, dass BusyBox /etc/inittabKonfigurationen unterstützt (zumindest bis zu einem gewissen Grad), und ich würde sehr gerne eine der folgenden Aktionen ausführen :

  • Vergessen Sie mein /initShell-Skript und verlassen Sie sich ausschließlich auf die /etc/inittabKonfiguration.
  • Verwenden Sie sowohl das /initShell-Skript als auch die /etc/inittabKonfiguration.

Nun das eigentliche Problem - es scheint, dass /etc/inittabdas völlig ignoriert wird, wenn meine Distribution hochfährt. Die Symptome sind:

  • Wenn ich nur entferne /initund gehe, bekomme /etc/inittabich Kernel-Panik. Ich gehe davon aus, dass der Kernel überhaupt nicht ausgeführt /sbin/initwird oder dass er /sbin/initnicht findet (oder liest) /etc/inittab.
  • Ich habe gelesen, dass BusyBox auch ohne funktionieren sollte /etc/inittab. Also entfernte ich beide /initund /etc/inittabund rate mal, was - Kernel-Panik wieder.
  • Ich habe versucht , die Ausführung /sbin/initvon meiner Schale und nach einigen Vermutungen , die eingeschlossen exec /sbin/init, setsid /sbin/initund exec setsid /sbin/initich endete mit Kernel - Panik auf. Sowohl mit als auch ohne / etc / inittab im Dateisystem.

Hier ist der Inhalt meines /initShell-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/inittabwürde, solange ich eine Möglichkeit habe zu wissen, dass die Konfiguration dort tatsächlich funktioniert. Ich habe verschiedene /etc/inittabKonfigurationen 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/inittabignoriert wurde.

Vorschläge, wie ich meine kleine Live-Distribution dazu zwingen kann, gut mit BusyBox zu arbeiten, /etc/inittabwerden sehr geschätzt!

Aktualisieren:

  • Nur um es klar zu machen: Ich habe keine Probleme mit der Kernel-Panik mit meinem aktuellen /initShell-Skript, sowohl mit als auch ohne /etc/inittab. Es funktioniert alles gut, meine /bin/ashKonsole funktioniert hervorragend und ich habe keine unerwarteten Probleme. Das einzige Problem ist, dass /etc/inittabes 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 /initund keiner von ihnen hat /etc/inittab. Außerdem schließt dieser Wiki-Artikel meinen Verdacht, der überhaupt /sbin/initnicht geltend gemacht wird.
Ivan Davidov
quelle
Wenn Sie hierher gekommen sind, werfen Sie einen Blick auf Minimal Linux Live, das zu tun scheint, was es will und einfach funktioniert: github.com/ivandavidov/minimal
Ciro Santilli 21 改造 中心 法轮功 六四
Ah, das OP hat Minimal Linux Live! Mann du rockst.
Ciro Santilli 21 改造 中心 法轮功 六四

Antworten:

11

OK, ich habe viel recherchiert und herausgefunden, was los ist. Beginnen wir eins nach dem anderen:

  • Wenn wir das initramfsBoot-Schema verwenden, ist der erste Prozess, den der Kernel aufruft, das /initSkript. Der Kernel wird niemals versuchen, /sbin/initdirekt auszuführen .
  • /init wird Prozesskennung 1 zugewiesen. Dies ist sehr wichtig!
  • Das Problem ist jetzt, dass /sbin/initnur als gestartet werden kann, PID 1aber wir laufen bereits /initals PID 1.
  • Die Lösung besteht darin, die Befehlszeile auszuführen, exec /sbin/initwährend wir uns noch im Inneren befinden /init. Auf diese Weise /sbin/initerbt der neue Prozess ( dh) die PID von seiner übergeordneten ( /initmit 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 /initSkript als letztes einen neuen /bin/shProzess erzeugt, dem eine brandneue PID zugewiesen wurde. Ab diesem Zeitpunkt ist es nicht mehr möglich, /sbin/initdirekt von der interaktiven Konsole aus zu arbeiten, da wir selbst bei Ausführung der Befehlszeile exec /sbin/initam 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/initdirekt aus /initund das ist alles.

Ivan Davidov
quelle