É 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
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.