Acidentalmente removido / bin. Como faço para restaurá-lo?

89

Eu estava trabalhando em um diretório chamado bin . Depois que terminei, por causa da propriedade de bin e alguns arquivos dentro dele, eu acidentalmente corri:

sudo rm -r /bin

Em vez de:

sudo rm -r bin

Parece que minhas mãos costumavam adicionar um / na frente de tudo que eu digito.

Como posso restaurar meu diretório /bin ?

Eu quero os mesmos arquivos que pertencem ao meu Ubuntu, eu não gosto de copiar e colá-los a partir de um disco ao vivo ou outro sistema em execução.

    
por Ravexina 19.04.2017 / 17:02

4 respostas

177

É possível?

Bem, os utilitários mais triviais e importantes são instalados em /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 tornar o conteúdo de /bin o mais próximo possível de onde ele estava. A única diferença seria alguns links simbólicos que também corrigiremos.

Como?

Primeiro, devemos chroot no 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 diretório /bin , então vamos fazer o download apenas dos pacotes necessários e extrair os arquivos necessários em /bin . Então estaremos prontos.

Por exemplo, após chroot , podemos obter uma lista de pacotes que instalaram arquivos em /bin usando:

dpkg --search /bin | cut -f1 -d: | tr ',' '\n'

E também podemos usar:

dpkg --listfiles PACKAGE-NAME | grep "^/bin/" # or awk '$0 ~ "^/bin/

para listar arquivos instalados por esses pacotes em /bin .

Então, simplesmente criamos uma lista de todos os pacotes que são necessários para nós, baixá-los e extraí-los para /bin com algo como:

