Qual é a maneira correta de preparar o chroot para recuperar uma instalação quebrada do Linux?

52

Esta pergunta está relacionada a perguntas frequentes. O procedimento é freqüentemente mencionado ou vinculado ao local externo, mas não é frequentemente definido de forma clara e correta. Com o objetivo de concentrar informações úteis em um só lugar, essa pergunta procura fornecer uma referência clara e correta para esse procedimento.


Quais são as etapas adequadas para preparar um ambiente chroot para um procedimento de recuperação?

Em muitas situações , é melhor reparar a instalação quebrada do Linux de dentro da instalação. Mas se o sistema não inicializa, como você o corrige de dentro?

Vamos supor que você consiga inicializar em um sistema alternativo. Uma vez lá, você precisa acessar sua instalação quebrada para corrigi-la. Muitas instruções da recuperação recomendam o uso do chroot para executar programas como se você realmente estivesse inicializando na instalação interrompida.

  • Qual é o procedimento básico?
  • Existem práticas recomendadas a serem seguidas?
  • Quais variáveis ​​precisam ser consideradas para adaptar as etapas básicas de preparação a uma tarefa de recuperação específica?

Como este é o Community Wiki, fique à vontade para editar esta pergunta para melhorá-la também.

quack quixote
fonte

Respostas:

72

Aqui estão alguns recursos:

"Alterar raiz" ou "chrooting" é um método para ampliar parte de seu sistema de arquivos, de modo que, por exemplo, /pathse refira ao que era anteriormente acessível em /mnt/path. A "raiz" na expressão "chroot" refere-se ao sistema de arquivos raiz /, não ao usuário raiz. (Embora normalmente você precise de privilégios de usuário root para fazer chroot.)

Preparação

  • Todas as etapas deste guia deverão ser executadas como usuário root.

  • Supomos que seu disco rígido esteja em / dev / sda1 e seu tipo de arquivo seja ext3. Se você não souber o local e o tipo de arquivo do seu disco, leia a saída de fdisk -l.

  • Certifique-se de que as arquiteturas do sistema no qual você inicializou (por exemplo, é um LiveCD de 32 bits) e o sistema que você deseja acessar (por exemplo, é uma instalação de 32 bits no disco rígido) coincidem. Você pode determinar a arquitetura inicializada usando uname -m.

  • Verifique se todos os módulos do kernel que você precisa foram carregados.

  • Configure sua rede, se necessário (por exemplo, para instalar pacotes atualizados).

  • Inicialize sua partição swap, se necessário (por exemplo, swapon /dev/sda3).

Executando o chroot

cd /
mount -t ext3 /dev/sda1 /mnt
mount -t proc proc /mnt/proc
mount -t sysfs sys /mnt/sys
mount -o bind /dev /mnt/dev

Se o seu /bootdiretório estiver em uma partição diferente da sua /e você quiser manipular arquivos nele (por exemplo, se você estiver trabalhando com o GRUB, executando uma atualização do kernel, etc.), também será necessário montar essa partição. Se estiver em / dev / sda2 e seu tipo de arquivo for ext2, faça:

mount -t ext2 /dev/sda2 /mnt/boot

Da mesma forma, para quaisquer outras partes do seu sistema de arquivos ( /var, /usr) que residem em partições separadas, mas às quais você precisa acessar. Geralmente, quando você está fazendo um chroot para corrigir algo que não precisa acessar / home, não precisa se preocupar com isso.

(Também é possível montar sistemas de arquivos depois de executar o chroot, mas é mais inteligente fazê-lo antes. O motivo é que, quando você faz isso depois, o ambiente externo / do kernel não sabe sobre os sistemas de arquivos montados, por isso, se você esquecer de desmontá-los antes de sair do chroot, o sistema também não saberá desmontá-los quando desligar. Isso pode danificar esses sistemas de arquivos.)

Se você configurou sua rede e deseja usá-la no sistema com chroot, copie-o /etc/resolv.confpara poder resolver nomes de domínio:

cp -L /etc/resolv.conf /mnt/etc/resolv.conf

Agora você está pronto para mudar para o sistema de arquivos montado:

chroot /mnt /bin/bash

(Se isso retornar um erro chroot: cannot run command '/bin/bash': Exec format error, isso geralmente indica que você inicializou com uma arquitetura (por exemplo, x86_32) e está tentando executar o chroot em outra (por exemplo, x86_64). A solução é usar um LiveCD que tenha a mesma arquitetura do sistema que você deseja. chroot em.)

Neste ponto, você ainda está executando o kernel com o qual inicializou, mas todos os caminhos /pathse referem ao que costumava ser /mnt/path.

Se você estiver fazendo alguma coisa com o GRUB, precisará garantir que seu /etc/mtabarquivo esteja atualizado:

grep -v rootfs /proc/mounts > /etc/mtab

Também pode ser útil neste momento:

source /etc/profile
export PS1="(chroot) $PS1"  # add a reminder to your prompt

Faça seu trabalho sujo

Neste ponto, você pode executar qualquer solução de problemas que precisar fazer:

  • reinstalar o GRUB no MBR do seu disco
  • redefinir uma senha esquecida
  • executar uma atualização do kernel (ou downgrade)
  • reconstrua seu initramdisk
  • corrija seu / etc / fstab
  • reinstalar pacotes usando seu gerenciador de pacotes
  • tanto faz

Limpando

Quando terminar, verifique se todos os programas em execução foram interrompidos. Então saia do chroot:

exit

Agora desmonte todas as partições que você montou:

umount /mnt/boot # if you mounted this or any other separate partitions
umount /mnt/{proc,sys,dev}

Por fim, tente desmontar o disco rígido:

umount /mnt

Se você receber um erro dizendo que / mnt (ou qualquer outra partição) está ocupado, isso pode significar uma das duas coisas:

  • Um programa foi deixado em execução dentro do chroot.

  • Ou com mais frequência: ainda existe um ponto de montagem nessa montagem. Por exemplo, / mnt / usr ainda está montado ao tentar desmontar / mnt.

Neste último caso, simplesmente desmonte o ponto de montagem incorreto primeiro. Para obter um lembrete de todos os pontos de montagem atuais, execute mountsem parâmetros.

Finalmente:

reboot
dubiousjim
fonte
10
Como preparação, costumo deixar um script chamado chroot.shna raiz de todos os sistemas que uso, cujo conteúdo corresponde mais ou menos ao acima. Quando preciso fazer chroot nesse sistema a partir de um LiveCD ou algo assim, basta montar o sistema de arquivos raiz e executar o script chroot. Não há mais buscas frenéticas pelos comandos certos.
Ryan Thompson
4
Você, senhor, salvou meu bacon - um artigo brilhante. Em situações como essa, eu gostaria que o SO tivesse um botão +1000.
Zelanix 6/01/16
1
Use isto: SHELL=/bin/bash chroot /mntse o SHELL padrão do livecd não estiver no ambiente chroot (o defalut zsh do systemrescuecd é um exemplo) para corrigir, por exemplo, !no Vim.
Alois Mahdal
Eu descobri que você também precisa montar /runesses dias com mount --bind /run /mnt/run.
cengique 27/01