unix - moveu acidentalmente tudo sob raiz para / antigo - Solaris 10

13

Como diz o título, tudo ou quase tudo que é importante, como raiz sob raiz (/), foi movido para / antigo em uma máquina Solaris 10. Portanto, agora a falha típica ao tentar executar comandos é Cannot find /usr/lib/ld.so.1(alterada $PATHe também tentou alterar $LD_LIBRARY_PATH,$LD_LIBRARY_PATH_64 e $LD_RUN_PATHe exportá-los, mas nada disso parece alterar o caminho da biblioteca real). Ontem tentei praticamente tudo para encontrar algo que pudesse ajudar, mas não encontrei nada que realmente alterasse o caminho da biblioteca do Solaris 10, exceto talvez, crlemas não possa executá-lo desde então Cannot find /usr/lib/ld.so.1.

Encontrei muitas dicas de recuperação de root ou / usr / bin e assim por diante para Linux, mas as informações sobre o Solaris 10 / Unix não são comuns e muito escassas.

Não é possível executar cp, ln, mkdirou mvuma vez Cannot find /usr/lib/ld.so.1. Não é possível efetuar login com outras sessões na máquina. Embora ainda exista uma sessão que possa ser usada e essa janela esteja sendo interrompida while true; do date; echo hej 1234567; done. Discutimos a solução para usar um CD de inicialização Solaris e também um dist Linux em uma unidade USB. Discutimos a solução para mudar os discos do disco rígido para outro rack.

A /.../static/.../mvsolução foi testada, mas não funcionou.

Os comandos que ainda podem ser utilizados são (pode haver mais comandos que podem ser usados): echo, <, >, >>, |, pwd, cd.

Existe uma maneira de criar um diretório ou pasta sem mkdir? Existe alguma maneira de usar echoe >ou echoe >>restaurar /usr/lib/ld.so.1? Eu sei que mais do que /usr/lib/ld.so.1provavelmente precisará ser restaurado para que os comandos funcionem.

Muito obrigado pela leitura e tenha um bom dia =)

propaciência
fonte
2
Qual comando foi usado para mover coisas abaixo / antigas?
schaiba
Padrão Solaris mv. Ou mais precisamente: shopt -s extglob; mv !(old) /old.
propacience
1
Qual shell está sendo executado no momento? algumas conchas têm comandos inbuild
Ferrybig
Você pode consertar isso ln, se estiver funcionando.
David Schwartz
2
"A solução /.../static/.../mv foi testada, mas não funcionou." O que aconteceu? Isso deu um erro no carregador? O que "não funcionou" exatamente? Os binários staticestão lá exatamente para esta categoria de problemas, se você não deseja inicializar mídia temporária.
Ti Strga

Respostas:

19

Se você não tiver mais um shell em execução como root, precisará reiniciar a mídia de resgate. Qualquer coisa funcionará desde que seja capaz de montar a leitura / gravação do sistema de arquivos raiz.

Se você ainda pode executar comandos como root, tudo é copacético. Defina a variável de ambiente LD_LIBRARY_PATHpara apontar para os diretórios que contêm bibliotecas usadas pelas ferramentas básicas do sistema. Isso é pelo menos /usr/libem um Solaris de 32 bits, /usr/lib/64em um Solaris de 64 bits, possivelmente em outros diretórios (não tenho acesso ao Solaris 10 agora para verificar). Para executar um executável, prefixe-o com o vinculador de tempo de execução : /usr/lib/ld.so.1(para um executável de 32 bits) ou /usr/lib/64/ld.so.1(para um executável de 64 bits) - agora movido para /old. Assim, você deve conseguir se recuperar com algo como:

