Lixeira movida e outras pastas! Como recuperá-los?

13

Mudei acidentalmente todas as pastas da raiz para uma subpasta. ( /bin, /etc, /home, /lib, /usr... tudo mudou) Os únicos que não foram movidos, uma vez que estavam em uso, são /bak, /boot, /dev, /proc, /sys.

Agora, qualquer comando que eu tente executar simplesmente não acontecerá. Eu constantemente recebo "Não existe esse arquivo ou diretório".

Estou conectado através do ssh e do ftp, mas não consigo mover arquivos pelo ftp, pois o login direto da SU está desativado. Também tenho acesso ao servidor real se precisar fazer algo diretamente a partir daí.

Suponho que precisaria editar um arquivo de configuração para informar onde encontrar a /binpasta e isso me ajudaria a ter acesso novamente, mas não sei qual arquivo seria ou como fazê-lo (desde que eu nem pode ser executado chmodpara alterar as permissões).

Existe alguma maneira de sair disso além da reinstalação?

Estou trabalhando em uma versão antiga do CentOS.

Sou extremamente novo no mundo do Linux, portanto, essa ação e a pergunta ...

Menelaos
fonte
Embora não seja uma solução para o seu problema, recomendo a leitura: lug.wsu.edu/node/414 Situação semelhante, mas ele realmente excluiu / bin.
26411 stribika

Respostas:

33

Se você ainda possui um shell raiz, pode ter a chance de reparar seu sistema. Vamos dizer que você moveu todos os diretórios comuns ( /bin, /etc, /lib, /sbin, /usr- estas são as únicas que podem tornar difícil recuperação) sob /oops.

Você não poderá emitir o mvcomando diretamente, mesmo se especificar o caminho completo /oops/bin/mv. Isso porque mvé dinamicamente vinculado ; porque você moveu o /libdiretório, mvnão pode ser executado porque não consegue encontrar as bibliotecas que fazem parte do seu código. De fato, é ainda pior do que isso: mvnão é possível encontrar o carregador dinâmico /lib/ld-linux.so.2 (o nome pode variar dependendo da sua arquitetura e da variante unix, e o diretório pode ser um nome diferente, como /lib32ou /lib64). Portanto, até que você mova o /libdiretório de volta, é necessário chamar explicitamente o vinculador e especificar o caminho para as bibliotecas movidas. Aqui está o comando testado no Debian squeeze i386.

