Was würde passieren, wenn init gelöscht würde?

22

Nur eine theoretische Frage ...

Aber was würde passieren, wenn init(in /sbin/init) entfernt würde?

Kaz Wolfe
quelle
Versuchen -LSie es nicht in - es wird nicht funktionieren. cp /proc/fd/1/exe /sbin/init && chmod 755 /sbin/initfunktioniert aber. Das Verwenden von APT zum erneuten Installieren von Upstart ist nicht so offensichtlich wie dpkg, da es nicht weiß, dass es standardmäßig weg ist. "Paket-Upstart ist bereits in der aktuellen Version." Du könntest dpkg --force-depends --force-remove-essential -r upstartzuerst.
Joshua
1
apt-get install --reinstall upstart. Außerdem habe ich kein /proc/fdVerzeichnis. Und ich habe gerade nachgesehen, ln -L /proc/1/exe /tmp/initarbeitet mit /sbin/initumbenannt /sbin/init.bak, dh ich kann danach problemlos lesen /tmp/init.
Ruslan
@muru OK. Ich werde dann ein Tag-Synonym hinzufügen.
Kaz Wolfe

Antworten:

31

Der Bootloader lädt den Kernel, der Kernel würde versuchen, init auszuführen, findet ihn aber nicht und gerät in Panik.

Der Ausweg besteht darin, neu zu starten, die Startparameter zu bearbeiten, hinzuzufügen init=/bin/bashund auf diese Weise zu starten. Der Kernel benutzt bash als Init. Auf diese Weise können Sie Befehle ausführen und das System reparieren.

Korrektur
Anscheinend macht der Kernel (Datei init / main.c ):

if (!try_to_run_init_process("/sbin/init") ||
    !try_to_run_init_process("/etc/init") ||
    !try_to_run_init_process("/bin/init") ||
    !try_to_run_init_process("/bin/sh"))
        return 0;

panic("No working init found.  Try passing init= option to kernel. "
      "See Linux Documentation/init.txt for guidance.");

Es würde also / bin / sh finden (ein Link zum Bindestrich) und dies gibt Ihnen eine Shell und die Möglichkeit, das Problem zu beheben, ohne den init=/bin/bashBoot-Parameter zu verwenden.

sмurf
quelle
Gute Antwort. Wusste nicht, dass der Kernel nach mehr als etwas sucht /sbin/init.
Ruslan
Und wenn es keine /bin/shDatei gibt? Oder /bin/bashoder /bin/dashetc? Sie sind sich nicht sicher, wie Sie all diese Elemente gleichzeitig löschen können, aber was würde theoretisch passieren?
Trysis
Nun, dann würden Sie die Kernel-Panik sehen, den Teil der Antwort über der Korrekturzeile . Tun Sie dies jedoch nicht auf einem System, das Sie benötigen. Ernsthaft nicht. Wenn Sie experimentieren möchten (und dies ist eine gute Übung), erstellen Sie eine Virtualbox-VM, brechen Sie sie ab und versuchen Sie, sie zu reparieren. Übrigens ist die Antwort von 200_success auch nicht schlecht.
Surf
12

Nichts passiert, bis Sie versuchen, neu zu starten. Solange das System ausgeführt wird und Sie nicht versuchen, die Runlevel zu wechseln, indem Sie /sbin/init n ausführen , werden Sie nicht einmal bemerken , dass es nicht mehr vorhanden ist.

Tatsächlich ist das Löschen von /sbin/initrückgängig zu machen, wenn Sie den Fehler frühzeitig bemerken und ruhig bleiben. Systemadministratoren haben sich von viel schlimmeren "Lobotomien" erholt, während das Betriebssystem weiterhin ausgeführt wird.

Eine Möglichkeit zur Wiederherstellung nach dem Löschen von /sbin/initbesteht darin, das upstartPaket mithilfe von APT erneut zu installieren .

Die Macho-Methode zum Wiederherstellen besteht darin, nur die Ressourcen auf der Maschine selbst zu verwenden. Ein Faktor zu Ihren Gunsten ist, dass /sbin/initimmer läuft. Daher ist rm /sbin/initdie Datei beim Ausführen lediglich nicht mit dem Dateisystem verknüpft. Der Inhalt des Inodes und der Datei verbleibt auf der Festplatte und im Speicher, bis PID 1 beendet wird. Sie müssen lediglich /sbin/initvon der entsprechenden Inode neu erstellen .

Der einfachste Weg , dies zu erreichen, ist:

# cp /proc/1/exe /sbin/init
# chmod 755 /sbin/init
200_erfolg
quelle