xargs apt download < list-packages
dpkg-deb -x PACKAGE .
mv ./bin/* /bin

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 que precisamos. Ele encontra todos os pacotes necessários para restaurar /bin , mostra o nome de cada pacote e seus arquivos relacionados que pertencem a /bin . Aqui está uma captura de tela:

Nofinal,escolhemosreinstalartodosospacotesouapenasbaixareextrairosarquivosnecessáriospara/bin(queéaopçãorecomendada):

Vocêpodepegar uma cópia deste script ou faça o download diretamente .

Vamos começar

chroot

Inicialize seu sistema com um disco ao vivo que tenha a mesma arquitetura do seu Ubuntu instalado, abra um terminal e obtenha acesso root:

sudo -i

Monte seu sistema de arquivos root (para mim, é /dev/sda1 ):

mount /dev/sda1 /mnt

Nós precisaremos de conectividade com a Internet, então copie resolv.conf do Ubuntu ao vivo para sua partição raiz montada:

cp /etc/resolv.conf /mnt/etc/resolv.cof

Agora copie o script para algum lugar na partição montada, por exemplo:

cp /media/ubuntu/usb/restore-bin.sh /mnt/restore-bin.sh

ou você pode fazer o download usando wget , etc., como:

wget https://git.io/v9fRm -O /mnt/restore-bin.sh

Monte outros caminhos necessários:

mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
mount -t proc /proc /mnt/proc

E aqui está a menor diferença : como podemos chroot para um sistema quebrado quando não há diretório /bin lá? Qual shell devemos executar?

Portanto, crie um diretório bin temporário. Por exemplo: nome bintmp na raiz do seu sistema quebrado:

mkdir /mnt/bintmp

Em seguida, ligue o live /bin no seguinte:

mount --bind /bin /mnt/bintmp

Chroot no sistema ao definir o /bintmp/bash como seu shell de login:

chroot /mnt /bintmp/bash

Exporte a /bintmp como sua variável de ambiente PATH :

export PATH=/bintmp:$PATH

Dê ao script o bit executável:

chmod +x restore-bin.sh

Execute o script:

./restore-bin.sh

Aguarde a conclusão da pesquisa e responda à pergunta que visualizamos na captura de tela. Ele vai começar a restaurar o /bin e estamos quase terminando.

Depois disso, use CTRL + D para sair do ambiente chroot e desmonte os caminhos montados:

umount -R /mnt

Reinicie o sistema.

Restaurando os links dentro de /bin

Agora, quase todos os arquivos no diretório /bin estão de volta, exceto em torno de 5 links simbólicos gerenciados por update-alternatives .

No seu sistema em execução, execute:

sudo update-alternatives --all

Ele faz algumas perguntas; você pode simplesmente pressionar ENTER para aceitá-los todos.

E agora estamos prontos.

    
por Ravexina 19.04.2017 / 17:02
26

Se o seu sistema atual ainda tiver um shell em execução e acesso à Internet, isso pode ser feito usando ferramentas existentes em outros locais do sistema. Estou supondo que você excluiu apenas /bin . O /bin , é claro, tem o utilitário mais conveniente que você poderia 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 como sudo está em /usr/bin , vamos criar um shell raiz antes de causar mais danos. Mas /bin/bash e a maioria das outras camadas sumiram! Felizmente, o Linux ainda tem uma cópia na memória do shell que você está usando. Então:

sudo /proc/$$/exe

Estritamente falando, não precisamos de um shell de raiz para grande parte do que se segue. Mas de qualquer maneira.

Agora, dpkg ainda funciona, pelo menos para descobrir quais pacotes têm arquivos em /bin :

dpkg -S /bin

Podemos usar awk para processá-lo e obter os nomes dos pacotes e xargs e apt-get para fazer o download dos pacotes (todos em /usr/bin ). Se você tem um diretório temporário que pode usar, cd , porque seu diretório atual vai ficar um pouco bagunçado:

dpkg -S /bin | awk -F '[, :]' '{NF--}1' | xargs apt-get download

Agora, o maior problema que temos é que /bin/tar está faltando e, sem ele, dpkg não pode extrair os arquivos. Podemos conseguir dois terços do caminho até lá, porque:

  1. .deb arquivos são, na verdade, ar archives (novamente em /usr/bin ):

    ar x tar_*.deb
    
  2. Consistindo em dois .tar.* archives, data e control :

    $ echo *.tar.*
    control.tar.gz data.tar.xz
    
  3. Enquanto os utilitários gzip estão em /bin , unxz está em /usr/bin :

    unxz data.tar.xz
    

Agora, temos um arquivo data.tar sem tar para extrair tar dele.

Python para o resgate ! É aqui que sudo é realmente necessário:

$ sudo python -c 'import tarfile; tarfile.open("data.tar").extractall("/")'
$ echo /bin/*
/bin/tar

Agora podemos usar dpkg para extrair os arquivos deb restantes para obter um /bin razoavelmente completo:

for i in *.deb; do dpkg-deb -x "$i" /; done

No entanto, devemos ainda fazer uma instalação apropriada dos arquivos deb, para que os links simbólicos etc. que seriam criados pelos pacotes sejam recriados:

sudo apt install --reinstall ./*.deb

Ou:

sudo dpkg -i *.deb
sudo apt-get install -f

Notas:

  1. Não podemos usar o Python 2 para extrair diretamente o arquivo data.tar.xz , já que o Python 2 só suporta compactação gzip e bzip2. O Python 3, no entanto, suporta isso, então você pode usar o Python 3 diretamente sem unxz :

    sudo python3 -c 'import tarfile; tarfile.open("data.tar.xz").extractall("/")'
    
  2. Depois de recuperar /bin/tar , você ainda precisa extrair alguns dos arquivos deb antes de poder usar apt-get : shells, coreutils, etc. É mais fácil extrair todos eles e reinstalar mais tarde.
por muru 19.04.2017 / 17:49
7

Você poderia temporariamente colocar arquivos de um live CD ou outro sistema no seu /bin para tornar seu sistema utilizável, então substituí-los por arquivos da sua instalação do Ubuntu executando apt-get install --reinstall para pacotes que tem coisas em /bin .

    
por Dmitry Grigoryev 20.04.2017 / 13:21
0

Algumas adições a esta excelente resposta , depois que eu encontrei esse problema (junto com a exclusão de /boot , /etc , /lib e /lib64 ):

  • chroot requer que /lib e /lib64 estejam presentes; caso contrário, você receberá o seguinte erro:
    failed to run command ‘/bin/bash’: No such file or directory
    Copiei esses arquivos do LiveCD OS e não tive problemas para restaurar. YMMV dependendo dos pacotes que você instalou no sistema
  • Não consigo editar a resposta mencionada acima, mas há um erro de digitação:
    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 do grub. Veja aqui .
  • Como esta resposta recomenda, apt install --reinstall <package> é uma ótima maneira de restaurar arquivos ausentes em /bin , /lib e /lib64 .
    • Alguns pacotes que exigiam reinstalação: libaio1 , mysql-server , openvpn , vsftpd

Nota para si mesmo:% rm -rf folder /* não é o mesmo que rm -rf folder/*

    
por 05.07.2018 / 16:29