Que se passerait-il si init était supprimé?

22

Juste une question théorique ...

Mais que se passerait-il si init(in /sbin/init) était supprimé?

Kaz Wolfe
la source
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.

sмurf
la source
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/init n , 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é.

La façon la plus simple d'y parvenir est:

# cp /proc/1/exe /sbin/init
# chmod 755 /sbin/init
200_success
la source