FreeBSD 8.2, deletado / bin / sh, não pode inicializar

8

Tomei uma decisão muito ruim em um dos meus servidores.

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

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

Eu tentei copiar sh de um live cd, ele falhou na biblioteca ld-elf.so.1. Então eu copiei isso para / libexec do livecd para minha / partição. Em seguida, ele precisa da biblioteca libedit.so e copiei isso para / libexec, mas não está funcionando dessa vez.

Eu tentei um symlink para /usr/local/bin/bash , mas isso ainda me apresenta um erro do tipo "can't find sh". Eu estou supondo que é porque /usr não está montado ainda porque é feito a partir de um script rc.

Qualquer ajuda é muito apreciada.

    
por jon 16.12.2011 / 16:44

3 respostas

8

Você precisa substituir / bin / sh por algo ; essa é a chave. Se você pode entrar no 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 esta informação do loader (8) do manual do FreeBSD páginas (online). Eu não fiz isso, mas deve funcionar (supondo que / bin / csh esteja presente e seja executável).

Se você tem um servidor FreeBSD 8.2 instalado e rodando em outro lugar, você pode tentar roubar o / bin / sh daquela fonte e colocar isso no sistema onde for necessário.

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

EDIT: Eu deveria ter notado: se você inicializar em / bin / csh, você ainda precisa obter algo para usar em vez de / bin / sh. Você pode obtê-lo pela Internet ou copiá-lo de outro CD ou de um pacote ou algo assim; usando / bin / csh para inicializar você entra na máquina. Copiar pela rede requer que você ative a rede; caso contrário, copie de um CDROM.

As melhores maneiras de evitar isso no futuro:

  1. Não exclua de / bin! (essa é a parte fácil)
  2. Tenha um / bin / sh estaticamente construído, não vinculado dinamicamente.
  3. Tenha um backup como /bin/sh.static.

Faça todos os três.

    
por 16.12.2011 / 16:58
6

OK, primeiro a palestra:

  1. NÃO SUJE COM BINÁRIOS DO SISTEMA
    Qualquer coisa em /bin , /sbin e /rescue no FreeBSD deve ser deixado em paz. Mesmo que você saiba o que está fazendo (se sabe o que está fazendo, também sabe que isso deve ser deixado em paz. Eles são realmente importantes - todos eles!)

  2. NÃO exclua /bin/sh . EVER. Em qualquer sistema * NIX que o tenha.
    Mesmo. Não faça isso. Um LOT de scripts depende de /bin/sh ser um Bourne Shell. Isso quebra o universo.
    Se você REALMENTE quiser, provavelmente poderá substituí-la com segurança com uma cópia de bash , como Adam Z sugeriu, mas se você for fazer isso, poderá vincular estaticamente essa cópia de bash - Ele puxa muitas bibliotecas, e você pode não tê-las até que o sistema esteja ativo e /usr/local esteja montado.

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

Opção 1: Um pouco doloroso
Vá até o link (ou o FreeBSD LiveCD de sua escolha - Você provavelmente pode usar o CD de recuperação de link para isso). Pegue o LiveCD, grave-o e inicialize-o.

Quando você estiver no ambiente do LiveCD, monte a partição raiz do seu sistema, copie o /bin/sh do LiveCD para a sua máquina e reinicie.

Isso deve colocar você de volta em funcionamento - Você pode seguir as instruções para Reconstruindo o" World ", ou pelo menos re-compile o /bin/sh de uma árvore fonte que corresponda ao seu sistema em execução.

Opção 2: Menos doloroso, sem LiveCD
Se você tiver outra caixa do FreeBSD em volta, você pode fazer uma cópia de /bin/sh , colocar sua máquina FreeBSD no modo de usuário único Configurar a rede (ou montar qualquer mídia que tenha a substituição shell nele), e copie-o para o lugar onde deveria estar.

Reinicialize e você deve estar OK - as mesmas advertências do LiveCD, se o /bin/sh que você pegar não for de uma máquina razoavelmente próxima a idêntica.

    
por 16.12.2011 / 17:13
4

Em vez de criar links simbólicos, copie seu bash para /bin/sh . Use o comando ldd para encontrar quaisquer bibliotecas que possam residir em sistemas de arquivos diferentes de rootfs e copie-as para o rootfs também.

    
por 16.12.2011 / 16:56

Tags