O que aconteceria se o init fosse excluído?

22

Apenas uma questão teórica ...

Mas o que aconteceria se init(in /sbin/init) fosse removido?

Kaz Wolfe
fonte
Não tente ln -L- não vai funcionar. cp /proc/fd/1/exe /sbin/init && chmod 755 /sbin/initfunciona embora. Usar o APT para reinstalar o upstart não é tão óbvio quanto dpkg, pois ele não saberá que foi por padrão. "O pacote inicial já está na versão atual." Você poderia dpkg --force-depends --force-remove-essential -r upstartprimeiro.
Joshua
1
apt-get install --reinstall upstart. Além disso, eu não tenho /proc/fddiretório. E acabei de verificar, ln -L /proc/1/exe /tmp/inittrabalha com /sbin/initrenomeado para /sbin/init.bak, ou seja, eu posso ler sem problemas /tmp/initdepois disso.
Ruslan
@muru OK. Vou adicionar um sinônimo de tag então.
Kaz Wolfe

Respostas:

31

O gerenciador de inicialização carregará o kernel, o kernel tentará executar o init, não o encontrará e entrará em pânico.

A saída é reiniciar, editar os parâmetros de inicialização, adicionar init=/bin/bashe inicializar dessa maneira. O kernel usará o bash como init. Isso lhe dará a chance de executar comandos e corrigir o sistema.

Correção
Aparentemente, o kernel (arquivo init / main.c ) faz:

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

Portanto, ele encontraria / bin / sh (que é um link para o dash) e isso lhe dará um shell e uma chance de corrigi-lo sem usar o init=/bin/bashparâmetro de inicialização.

surf
fonte
Ótima resposta. Não sabia que o kernel procura algo mais do que /sbin/init.
Ruslan
E se não houver /bin/sharquivo? Ou /bin/bashou /bin/dashetc? Não sabe ao certo como você pode excluir tudo isso ao mesmo tempo, mas o que aconteceria, teoricamente?
trysis
Bem, você verá o pânico do kernel, a parte da resposta acima da linha de correção . Mas não faça isso no sistema que você precisa. Sério, não. Se você quiser experimentar (e é um bom exercício) criar uma VM do Virtualbox, quebre-a e tente corrigi-la. BTW a resposta por 200_success também não é ruim.
precisa saber é o seguinte
12

Nada acontece até que você tente reiniciar. Enquanto o sistema estiver em execução e você não tentar alternar os níveis de execução executando /sbin/init n , nem perceberia que ele havia desaparecido.

Na verdade, a exclusão de /sbin/inité desfazível se você perceber o erro cedo e permanecer calmo. Os administradores de sistema se recuperaram de "lobotomias" muito mais desagradáveis , mantendo o sistema operacional em execução.

Uma maneira de recuperar a exclusão de /sbin/inité reinstalar o upstartpacote usando o APT.

A maneira machista de se recuperar é usar apenas os recursos na própria máquina. Um fator a seu favor é que ele /sbin/initestá sempre em execução. Portanto, quando você executa rm /sbin/init, o arquivo é apenas desvinculado do sistema de arquivos. O conteúdo do inode e do arquivo permanece no disco e na memória até a saída do PID 1. Você apenas precisa recriar a /sbin/initpartir do inode apropriado.

A maneira mais fácil de conseguir isso é:

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