AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 906674
Accepted
Ravexina
Ravexina
Asked: 2017-04-20 07:02:13 +0800 CST2017-04-20 07:02:13 +0800 CST 2017-04-20 07:02:13 +0800 CST

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

  • 772

Eu estava trabalhando em um diretório chamado bin. Depois que terminei, por causa da propriedade bine 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 /bindiretó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.

command-line
  • 4 4 respostas
  • 35879 Views

4 respostas

  • Voted
  1. Best Answer
    Ravexina
    2017-04-20T07:02:13+08:002017-04-20T07:02:13+08:00

    É 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 /bino 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 chrootentrar 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 /bindiretó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 /binusando:

    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 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 /binalgo como:

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

    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:

    Captura de tela da lista de pacotes <code>/bin</code> como resultado do meu script

    Ao final optamos por reinstalar todos os pacotes ou apenas baixar e extrair os arquivos necessários para /bin(que é a opção recomendada):

    Captura de tela das opções fornecidas pelo meu script

    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:

    sudo -i
    

    Monte seu rootsistema de arquivos (para mim é /dev/sda1):

    mount /dev/sda1 /mnt
    

    Vamos precisar de conectividade com a Internet, então copie resolv.confdo Ubuntu ao vivo para sua partição raiz montada:

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

    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 baixá-lo 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 pequena diferença : como podemos chrootum sistema quebrado quando não há /bindiretório lá? Qual shell devemos executar?

    Portanto, crie um diretório bin temporário. por exemplo: nomeado bintmpna raiz do sistema quebrado:

    mkdir /mnt/bintmp
    

    Em seguida, vincule o live /bina isso:

    mount --bind /bin /mnt/bintmp
    

    Faça o chroot no sistema enquanto define o /bintmp/bashcomo seu shell de login:

    chroot /mnt /bintmp/bash
    

    Exporte /bintmpcomo sua PATHvariável de ambiente:

    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 vimos na captura de tela. Ele começará a restaurar o /bine estamos quase terminando.

    Feito isso, use CTRL+ Dpara sair do chrootambiente e desmonte os caminhos montados:

    umount -R /mnt
    

    Reinicie o sistema.

    Restaurando os links dentro/bin

    Agora quase todos os arquivos dentro do /bindiretório estão de volta, exceto cerca de 5 links simbólicos que são gerenciados por update-alternatives.

    Em seu sistema em execução, execute:

    sudo update-alternatives --all
    

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

    E agora terminamos.

    • 189
  2. muru
    2017-04-20T07:49:42+08:002017-04-20T07:49:42+08:00

    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 sudoestá em /usr/bin, vamos obter um shell raiz em execução antes de causarmos mais danos. Mas /bin/bashe 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:

    sudo /proc/$$/exe
    

    Estritamente falando, não precisamos de um root shell para muito do que se segue. Mas mesmo assim.

    Agora, dpkgainda funciona, pelo menos para descobrir quais pacotes possuem arquivos em /bin:

    dpkg -S /bin
    

    Podemos usar awkpara processá-lo e obter os nomes dos pacotes xargse apt-getbaixar os pacotes (tudo em /usr/bin). Se você tiver um diretório temporário que possa usar, cdporque seu diretório atual ficará um pouco confuso:

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

    Agora, o maior problema que temos é que /bin/tarestá faltando, e sem ele, dpkgnão dá para extrair os arquivos. Podemos chegar a dois terços do caminho, porque:

    1. .debarquivos são na verdade ararquivos (novamente em /usr/bin):

      ar x tar_*.deb
      
    2. Composto por dois .tar.*arquivos, datae control:

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

      unxz data.tar.xz
      

    Agora temos um data.tararquivo sem tarextrair tardele.

    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 dpkgpara extrair os arquivos deb restantes para obter um arquivo razoavelmente completo /bin:

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

    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:

    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 o data.tar.xzarquivo 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 sem unxz:

      sudo python3 -c 'import tarfile; tarfile.open("data.tar.xz").extractall("/")'
      
    2. Depois de voltar /bin/tar, você ainda precisa extrair alguns dos arquivos deb antes de poder usar apt-get: os shells, coreutils, etc. Mais fácil apenas extrair todos eles e reinstalar mais tarde.
    • 30
  3. Dmitry Grigoryev
    2017-04-21T03:21:18+08:002017-04-21T03:21:18+08:00

    Você pode colocar temporariamente arquivos de um CD ao vivo ou de outro sistema /binpara torná-lo utilizável e, em seguida, substituí-los por arquivos de sua instalação do Ubuntu executando apt-get install --reinstallpacotes que tenham itens em /bin.

    • 7
  4. mrtumnus
    2018-07-06T06:29:48+08:002018-07-06T06:29:48+08:00

    Algumas adições a esta excelente resposta , depois que encontrei esse problema (junto com a exclusão /bootde /etc, /libe /lib64):

    • chrootrequer /libe /lib64estar 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
    • Não posso 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
    • /bootpodem ser facilmente restaurados usando as ferramentas do grub. Veja aqui .
    • Como esta resposta recomenda, apt install --reinstall <package>é uma ótima maneira de restaurar arquivos ausentes em /bin, /libe /lib64.
      • Alguns pacotes que exigiram reinstalação: libaio1, mysql-server, openvpn,vsftpd

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

    • 1

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve