Eu estava trabalhando em um diretório chamado bin
. Depois que terminei, por causa da propriedade bin
e de alguns arquivos dentro dele, executei acidentalmente:
sudo rm -r /bin
Ao invés de:
sudo rm -r bin
Parece que minhas mãos costumavam adicionar um /
na frente de tudo que eu digito.
Como posso restaurar meu /bin
diretório?
Eu 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.
É possível?
Bem, os utilitários mais triviais e importantes estão instalados no
/bin
, e agora você perdeu o acesso a todos eles. Na verdade, se você reiniciar, seu sistema não poderá mais inicializar.De qualquer forma, vamos corrigir o problema e deixar
/bin
o conteúdo de o mais próximo possível de onde estava. A única diferença seriam alguns links simbólicos que também corrigiremos.Como?
Primeiro, devemos
chroot
entrar em seu sistema quebrado, mas com uma pequena diferença ! Depois disso, obteremos uma lista de pacotes instalados em 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 para/bin
. Então terminaremos.Por exemplo, após
chroot
, podemos obter uma lista de pacotes que possuem arquivos instalados/bin
usando:E também podemos usar:
para listar os arquivos instalados por esses pacotes em formato
/bin
.Em seguida, simplesmente criamos uma lista de todos os pacotes necessários para nós, baixamos e extraímos para
/bin
algo como:Porém devemos utilizar um script para verificar todos os pacotes instalados em nosso sistema, pois fazer isso manualmente é uma loucura.
Então eu escrevi um script que faz tudo o que precisamos. Ele encontra todos os pacotes necessários para restaurarmos
/bin
, nos mostra o nome de cada pacote e seus respectivos arquivos pertencentes/bin
. Aqui está uma captura de tela:Ao 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 deste script ou baixá-lo diretamente .
Vamos começar
chroot
Inicialize seu sistema com um disco ativo que tenha a mesma arquitetura do Ubuntu instalado, abra um terminal e obtenha acesso root:
Monte seu
root
sistema de arquivos (para mim é/dev/sda1
):Vamos precisar 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 na 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
chroot
um sistema quebrado quando não há/bin
diretório lá? Qual shell devemos executar?Portanto, crie um diretório bin temporário. por exemplo: nomeado
bintmp
na raiz do sistema quebrado:Em seguida, vincule o live
/bin
a isso:Faça o chroot no sistema enquanto define o
/bintmp/bash
como seu shell de login:Exporte
/bintmp
como suaPATH
variável de ambiente:Dê ao script o bit executável:
Execute o script:
Aguarde a conclusão da pesquisa e responda à pergunta que vimos na captura de tela. Ele começará a restaurar o
/bin
e estamos quase terminando.Feito isso, use CTRL+ Dpara sair do
chroot
ambiente e desmonte os caminhos montados:Reinicie o sistema.
Restaurando os links dentro
/bin
Agora quase todos os arquivos dentro do
/bin
diretório estão de volta, exceto cerca de 5 links simbólicos que são gerenciados porupdate-alternatives
.Em seu sistema em execução, execute:
Ele faz algumas perguntas; você pode simplesmente pressionar ENTERpara aceitá-los todos.
E agora terminamos.
Se o seu sistema atual ainda tiver um shell em execução e acesso à Internet, isso pode ser feito usando ferramentas existentes em outro local do sistema. Estou assumindo que você apenas excluiu arquivos
/bin
./bin
é claro que tem o utilitário mais conveniente que você pode usar em tal situação (busybox), mas sem isso, teremos que ser um pouco criativos.Como você já tem um shell em execução e já que
sudo
está em/usr/bin
, vamos obter um shell raiz em execução antes de causarmos mais danos. Mas/bin/bash
e a maioria das outras conchas sumiram! Felizmente, o Linux ainda possui uma cópia na memória do shell que você está usando. Então:Estritamente falando, não precisamos de um root shell para muito do que se segue. Mas mesmo assim.
Agora,
dpkg
ainda funciona, pelo menos para descobrir quais pacotes possuem arquivos em/bin
:Podemos usar
awk
para processá-lo e obter os nomes dos pacotesxargs
eapt-get
baixar os pacotes (tudo em/usr/bin
). Se você tiver um diretório temporário que possa usar,cd
porque seu diretório atual ficará um pouco confuso:Agora, o maior problema que temos é que
/bin/tar
está faltando, e sem ele,dpkg
não dá para extrair os arquivos. Podemos chegar a dois terços do caminho, porque:.deb
arquivos são na verdadear
arquivos (novamente em/usr/bin
):Composto por dois
.tar.*
arquivos,data
econtrol
:Enquanto os utilitários gzip estão em
/bin
,unxz
está em/usr/bin
:Agora temos um
data.tar
arquivo semtar
extrairtar
dele.Python para o resgate ! É aqui que
sudo
é realmente necessário:Agora podemos usar
dpkg
para extrair os arquivos deb restantes para obter um arquivo razoavelmente completo/bin
:No entanto, ainda devemos fazer uma instalação adequada dos arquivos deb, para que os links simbólicos etc. que seriam criados por pacotes sejam recriados:
Ou:
Notas:
Não podemos usar o Python 2 para extrair o
data.tar.xz
arquivo diretamente, pois o Python 2 suporta apenas compactação gzip e bzip2. O Python 3, no entanto, oferece suporte, portanto, você pode usar o Python 3 diretamente semunxz
:/bin/tar
, você ainda precisa extrair alguns dos arquivos deb antes de poder usarapt-get
: os shells, coreutils, etc. Mais fácil apenas extrair todos eles e reinstalar mais tarde.Você pode colocar temporariamente arquivos de um CD ao vivo ou de outro sistema
/bin
para torná-lo utilizável e, em seguida, substituí-los por arquivos de sua instalação do Ubuntu executandoapt-get install --reinstall
pacotes que tenham itens em/bin
.Algumas adições a esta excelente resposta , depois que encontrei esse problema (junto com a exclusão
/boot
de/etc
,/lib
e/lib64
):chroot
requer/lib
e/lib64
estar presente; caso contrário, você obterá o seguinte erro:failed to run command ‘/bin/bash’: No such file or directory
Copiei-os 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
podem ser facilmente restaurados usando as ferramentas do grub. Veja aqui .apt install --reinstall <package>
é uma ótima maneira de restaurar arquivos ausentes em/bin
,/lib
e/lib64
.libaio1
,mysql-server
,openvpn
,vsftpd
Nota para si mesmo:
rm -rf folder /*
não é o mesmo querm -rf folder/*