N'essayez pas ln -L- cela ne fonctionnera pas. cp /proc/fd/1/exe /sbin/init && chmod 755 /sbin/initfonctionne bien. Utiliser APT pour réinstaller upstart n'est pas aussi évident que dpkg, car il ne saura pas qu'il a disparu par défaut. "Le package upstart est déjà dans la version actuelle." Vous pourriez d' dpkg --force-depends --force-remove-essential -r upstartabord.
Joshua
1
apt-get install --reinstall upstart. De plus, je n'ai pas de /proc/fdrépertoire. Et je viens de vérifier, ln -L /proc/1/exe /tmp/initfonctionne avec /sbin/initrenommé /sbin/init.bak, c'est- à -dire que je peux lire sans problème /tmp/initaprès cela.
Ruslan
@muru OK. J'ajouterai alors un synonyme de tag.
Kaz Wolfe
Réponses:
31
Le chargeur de démarrage chargera le noyau, le noyau tentera d'exécuter init, ne le trouvera pas et paniquera.
La solution consiste à redémarrer, modifier les paramètres de démarrage, ajouter init=/bin/bashet démarrer de cette façon. Le noyau utilisera bash comme init. Cela vous donnera la possibilité d'exécuter des commandes et de réparer le système.
Correction
Apparemment, le noyau (fichier init / main.c ) fait:
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.");
Ainsi, il trouverait / bin / sh (qui est un lien vers le tableau de bord) et cela vous donnera un shell et une chance de le réparer sans utiliser le init=/bin/bashparamètre de démarrage.
Très bonne réponse. Je ne savais pas que le noyau cherchait quelque chose de plus /sbin/init.
Ruslan
Et s'il n'y a pas de /bin/shfichier? Ou /bin/bashou /bin/dashetc? Vous ne savez pas comment supprimer tout cela en même temps, mais que se passerait-il, théoriquement?
trysis
Eh bien, alors vous verriez la panique du noyau, la partie de la réponse au-dessus de la ligne de correction . Mais ne faites pas cela sur un système dont vous avez besoin. Sérieusement, non. Si vous voulez expérimenter (et c'est un bon exercice) créer une VM Virtualbox, cassez-la et essayez de la réparer. BTW la réponse de 200_success n'est pas mauvaise non plus.
sмurf
12
Rien ne se produit tant que vous n'essayez pas de redémarrer. Tant que le système est en cours d'exécution et que vous n'essayez pas de changer de niveau d'exécution en exécutant /sbin/initn , vous ne vous rendriez même pas compte qu'il a disparu.
En fait, la suppression de ne /sbin/initpeut être annulée si vous réalisez l'erreur tôt et restez calme. Les administrateurs système ont récupéré de "lobotomies" beaucoup plus méchantes tout en maintenant le système d'exploitation en marche.
Une façon de récupérer après la suppression de /sbin/initest de réinstaller le upstartpackage à l'aide d'APT.
La façon macho de récupérer est d'utiliser uniquement les ressources de la machine elle-même. Un facteur en votre faveur est qu'il /sbin/initfonctionne toujours. Par conséquent, lorsque vous exécutez rm /sbin/init, le fichier est simplement dissocié du système de fichiers. L'inode et le contenu du fichier restent sur le disque et en mémoire jusqu'à la fermeture du PID 1. Il vous suffit de recréer à /sbin/initpartir de l'inode approprié.
-L
- cela ne fonctionnera pas.cp /proc/fd/1/exe /sbin/init && chmod 755 /sbin/init
fonctionne bien. Utiliser APT pour réinstaller upstart n'est pas aussi évident quedpkg
, car il ne saura pas qu'il a disparu par défaut. "Le package upstart est déjà dans la version actuelle." Vous pourriez d'dpkg --force-depends --force-remove-essential -r upstart
abord.apt-get install --reinstall upstart
. De plus, je n'ai pas de/proc/fd
répertoire. Et je viens de vérifier,ln -L /proc/1/exe /tmp/init
fonctionne avec/sbin/init
renommé/sbin/init.bak
, c'est- à -dire que je peux lire sans problème/tmp/init
après cela.Réponses:
Le chargeur de démarrage chargera le noyau, le noyau tentera d'exécuter init, ne le trouvera pas et paniquera.
La solution consiste à redémarrer, modifier les paramètres de démarrage, ajouter
init=/bin/bash
et démarrer de cette façon. Le noyau utilisera bash comme init. Cela vous donnera la possibilité d'exécuter des commandes et de réparer le système.Correction
Apparemment, le noyau (fichier init / main.c ) fait:
Ainsi, il trouverait / bin / sh (qui est un lien vers le tableau de bord) et cela vous donnera un shell et une chance de le réparer sans utiliser le
init=/bin/bash
paramètre de démarrage.la source
/sbin/init
./bin/sh
fichier? Ou/bin/bash
ou/bin/dash
etc? Vous ne savez pas comment supprimer tout cela en même temps, mais que se passerait-il, théoriquement?Rien ne se produit tant que vous n'essayez pas de redémarrer. Tant que le système est en cours d'exécution et que vous n'essayez pas de changer de niveau d'exécution en exécutant
/sbin/init
n , vous ne vous rendriez même pas compte qu'il a disparu.En fait, la suppression de ne
/sbin/init
peut être annulée si vous réalisez l'erreur tôt et restez calme. Les administrateurs système ont récupéré de "lobotomies" beaucoup plus méchantes tout en maintenant le système d'exploitation en marche.Une façon de récupérer après la suppression de
/sbin/init
est de réinstaller leupstart
package à l'aide d'APT.La façon macho de récupérer est d'utiliser uniquement les ressources de la machine elle-même. Un facteur en votre faveur est qu'il
/sbin/init
fonctionne toujours. Par conséquent, lorsque vous exécutezrm /sbin/init
, le fichier est simplement dissocié du système de fichiers. L'inode et le contenu du fichier restent sur le disque et en mémoire jusqu'à la fermeture du PID 1. Il vous suffit de recréer à/sbin/init
partir de l'inode approprié.La façon la plus simple d'y parvenir est:
la source