Após renomear acidentalmente / usr, como renomeá-lo novamente?

62

Renomeei acidentalmente o diretório /usrpara /usr_bak.

Eu quero mudá-lo de volta, então eu acrescentar o caminho /usr_bak/binpara $PATHpermitir que o sistema para encontrar o comando sudo.

Mas agora sudo mv /usr_bak /usrme dá o erro:

sudo: error while loading shared libraries: libsudo_util.so.0: cannot open shared object file: No such file or directory

Existe uma maneira de renomear o /usr_bakas /usralém de reinstalar o sistema?

Yves
fonte
2
Qual SO é esse? Gostaria de saber como sudochegou ao estágio de biblioteca, geralmente está dentro /usr/bin/e deveria ter falhado com um erro de comando não encontrado. Além disso, você tem uma senha root definida?
19718 muru
3
@muru É o Ubuntu. Você está certo, eu recebi o erro not foundantes, então acrescentei o novo caminho /usr_bak/binpara $PATHe agora recebo o erro no meu post aqui ...
Yves
2
@ user1717828 é complicado. Eu tenho que compilar um projeto, desenvolvido no Ubuntu 16.04, no Ubuntu 17.10. Então, eu estou pensando se eu posso simplesmente copiar o /usrdo Ubuntu 16.04 para substituir o /usrdo Ubuntu 17.10 ...
Yves
6
Você já pensou em usar uma VM para compilar o projeto em vez de mudanças tão drásticas?
21718 Kevin
3
Você pode executar o virtualbox no modo sem cabeça . Pode ser mais fácil configurar um convidado em outra máquina ou obter uma pré-configurada.
Kevin

Respostas:

109

Como você definiu uma senha para root, use sue busybox, instalado por padrão no Ubuntu. Todas suas bibliotecas necessárias estão em /lib. O Busybox é um conjunto de utilitários vinculados estaticamente, portanto, a falta de bibliotecas não deve ser um problema. Faz:

su -c '/bin/busybox mv /usr_bak /usr'

(Embora o próprio Busybox também tenha um suapplet, o /bin/busyboxbinário não é setuid e, portanto, não funciona, a menos que seja executado como root.)

Se você não tiver uma senha root, provavelmente poderá usar a solução Gilles aqui usandoLD_LIBRARY_PATH , ou (Gilles diz que isso não funcionará com binários setuid como sudo), reinicie e edite o menu GRUB para inicializar init=/bin/busyboxcomo um parâmetro do kernel e mover a pasta de volta.

muru
fonte
73
Agora, não renomeie acidentalmente /lib.
Sleblanc 19/03/19
5
LD_LIBRARY_PATHnão ajudaria a executar o sudo, pois sudoé setuid. Se suas bibliotecas não estiverem no lugar certo, o sudo não funcionará até que a raiz o conserte.
Gilles 'SO- stop be evil' '
3
Nota histórica do @Yves: os sabores antigos do Unix (que são muito mais antigos que o Linux) incluíam uma pequena coleção de binários vinculados estaticamente /sbinexatamente para esse tipo de cenário: "Estou realizando alguma atividade em que bibliotecas de tempo de execução serão manipuladas, mas ainda precisa manipular arquivos ". Basicamente, a mesma abordagem antes do Busybox ser inventado. (O número de comandos disponíveis desta forma foi muito limitado, porque os binários ligados estaticamente devorar diskspace.)
Ti Strga
8
@Yves se você renomeado /lib, então você provavelmente terá que reiniciar parainit=/bin/busybox
Muru
3
@Yves: Inicialize a partir de um dispositivo USB, com uma distribuição ao vivo que pode montar seus sistemas de arquivos, e você está pronto para corrigir qualquer coisa. Mesmo baixando arquivos de substituição dos espelhos de pacotes, se você excluiu algo.
22618 Peter Cordes
33

Além da resposta de muru :

  • você poderia ter usado alguma chave USB de inicialização de resgate para reparar seu sistema; por exemplo, se o seu sistema for algum Debian ou Ubuntu, inicialize a chave USB de instalação no modo de recuperação e faça o apropriado mounte mve umount.

  • para ser capaz de reparar mais facilmente esses erros, eu geralmente também instalar um escudo estático com vários comandos internos (nomeadamente com alguns cp, rm, mvbuiltins -como), como sash(ele é empacotado em Debian e Ubuntu, e também disponível como faixa-3.8. tar.gz no formulário de origem) e inicialize com init=/bin/sashpassado para o Grub.

PS: sashé um pouco buggy e não é totalmente compatível com Posix, mas ainda é muito útil.

