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.
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/initn 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 .
-L
Sie es nicht in - es wird nicht funktionieren.cp /proc/fd/1/exe /sbin/init && chmod 755 /sbin/init
funktioniert aber. Das Verwenden von APT zum erneuten Installieren von Upstart ist nicht so offensichtlich wiedpkg
, da es nicht weiß, dass es standardmäßig weg ist. "Paket-Upstart ist bereits in der aktuellen Version." Du könntestdpkg --force-depends --force-remove-essential -r upstart
zuerst.apt-get install --reinstall upstart
. Außerdem habe ich kein/proc/fd
Verzeichnis. Und ich habe gerade nachgesehen,ln -L /proc/1/exe /tmp/init
arbeitet mit/sbin/init
umbenannt/sbin/init.bak
, dh ich kann danach problemlos lesen/tmp/init
.Antworten:
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/bash
und 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 ):
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/bash
Boot-Parameter zu verwenden.quelle
/sbin/init
./bin/sh
Datei gibt? Oder/bin/bash
oder/bin/dash
etc? Sie sind sich nicht sicher, wie Sie all diese Elemente gleichzeitig löschen können, aber was würde theoretisch passieren?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/init
rü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/init
besteht darin, dasupstart
Paket 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/init
immer läuft. Daher istrm /sbin/init
die 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/init
von der entsprechenden Inode neu erstellen .Der einfachste Weg , dies zu erreichen, ist:
quelle