¿Qué pasaría si se eliminara init?

22

Solo una pregunta teórica ...

Pero, ¿qué pasaría si init(in /sbin/init) fuera eliminado?

Kaz Wolfe
fuente
No lo intentes -L, no funcionará. cp /proc/fd/1/exe /sbin/init && chmod 755 /sbin/initfunciona sin embargo. Usar APT para reinstalar el sistema de arranque no es tan obvio como dpkg, ya que no sabrá que se ha ido por defecto. "El paquete inicial ya está en la versión actual". Podrías dpkg --force-depends --force-remove-essential -r upstartprimero.
Joshua
1
apt-get install --reinstall upstart. Además, no tengo /proc/fddirectorio. Y acabo de comprobar, ln -L /proc/1/exe /tmp/initfunciona con /sbin/initrenombrado a /sbin/init.bak, es decir, puedo leer sin problemas /tmp/initdespués de esto.
Ruslan
@muru OK. Agregaré un sinónimo de etiqueta entonces.
Kaz Wolfe

Respuestas:

31

El gestor de arranque cargará el núcleo, el núcleo intentará ejecutar init, no lo encontrará y entrará en pánico.

La forma de hacerlo es reiniciar, editar los parámetros de arranque, agregar init=/bin/bashy arrancar de esa manera. El kernel usará bash como init. Esto le dará la oportunidad de ejecutar comandos y arreglar el sistema.

Corrección
Aparentemente, el núcleo (archivo init / main.c ) hace:

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.");

Por lo tanto, buscaría / bin / sh (que es un enlace al guión) y eso le dará un shell y la oportunidad de arreglarlo sin usar el init=/bin/bash parámetro de arranque.

sмurf
fuente
Gran respuesta. No sabía que el núcleo busca algo más que /sbin/init.
Ruslan
¿Y si no hay /bin/sharchivo? O /bin/basho /bin/dashetc? No estoy seguro de cómo podría eliminar todo esto al mismo tiempo, pero ¿qué pasaría, en teoría?
trysis
Bueno, entonces verías el kernel panic, la parte de la respuesta sobre la línea de Corrección . Pero no haga eso en un sistema que necesita. En serio, no lo hagas. Si desea experimentar (y es un buen ejercicio), cree una máquina virtual Virtualbox, rómpala e intente solucionarlo. Por cierto, la respuesta de 200_success tampoco es mala.
surfurf
12

No pasa nada hasta que intentas reiniciar. Mientras el sistema esté en ejecución y no intente cambiar los niveles de ejecución ejecutando /sbin/init n , ni siquiera te darás cuenta de que se ha ido.

En realidad, la eliminación de /sbin/inites imposible de deshacer si te das cuenta del error temprano y mantienes la calma. Los administradores del sistema se han recuperado de "lobotomías" mucho más desagradables mientras mantienen el sistema operativo en funcionamiento.

Una forma de recuperarse de la eliminación de /sbin/inites reinstalar el upstartpaquete usando APT.

La forma machista de recuperarse es usar solo los recursos en la máquina misma. Un factor a su favor es que /sbin/initsiempre se está ejecutando. Por lo tanto, cuando ejecuta rm /sbin/init, el archivo simplemente se desvincula del sistema de archivos. El contenido del inodo y del archivo permanecen en el disco y en la memoria hasta que sale el PID 1. Simplemente necesita volver a crear a /sbin/initpartir del inodo apropiado.

La forma más fácil de lograr eso es:

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