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.
Ó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/initn , 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.
-L
- não vai funcionar.cp /proc/fd/1/exe /sbin/init && chmod 755 /sbin/init
funciona embora. Usar o APT para reinstalar o upstart não é tão óbvio quantodpkg
, pois ele não saberá que foi por padrão. "O pacote inicial já está na versão atual." Você poderiadpkg --force-depends --force-remove-essential -r upstart
primeiro.apt-get install --reinstall upstart
. Além disso, eu não tenho/proc/fd
diretório. E acabei de verificar,ln -L /proc/1/exe /tmp/init
trabalha com/sbin/init
renomeado para/sbin/init.bak
, ou seja, eu posso ler sem problemas/tmp/init
depois disso.Respostas:
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/bash
e 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:
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/bash
parâmetro de inicialização.fonte
/sbin/init
./bin/sh
arquivo? Ou/bin/bash
ou/bin/dash
etc? Não sabe ao certo como você pode excluir tudo isso ao mesmo tempo, mas o que aconteceria, teoricamente?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 oupstart
pacote 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/init
está sempre em execução. Portanto, quando você executarm /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/init
partir do inode apropriado.A maneira mais fácil de conseguir isso é:
fonte