Basile Starynkevitch
fonte
Poderia explicar como instalar um shell estático com vários comandos internos? Existe algum manual?
Yves
1
No Debian ou Ubuntu: apt-get install sash. Mas você também pode baixar o sash-3.8.tar.gz e compilá-lo.
Basile Starynkevitch 19/03/19
Eu mantenho um liveiso no disco rígido com uma entrada grub personalizada para problemas como este. Não precisa ficar complicado, basta iniciar um sistema operacional ao vivo e manipular arquivos livremente :)
FreeSoftwareServers
3

Eu acho que a melhor maneira mais segura é reiniciar usando um sistema operacional inicializado por USB, CD ou DVD (Debian, Ubuntu, Suse, etc). Em seguida, monte a unidade que contém os problemas e renomeie.

Mais seguro do que inicializar em um campo minado com / usr ou / lib efetivamente ausente.

Larry
fonte
1
Você pode inicializar um ISO diretamente do Grub / HDD, sem a necessidade de USB / DVD, etc.
FreeSoftwareServers
0

Corri para um problema semelhante onde eu renomeado /usr/binpara /usr/bin_bkppor algum teste e, em seguida, eu não era capaz de mudar o nome (como o comando não encontrou o sudono diretório padrão que é /usr/bin) e, em seguida, fui para o /usr/bin_bkpdiretório manualmente (usando o Gerenciador de arquivos ) e a maioria das funções (incluindo a renomeação) no botão direito do mouse estão desabilitadas.

Tentei o seguinte comando e ele corrigiu o problema

$/usr/bin_bkp/sudo mv /usr/bin_bkp/ /usr/bin/

Invoquei o sudo do caminho atual e funcionou, agora tudo voltou ao normal.

SO: Xubuntu 14.04

nerd
fonte
-3

Não posso fazer isso agora (e não tenho certeza se gostaria), mas parece que deve funcionar para criar um novo "/ usr" como um link físico (não um link virtual) para o seu " / usr_bak e exclua o "/ usr_bak"

ln /usr_bak /usr
rm /usr_bak

O link físico criado por "ln" ( sem argumento "-s") no sistema de arquivos deve tornar os diretórios usr e usr_bak igualmente válidos para os diretórios em questão. "rm" apenas remove o link que você pediu para remover, não os dois. Como ainda existe um link válido para o conteúdo, eles devem permanecer acessíveis através do link restante em "/ usr".

TED
fonte
5
Fiquei com a impressão de que o Linux (ou pelo menos o Ubuntu) não permite links físicos para diretórios. Por exemplo, askubuntu.com/questions/210741/…
Chris Bouchard
4
@ Chris: Certo, o Linux não permite hardlinks de diretório (exceto .e .., portanto, a contagem de links em um diretório informa o número de subdiretórios de primeiro nível). Além disso, rmnão funciona em diretórios, você precisaria usar rmdir. ( lne rmtrabalhe com links simbólicos para diretórios, mas estamos falando de um diretório real). Além disso, isso não resolve o problema, porque requer rootexatamente o mesmo mv, por causa das permissões ativadas/ . Se você pudesse executar isso, poderia executar mvcomo uma pessoa normal.
Peter Cordes
2
Não há suporte para links diretos para diretórios na maioria (todos?) Do Unices porque é muito difícil para o software fazer um rastreamento recursivo do sistema de arquivos para detectar loops infinitos. É possível se o software acompanhar todos os inodes visitados e rastrear um sistema de arquivos com reconhecimento de inode (por exemplo, não o FAT32 / NTFS), mas verificar se há links simbólicos e não atravessá-los é muito mais fácil. Tudo o que é necessário é uma chamada rápida para lstat (2) para verificar o tipo de arquivo.
Penguin359
2
@Pryftan, o meu ln(1)no Debian diz isso para a opção -d/ -F/ --directory: "permite que o superusuário tente vincular diretórios (nota: provavelmente falhará devido a restrições do sistema, mesmo para o superusuário)" . Então você está livre para tentar, mas seu sistema de arquivos provavelmente não permitirá.
precisa
1
@TobySpeight Outro pensamento: veja também o link simbólico (7), que diz: Links físicos podem não se referir a diretórios (para evitar a possibilidade de loops na árvore do sistema de arquivos, o que confundiria muitos programas) e podem não se referir a arquivos em diferentes sistemas de arquivos (porque números de inode não são exclusivos nos sistemas de arquivos). Isso me faz pensar que a tentativa de link físico pode realmente ser a maneira de escrever outra coisa que acontece, a saber, que a função é chamada, mas falha exatamente porque é um diretório. (A referência do sistema de arquivos é o que eu estava pensando em outro comentário)
Pryftan