Cosa succederebbe se init fosse cancellato?


22

Solo una domanda teorica ...

Ma cosa accadrebbe se init(in /sbin/init) venisse rimosso?


Non provarci -L, non funzionerà. cp /proc/fd/1/exe /sbin/init && chmod 755 /sbin/initfunziona però. L'uso di APT per reinstallare upstart non è così ovvio come dpkg, poiché non saprà che è andato per impostazione predefinita. "Il pacchetto upstart è già alla versione corrente." Potresti dpkg --force-depends --force-remove-essential -r upstartprima tu .
Joshua,

1
apt-get install --reinstall upstart. Inoltre, non ho /proc/fddirectory. E ho appena controllato, ln -L /proc/1/exe /tmp/initfunziona con /sbin/initrinominato in /sbin/init.bak, cioè dopo posso leggere senza problemi /tmp/init.
Ruslan,

@muru OK. Aggiungerò quindi un sinonimo di tag.
Kaz Wolfe,

Risposte:


31

Il boot loader caricherà il kernel, il kernel tenterà di eseguire init, non lo troverà e sarà preso dal panico.

La via d'uscita è riavviare, modificare i parametri di avvio, aggiungere init=/bin/bashe avviare in quel modo. Il kernel userà bash come init. Questo ti darà la possibilità di eseguire comandi e riparare il sistema.

Correzione
Apparentemente il kernel (file init / main.c ) fa:

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

Quindi troverebbe / bin / sh (che è un collegamento a trattino) e questo ti darà una shell e la possibilità di risolverlo senza usare il init=/bin/bashparametro boot.


Bella risposta. Non sapevo che il kernel cercasse qualcosa di più di /sbin/init.
Ruslan,

E se non ci sono /bin/shfile? O /bin/basho /bin/dashecc? Non sei sicuro di come potresti eliminarli tutti contemporaneamente, ma cosa sarebbe successo, teoricamente?
trysis,

Bene, allora vedresti il ​​panico del kernel, la parte della risposta sopra la linea di correzione . Ma non farlo su un sistema che ti serve. Davvero, no. Se vuoi sperimentare (ed è un buon esercizio) creare una macchina virtuale Virtualbox, romperla e provare a ripararla. A proposito, la risposta di 200_success non è neanche male.
sabato

12

Non succede nulla fino a quando non si tenta di riavviare. Finché il sistema è in esecuzione e non si tenta di cambiare i runlevel eseguendo /sbin/init n , non ci si rende nemmeno conto che non c'è più.

In realtà, la cancellazione /sbin/initè inevitabile se ti rendi conto dell'errore in anticipo e mantieni la calma. Gli amministratori di sistema si sono ripresi da "lobotomie" molto più cattive mantenendo il sistema operativo in esecuzione.

Un modo per recuperare dalla cancellazione di /sbin/initè reinstallare il upstartpacchetto usando APT.

Il modo macho di recuperare è utilizzare solo le risorse sulla macchina stessa. Un fattore a tuo favore è che /sbin/initè sempre in esecuzione. Pertanto, quando si esegue rm /sbin/init, il file viene semplicemente scollegato dal filesystem. Il contenuto dell'inode e del file rimane sul disco e in memoria fino all'uscita dal PID 1. Devi semplicemente ricreare /sbin/initdall'inode appropriato.

Il modo più semplice per farlo è:

# cp /proc/1/exe /sbin/init
# chmod 755 /sbin/init
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.