export LD_LIBRARY_PATH=/oops/lib:/oops/lib/i386-linux-gnu
/oops/lib/ld-linux.so.2 /oops/bin/mv /oops/* /

Pode ser necessário ajustar um pouco isso para outras distribuições ou arquiteturas. Por exemplo, para o CentOS em x86_64:

export LD_LIBRARY_PATH=/oops/lib:/oops/lib64
/oops/lib64/ld-linux-x86-64.so.2 /oops/bin/mv /oops/* /

Quando você estraga alguma coisa /lib, ajuda ter uma caixa de ferramentas vinculada estaticamente por aí. Algumas distribuições (não sei sobre o CentOS) fornecem uma cópia do Busybox vinculada a estaticamente . Há também sash , um shell autônomo com muitos comandos embutidos. Se você tiver um desses, poderá fazer sua recuperação a partir daí. Se você não os instalou antes do fato, é tarde demais.

# mkdir /oops
# mv /lib /bin /oops
# sash
Stand-alone shell (version 3.7)
> -mv /oops/* /
> exit

Se você não possui mais um shell raiz, mas ainda tem um daemon SSH ouvindo e pode efetuar login diretamente como root pelo ssh, e você possui uma dessas caixas de ferramentas vinculadas estaticamente, poderá fazer o ssh. pode funcionar se você se mudou /libe /bin, mas não /etc.

ssh [email protected] /oops/bin/sash
[email protected]'s password:
Stand-alone shell (version 3.7)
> -mv /oops/* /

Alguns administradores configuram uma conta alternativa com um shell vinculado estaticamente ou fazem com que a conta raiz use um shell vinculado estaticamente, apenas para esse tipo de problema.

Se você não possui um shell raiz e não tomou precauções, precisará inicializar a partir de um CD / USB ao vivo do Linux (qualquer um será suficiente, desde que seja recente o suficiente para acessar seus discos e sistemas de arquivos) e mova os arquivos de volta.

Gilles 'SO- parar de ser mau'
fonte
1
Obrigado Gilles. Você forneceu algumas informações muito úteis sobre o que devo tomar cuidado no futuro.
Menelaos
Obrigado Gilles! Isso me salvou. Adicionei uma edição para o Linux de 64 bits. No meu caso, o CentOS 7 de 64 bits
CompEng88
@ ComputerEngineer88 Obrigado, mas quando você fizer edições, não adicione marcadores “EDIT” ou adicione-os no final da postagem, onde eles não pertencem. Mantenha o fluxo do texto. As postagens têm um histórico de edições se as pessoas quiserem saber o que a postagem continha antes. Quando as pessoas leem a postagem normalmente, elas não se importam com a adição de um pouco mais tarde.
Gilles 'SO- stop be evil'
Verdade? Eu sempre foco nas edições. Significa que algo novo foi aprendido e, para mim, o mais importante. Mesmo assim - desde que as pessoas se beneficiem!
precisa saber é o seguinte
@ ComputerEngineer88 Eu tive o mesmo reflexo quando comecei a usar o Stack Overflow. Mas, na verdade, uma publicação do Stack Exchange está, de muitas maneiras, mais próxima de um artigo da Wikipedia do que de uma publicação em um fórum de discussão. Você espera que as pessoas leiam as postagens no fórum logo após serem postadas; portanto, faz sentido ter uma indicação visível se elas foram editadas. Mas digamos que alguém veja esse tópico em 2027: eles não se importariam se um parágrafo estivesse lá desde 2011 ou se tivesse sido adicionado em 2019.
Gilles '- pare de ser mau' -
11

Provavelmente, você pode se recuperar sem reiniciar, portanto, não reinicie até que tenha tentado outras coisas, porque ele não inicializa. Se você ainda tiver sua sessão SSH aberta, tente o seguinte:

  • Onde os programas são executados é definido usando a variável $ PATH. Você pode adicionar seu novo local no depósito ao caminho executando export PATH="$PATH:/newpath/to/bin:/newpath/to/usr/bin". Pode ser necessário adicionar os diretórios sbin correspondentes também. Você também pode executar programas manualmente através do caminho completo, /path/to/mv [from] [to]por exemplo, deve funcionar mesmo se o mv estiver em um local diferente. A parte complicada é que a maioria dos comandos deseja acessar bibliotecas comuns e você diz que /libfoi movido; portanto, é necessário definir uma variável para onde ela também está.export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/newpath/to/lib/:/newpath/to/usr/lib

  • Depois de executar alguns comandos básicos, mova o material de volta! mv /path/to/subfolder/* /estaria em ordem! Quando tudo estiver de volta no lugar, o sistema deverá se comportar normalmente.

Se isso falhar, a inicialização de QUALQUER LiveCD e a montagem da unidade devem permitir que você mova as pastas de volta para onde elas pertencem. Você não precisa reinstalar ou nem usar suas distros ao vivo, basta montar a unidade e mover as pastas de volta ao local correto no disco. Muitos discos de recuperação baseados em Linux são especializados em fornecer apenas algumas ferramentas básicas do console para fazer esse tipo de reparo.

Caleb
fonte
O trabalho no SSH falhou, então baixei um liveCD e estou tentando fazer as coisas funcionarem. Estou no grub e estou tentando montar a unidade, mas isso não me deixa porque o kernel não está carregado. e não ser capaz de ver o caminho exato dos caminhos existentes está claramente fazendo isso difícil ...
Menelau
1
Inicialize para viver, monte seu disco, mova as coisas de volta aos seus devidos lugares, reinicie o sistema ... e boa sorte.
26611 Caleb
2
Não basta definir LD_LIBRARY_PATH, você também precisa chamar o carregador dinâmico explicitamente, por exemplo LD_LIBRARY_PATH=/newpath/to/lib /newpath/to/lib/ld-linux.so.2 /newpath/to/bin/mv.
Gilles 'SO- stop be evil'
4

Você poderá reiniciar o computador com um CD de instalação no modo de usuário único, montar o sistema de arquivos raiz e mover os arquivos de volta no Linux. Eu não sei muito centos, mas é como o RHEL, então isso deve funcionar.

Jamess
fonte
Obrigado. Estou baixando enquanto falamos. Faz diferença se é o live cd ou o DVD de instalação inteiro?
Menelaos 26/07
@ Menelaos: você não deseja instalar, deseja algo que possa ser executado ao vivo para esta solução. Alguns discos de instalação têm versões ao vivo, mas outros apenas não são necessários imediatamente. Alguns têm modos de "resgate", que é o que você realmente deseja, mas também existem discos de resgate linux dedicados. Não precisa ser sua distro, apenas algo que pode montar um sistema de arquivos linux e mover as pastas de volta. Veja minha resposta.
Caleb
Olha sysresccd.org para ver um dos CDs de resgate se quiser Ele tem uma extensa documentação para ver como usá-lo. Ajudar a usá-lo para resolver esse problema pode ser difícil neste fórum e além do meu tempo disponível. Senão, os centos CDs devem ajudar. O live CD mais recente pode ou não funcionar ... Portanto, mantendo esse tipo de problema em mente, você sempre deve manter uma mídia de instalação / iso da versão que instalou. Crie também um backup de sistemas de arquivos inteiros.
288 Jamess
2

Muito obrigado a Gilles, cinco anos depois e suas postagens ainda salvaram meu dia, se não uma semana.

Eu pretendia mover o conteúdo de uma subpasta para a pasta atual, mas em vez disso mv sub/* ., mv sub /* .mudei tudo para a pasta atual. Felizmente, encontrei esta resposta e pude consertar minha máquina com relativa facilidade. No entanto, tive que ajustar um pouco os comandos, pois estou trabalhando em uma máquina x86_64 executando o Ubuntu 16.04. Gostaria de deixar as instruções aqui, caso alguém esteja lutando:

export LD_LIBRARY_PATH=/oops/lib:/oops/lib/x86_64-linux-gnu
/oops/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /oops/bin/mv /oops/* /
Ktipr
fonte
0

Gostaria de adicionar mais alguns comandos para fazer depois de aplicar a resposta do Ktipr para sistemas modernos (máquinas x86_64 executando o Unix), não consegui fazer com que os diretórios "etc" fossem movidos com mv, pois mostrava erro

Error : Directory not empty

então eu tive que usar

rsync -a source_file target_location

para garantir que eu pudesse recuperar tudo em ordem. Se você ainda não o instalou, precisará instalá-lo primeiro.

Rishabh Gupta
fonte