O FreeBSD 8.2, excluído / bin / sh, não pode inicializar

8

Tomei uma péssima decisão em um dos meus servidores.

Eu apaguei /bin/sh. Eu reiniciei o servidor e o servidor não será executado porque ele precisa /bin/shiniciar os scripts rc. Também não consigo acessar o modo de usuário único porque sh é necessário.

Existe alguma maneira fácil de reinstalar o shell de bourn?

Tentei copiar sh de um CD ao vivo, ele falhou na biblioteca ld-elf.so.1. Então, eu copiei isso para / libexec do livecd para minha / partição. Ele precisa da biblioteca libedit.so e eu a copiei para / libexec, mas desta vez não está funcionando.

Eu tentei um link simbólico, /usr/local/bin/bashmas isso ainda me apresenta o erro do tipo "não é possível encontrar sh". Estou assumindo que é porque /usrainda não está montado porque é feito a partir de um script rc.

Qualquer ajuda é muito apreciada.

Jon
fonte
2
Oh meu. Isso não é bom. Hora de puxar a última fita.
MDMarra
Seus problemas no LiveCD provavelmente são porque é uma versão diferente do FreeBSD (ou o seu LiveCD está usando um binário esmagado mágico que é / bin / ABunchOfStuff vinculado a nomes diferentes). Qual versão do FreeBSD você está executando?
voretaq7
A versão herp-derp está no título. Não se importe comigo. Preciso de café.
voretaq7
3
Então ... uhm ... o que o levou a fazer isso? Você faz parecer que foi intencional.
user606723

Respostas:

8

Você precisa substituir / bin / sh por algo ; essa é a chave. Se você pode acessar o carregador do FreeBSD durante a inicialização (com um prompt "ok"), tente algo como isto:

set init_shell=/bin/csh
unset init_script
unset init_path

Eu obtive essas informações do loader (8) nas páginas de manual do FreeBSD (online). Eu não fiz isso, mas deve funcionar (assumindo que / bin / csh esteja presente e seja executável).

Se você possui um servidor FreeBSD 8.2 em execução em outro local, tente roubar o / bin / sh dessa fonte e colocá-lo no sistema onde for necessário.

Como alternativa, obtenha um / bin / sh estaticamente construído e coloque-o; não haverá problemas de biblioteca com um binário estaticamente construído.

EDIT: Eu deveria ter notado: se você inicializar em / bin / csh, ainda precisará obter algo para usar em vez de / bin / sh. Você pode obtê-lo pela Internet ou copiá-lo de outro CD ou pacote ou algo assim; O uso de / bin / csh para inicializar leva você à máquina. Copiar pela rede exige que você abra a rede; caso contrário, copie de um CD-ROM.

As melhores maneiras de evitar isso no futuro:

  1. Não exclua de / bin! (essa é a parte mais fácil)
  2. Tenha um / bin / sh estaticamente construído, sem vínculo dinâmico.
  3. Tenha um backup sh como /bin/sh.static.

Faça os três.

Mei
fonte
Também é uma ótima solução "faça o backup para que eu possa corrigir esta" solução (com a virtude de não exigir que você tenha um LiveCD para inicializar).
voretaq7
6

OK, primeiro a palestra:

  1. Não suje com SISTEMA BINARIES
    Qualquer coisa/bin,/sbine/rescueno FreeBSD deve ser deixado sozinho. Mesmo se você souber o que está fazendo (se você souber o que está fazendo, também saberá que eles devem ser deixados em paz. Eles são realmente importantes - todos eles!)

  2. NÃO apague/bin/sh. SEMPRE. Em qualquer sistema * NIX que o possua.
    Realmente. Não faça isso. A LOT de roteiros dependem de/bin/shser um Shell Bourne. Isso quebra o universo.
    Se você realmente quiser, você provavelmente pode substituir de forma segura-lo com uma cópia debashcomo Adam Z sugerido, mas se você estiver indo para fazer isso você pode querer estaticamente ligação que copiar debash- Ele puxa em um monte de bibliotecas, e você pode não ter esses até que o sistema esteja instalado e/usr/localmontado.


Agora, como consertar a bagunça? Duas opções:

Opção 1: Um pouco doloroso
Vá para http://www.freesbie.org/ (ou o FreeBSD LiveCD de sua escolha - você provavelmente pode até usar o CD de recuperação de http://www.freebsd.org para isso). Pegue o LiveCD, grave-o e inicie-o.

Quando estiver no ambiente do LiveCD, monte a partição raiz do sistema bloqueado, copie-o /bin/shdo LiveCD para a sua máquina e reinicie.

Isso deve fazer com que você volte a funcionar. Você pode seguir as instruções para Reconstruir o "Mundo" ou, pelo menos, recompilar a /bin/shpartir de uma árvore de origem que corresponda ao seu sistema em execução.

Opção 2: Menos doloroso, sem LiveCD
Se você tiver outra caixa do FreeBSD por perto, poderá optar por (ou alguma outra maneira de obter uma cópia da cópia/bin/sh, traga sua máquina FreeBSD para o modo de usuário único. Configure a rede (ou monte qualquer mídia que tenha o shell de substituição) e copie-o no lugar onde deveria estar.

Reinicie e você deve estar bem - as mesmas ressalvas que o LiveCD, se o /bin/shpegar não for de uma máquina razoavelmente próxima da idêntica.

voretaq7
fonte
1
Usar / bin / bash de outra distribuição do FreeBSD só funcionará se as bibliotecas compartilhadas forem a versão correta. Melhor usar algo que vem diretamente do FreeBSD 8.2 em vez de uma versão alternativa. No entanto, qualquer sistema FreeBSD 8.x deve ser capaz de fornecer um shell estaticamente construído que funcione.
Mei
@ David Bom ponto - /binnão está mais vinculado estaticamente. Acho que os CDs de resgate para a liberação adequada do FreeBSD tem um shell utilizável (isto é, que só pode ser despejado no lugar), mas tem sido um tempo desde que iniciado um ...
voretaq7
4

Em vez de simbolizar, copie seu arquivo bashpara /bin/sh. Use o lddcomando para encontrar quaisquer bibliotecas que possam residir em sistemas de arquivos que não sejam rootfs e copiá-las também para rootfs.

Adam Zalcman
fonte
1
Essa é uma boa solução, mas causa um pouco de confusão na biblioteca que exigirá limpeza posterior posteriormente.
voretaq7
Sim, a limpeza é necessária depois. Uma alternativa seria usar um binário shell estaticamente construído.
Adam Zalcman