LD_LIBRARY_PATH=/old/usr/lib
export LD_LIBRARY_PATH
/old/usr/lib/ld.so.1 /old/usr/bin/mv /old/* /
Gilles 'SO- parar de ser mau'
fonte
Uso inteligente do carregador. Se toda a hierarquia não foi movida para /old, meu comentário ao próprio comentário de Peschke também é válido aqui. mvnão deve ser usado, mas um comando que preservar a hierarquia existente como pax, tare os gostos.
Jlliagre
1
Muito obrigado por sua paciência e tempo para escrever isso. Ele funciona agora executar comandos como /old/usr/lib/ld.so.1 /old/usr/bin/mve /old/usr/lib/ld.so.1 /old/usr/bin/cpe assim por diante. Vou ver o que posso fazer, agora o problema é que estou sem espaço, mas posso consertar isso.
propacience
@propatience Pena que você e Gilles não considerado meus comentários ...
jlliagre
1
Yay DEUS! Eu consegui passar tudo de volta com primeiro /old/usr/lib/ld.so.1 /old/usr/bin/mve /old/usr/lib/ld.so.1 /old/usr/bin/cpmas não há espaço, portanto, não poderia utilizar /old/usr/lib/ld.so.1 /old/usr/bin/cp. E depois editar $PATHe depois pasta por pasta usando mvcom alterado $PATH. Agora tudo voltou para que eu possa fazer login novamente e digite df -h e tudo. Muito obrigado a todos. Realmente, muito obrigado a você @Gilles! Obrigado StackExchange!
propacience 22/02
1
A configuração LD_LIBRARY_PATHno Solaris tem alguns perigos, se você precisar configurá-lo para poder executar os executáveis ​​de 32 e 64 bits. Seria melhor usar as versões específicas de 32 e 64 bits LD_LIBRARY_PATHdisponíveis no Solaris. Nesse caso: LD_LIBRARY_PATH_32=/old/usr/libe LD_LIBRARY_PATH_64=/old/usr/lib/64. Consulte a ld.so.1página do manual : "Cada variável de ambiente pode ser especificada com um sufixo _32 ou _64. Isso torna a variável de ambiente específica, respectivamente, para processos de 32 ou 64 bits."
Andrew Henle
16

Não há como criar um diretório ou copiar arquivos binários com apenas comandos internos (embora Gilles descreva uma solução potencial inteligente em sua resposta ).

Sua melhor opção é inicializar o Solaris em uma mídia externa (dvd, pendrive), montar ou importar o (s) sistema (s) de arquivo e corrigir a bagunça com algo como:

  • Inicialize um disco de instalação do Solaris e selecione para executar um shell.

  • Monte a raiz antiga (e todos os outros sistemas de arquivos, se houver) em algum diretório como /mnt ou /a. O disco de inicialização do Solaris pode ajudá-lo a fazer isso ao detectar sistemas de arquivos existentes.

  • coloque os arquivos de volta ao seu local original com este comando (supondo que tudo esteja montado abaixo /mnt):

    cd /mnt/old
    find . -depth | cpio -pdlmPV@ /mnt
    
  • Reinicie seu sistema

    init 6
    

Se você estiver usando o ZFS e existir um instantâneo recente, fazer o backup do /olddiretório em outro local e, em seguida, reverter para o último instantâneo também poderá ser uma opção.

jlliagre
fonte
Ótima resposta. Boot no resgate USB, monte o sistema de arquivos, e então fazer algo parecidomv /mountpoint/old/* /mountpoint
Peschke
1
@Peschke Obrigado, embora executar cegamente o seu mvcomando sugerido não seja meu conselho. O OP escreveu "tudo ou quase tudo ". No segundo caso, a movimentação quebrará os diretórios ainda existentes. Eu provavelmente usar um utilitário como tar, paxou cpiopara preservar a hierarquia de diretório de destino.
Jlliagre
Muito obrigado por responder rapidamente e muito obrigado por suas respostas. Eu posso tentar isso amanhã.
propacience
Associado ao possível instantâneo (ZFS ou UFS), você pode inicializar em um BE alternativo se estiver usando a atualização ao vivo. lustatus E não entre em pânico ainda. Todos os dados ainda existem no (s) disco (s).
22417 sleepyweasel
0

Solaris inclui estática constrói de serviços básicos ( cp, ln, mv, rcp, e tar) em /usr/sbin/staticque você pode usar para reparar qualquer problema com a disponibilidade de /usr/lib/ld.so.1que impede o uso do regulares dinamicamente ligados /usr/binversões.

Não há estática mkdirfornecida, mas você pode usar a estática lnpara vincular temporariamente qualquer diretório que contenha lib/ld.so.1no local /usrtemporariamente e, em seguida, usar o padrão mkdirpara criar os diretórios necessários. Você pode renomear diretórios que já existem usando a estática mv.

rakslice
fonte
Isto vai, pelo menos, já em Solaris 2.5.1, onde eu encontrei que o estoque ld.so.1segfaults se você tentar executá-lo manualmente, como mostrado na Gilles' exemplo
rakslice