Eu estava trabalhando em um diretório chamado bin
. Depois que terminei, por causa da propriedade bin
e de alguns arquivos nele, executei acidentalmente:
sudo rm -r /bin
Ao invés de:
sudo rm -r bin
Parece que minhas mãos adicionavam um /
na frente de tudo que eu digito.
Como posso restaurar meu /bin
diretório?
Quero os mesmos arquivos que pertencem ao meu Ubuntu, não gosto de copiá-los e colá-los de um disco ativo ou de outro sistema em execução.
command-line
restore
Ravexina
fonte
fonte
/bin
Ubuntu não é apenas um link simbólico/usr/bin
atualmente? Então, tudo o que você precisa fazer é colocar o link simbólico de volta?/bin
não é um link simbólico/usr/bin
aqui, acho que seria contra oFHS
. também se verificarmos um pacote trivial comocoreutils
emzesty
(aqui) . podemos ver que muitas coisas serão instaladas/bin
ao lado do/usr/bin
, mas ainda assim pode ser um link, não sei./bin
, considerei algo que poderia acontecer com qualquer outra pessoa (com base em outra pergunta à qual respondi), então escrevi uma instrução para compartilhar meu conhecimento com outras pessoas :), embora eu aprecie todos os comentários, eles também são úteis para outras pessoas que vêm ler esta pergunta. Obrigado a todos;)Respostas:
É possível?
Bem, os utilitários mais triviais e importantes estão instalados
/bin
e agora você perdeu o acesso a todos eles. De fato, se você reiniciar, seu sistema não poderá mais inicializar.De qualquer forma, vamos corrigir o problema e tornar
/bin
o conteúdo o mais próximo possível de onde estava. A única diferença seria alguns links simbólicos que também serão corrigidos.Quão?
Primeiro, devemos
chroot
entrar no seu sistema danificado, mas com uma pequena diferença ! Depois disso, obteremos uma lista de pacotes instalados no seu sistema que possuem qualquer arquivo instalado no/bin
diretório, então vamos baixar apenas os pacotes necessários e extrair os arquivos necessários/bin
. Então estaremos prontos.Por exemplo, depois
chroot
, podemos obter uma lista de pacotes que instalaram arquivos/bin
usando:E também podemos usar:
para listar os arquivos instalados por esses pacotes no
/bin
.Em seguida, simplesmente criamos uma lista de todos os pacotes necessários para nós, depois baixamos e extraímos para
/bin
algo como:No entanto, devemos usar um script para verificar todos os pacotes instalados em nosso sistema, porque fazê-lo manualmente é apenas loucura.
Então, eu escrevi um script que faz tudo o que precisamos. Ele encontra todos os pacotes necessários para restauração
/bin
, mostra o nome de cada pacote e seus arquivos relacionados aos quais pertence/bin
. Aqui está uma captura de tela:No final, optamos por reinstalar todos os pacotes ou apenas baixar e extrair os arquivos necessários para
/bin
(que é a opção recomendada):Você pode pegar uma cópia desse script ou fazer o download diretamente .
Vamos começar
chroot
Inicialize seu sistema com um disco ativo com a mesma arquitetura do Ubuntu instalado, abra um terminal e obtenha acesso root:
Monte seu
root
sistema de arquivos (para mim é/dev/sda1
):Precisamos de conectividade com a Internet, então copie
resolv.conf
do Ubuntu ao vivo para sua partição raiz montada:Agora copie o script para algum lugar da partição montada, por exemplo:
ou você pode baixá-lo usando
wget
etc., como:Monte outros caminhos necessários:
E aqui está a pequena diferença : como podemos entrar
chroot
em um sistema danificado quando não há/bin
diretório lá? Qual shell devemos executar?Portanto, crie um diretório bin temporário. por exemplo: nomeado
bintmp
dentro da raiz do sistema corrompida:Em seguida, vincule a vida
/bin
a isso:Faça chroot no sistema enquanto define o
/bintmp/bash
como seu shell de login:Exporte a variável de ambiente
/bintmp
comoPATH
:Dê ao script o bit executável:
Execute o script:
Aguarde a pesquisa ser concluída e responda à pergunta que vimos na captura de tela. Ele começará a restaurar o
/bin
e estamos quase terminando.Depois de concluído, use CTRL+ Dpara sair do
chroot
ambiente e desmontar os caminhos montados:Reinicie o sistema.
Restaurando os Links dentro
/bin
Agora quase todos os arquivos no
/bin
diretório estão de volta, exceto cerca de 5 links simbólicos que são gerenciados porupdate-alternatives
.No seu sistema em execução, execute:
Ele faz algumas perguntas; você pode simplesmente pressionar ENTERpara aceitar todos eles.
E agora terminamos.
fonte
Se o seu sistema atual ainda tiver um shell em execução e acesso à Internet, isso poderá ser feito usando as ferramentas existentes em outras partes do sistema. Eu estou supondo que você apenas excluiu
/bin
./bin
é claro que possui o utilitário mais conveniente que você poderia usar em uma situação dessas (busybox), mas sem isso, teremos que ser um pouco criativos.Como você já possui um shell em execução e já
sudo
está dentro/usr/bin
, vamos obter um shell raiz em execução antes de causar mais danos. Mas/bin/bash
e a maioria das outras conchas se foram! Felizmente, o Linux ainda tem uma cópia na memória do shell que você está usando. Assim:A rigor, não precisamos de um shell raiz para muito do que se segue. Mas mesmo assim.
Agora,
dpkg
ainda funciona, pelo menos para descobrir quais pacotes têm arquivos/bin
:Podemos usá
awk
-lo para processá-lo, obter os nomes dos pacotesxargs
eapt-get
fazer o download dos pacotes (all in/usr/bin
). Se você tiver um diretório temporário que possa ser usadocd
, porque o diretório atual ficará um pouco confuso:Agora, o maior problema que temos é que
/bin/tar
está faltando e sem ele não édpkg
possível extrair os arquivos. Podemos obter dois terços do caminho até lá, porque:.deb
os arquivos são realmentear
arquivos (novamente em/usr/bin
):Composto por dois
.tar.*
arquivosdata
econtrol
:Enquanto os utilitários gzip estão
/bin
,unxz
está em/usr/bin
:Agora temos um
data.tar
arquivo semtar
extraítar
-lo.Python para o resgate ! É aqui que
sudo
é realmente necessário:Agora podemos usar
dpkg
para extrair os arquivos deb restantes para obter uma conclusão razoavelmente completa/bin
:No entanto, ainda devemos fazer uma instalação adequada dos arquivos deb, para que os links simbólicos etc. que seriam criados pelos pacotes sejam recriados:
Ou:
Notas:
Não podemos usar o Python 2 para extrair diretamente o
data.tar.xz
arquivo, pois o Python 2 suporta apenas a compressão gzip e bzip2. O Python 3, no entanto, suporta, então você pode usar o Python 3 diretamente semunxz
:/bin/tar
, você ainda precisa extrair alguns dos arquivos deb antes de poder usá-losapt-get
: shells, coreutils, etc. Mais fácil extrair todos eles e reinstalar mais tarde.fonte
/usr/bin
, eu disse o que quer que eu vá com chroot ... Incrível./proc/$$/exe
um link para/bin/bash
? como funciona quando/bin
é removido? (Está funcionando, mas como), pensei que deveria ser um link quebrado ... foi por isso que deixei essa idéia para trás.Você pode colocar temporariamente arquivos de um CD ao vivo ou outro sistema no seu
/bin
para tornar seu sistema utilizável e substituí-los por arquivos da instalação do Ubuntu executandoapt-get install --reinstall
pacotes que contenham/bin
.fonte
Algumas adições a este excelente resposta , depois eu encontrei esta questão (juntamente com exclusão
/boot
,/etc
,/lib
e/lib64
):chroot
requer/lib
e/lib64
estar presente; caso contrário, você receberá o seguinte erro:failed to run command ‘/bin/bash’: No such file or directory
Eu os copiei do LiveCD OS e não tive problemas para restaurar. YMMV, dependendo dos pacotes que você instalou no sistema
cp /etc/resolv.conf /mnt/etc/resolv.cof
deve ser
cp /etc/resolv.conf /mnt/etc/resolv.conf
/boot
pode ser facilmente restaurado usando ferramentas grub. Veja aqui .apt install --reinstall <package>
é uma ótima maneira de restaurar arquivos ausentes no Windows/bin
,/lib
e/lib64
.libaio1
,mysql-server
,openvpn
,vsftpd
Nota para si mesmo:
rm -rf folder /*
não é o mesmo querm -rf folder/*
fonte