systemd-nspawn: Recuperando um sistema Linux quebrado!

Hoje usaremos algo parecido com um Chroot para iniciar e tentar restaurar um sistema Linux totalmente quebrado utilizando o systemd-nspawn!


| Se você apoia nosso site, desative o AdBlock quando visitá-lo, inclusive em Mobile!
Os anúncios são poucos e não invasivos. Se quiser contribuir com nosso trabalho, clique em qualquer banner de sua preferência, exceto dos Parceiros. 
Mais detalhes clicando aqui.


1. Introdução

Imagine a seguinte situação:

Você está tranquilo e feliz atualizando um sistema baseado no ArchLinux. De repente, acaba a energia enquanto o sistema era instalado/configurado. Ao tentar iniciar novamente, o sistema está corrompido, sem erros, sem kernel panic, ele apenas não continua o processo de boot normal e não inicializa mais.

Ou seja, a situação pede que você faça um chroot: Inicie um sistema Linux via USB por pendrive, e use esse sistema pra consertar o sistema que estava instalado – não é o caso de formatação. Como proceder?

1.1 Chroot ou Enjaulamento

O conceito de enjaular um sistema é algo antigo e eu até citei ele anteriormente aqui na Linux Universe quando falei dos Containers e da minha distro SmolUbuntu 22.04. O ponto é que enjaular um sistema Linux consiste em estar com o sistema configurado num HD, seja ele com defeito ou não, e ai você inicia um pendrive LiveUSB de outro sistema Linux e, com este, ENJAULA, enxerta, amarra o sistema do pendrive com o sistema do HD, inicializando-o como se sob muletas.

Ou seja, o sistema que já existia no computador se torna funcional, acessível e pode receber uma manutenção adequada!

Até alguns anos eu só conhecia o enjaulamento por debootstrap e/ou utilizar o mount com opção –bind pra subir cada pedaço do sistema:

sudo mount --bind /proc ~/chroot-jail/proc/
sudo mount --bind /sys ~/chroot-jail/sys/
sudo mount --bind /dev ~/chroot-jail/dev/

E isso é péssimo. Criam-se problemas de permissão e o sistema LiveUSB pode até ficar instável se o chroot for mal executado!

Foi então que procurando uma solução para uma quebra de um dos meus EndeavourOS – baseado em ArchLinux – eu achei uma solução muito melhor que funciona de forma simples e amigável para qualquer sistema Linux!

2. systemd-nspawn

Falem bem ou falem mal, o SystemD trouxe uma miríade de possibilidades/ferramentas para os diversos sistemas Linux atuais e uma delas é o systemd-nspawn. De forma resumida ele permite inicializar o sistema Linux que está instalado em um dispositivo como se fosse uma imagem de um container!

Ao contrário de ferramentas como Docker e Rocket, o systemd não requer uma imagem de container para iniciar um container; ele pode iniciar um root em qualquer ponto do sistema de arquivos existente. Isso é feito usando a ferramenta systemd-nspawn, que criará os namespaces de sistema necessários e iniciará o processo inicial no container e, em seguida, fornecerá um terminal nesse contêiner. Em contraste com chroot, que altera apenas a raiz aparente do sistema de arquivos, este tipo de container terá um namespace de sistema de arquivos separado, sistemas de arquivos adequados montados em /dev , /run e /proc , e um namespace de processo e namespaces IPC separados.

Se você não conhece o conceito de containers, entenda que é como pegar seu HD e montá-lo como um pendrive usando um outro sistema que deu boot por LiveUSB, porém também, paralelamente, dando boot no sistema do HD permitindo que ele receba comandos, internet e outros recursos do sistema que foi inicializado por LiveUSB, como se fosse uma máquina virtual.

Tá, e como eu procedo? Faça o seguinte!

3. Passo a Passo

Primeiro o computador precisa estar desligado com um sistema Linux no HD/SSD/NVMe que requer manutenção – ou não, pode ser algo funcional também. E certifique-se de que esse sistema possui o systemd-nspawn instalado – pré-instalado nas bases ArchLinux e Ubuntu, geralmente sistemas com o SystemD como padrão, ou seja, a maioria.

No meu caso tenho um sistema de boot EFI que está assim: /dev/sda1 é a partição EFI e /dev/sda2 é a principal EXT4.

Isso pode variar dependendo do seu caso, poderia ser /dev/nvmen1p1 ou outra.

Com isso considerado, plugue um pendrive com um sistema Linux liveUSB e inicie o pendrive!

Em meus testes eu dei boot no Ubuntu Server com uma imagem do ArchLinux. Por utilizarmos o SystemD como base, ele é sempre o mesmo, independente da distro.

Pendrive inicializado? Tanto faz se somente terminal ou com uma interface, os comandos são:

Monte o sistema principal em um caminho qualquer, pode ser em /mnt

$ sudo mount /dev/sda2 /mnt

Se for com EFI, monte a partição EFI no caminho padrão que no meu caso era /boot/efi, ou seja, em /mnt/boot/efi.

$ sudo mount /dev/sda1 /mnt/boot/efi

Agora vem a mágica. Digite o seguinte comando:

$ sudo systemd-nspawn -b -D /mnt

Os parâmetros -b são para boot e -D para definir um diretório aonde está o sistema operacional desejado. Aguarde.
Você verá o seu sistema carregando normalmente bem na sua frente!

3.1 Recursos

Se o LiveUSB inicializou com internet, ela será repassada ao container do seu sistema agora inicializado.

Portanto poderá instalar ou remover pacotes com os comandos padrão da sua distro, sejam eles o pacman para o ArchLinux ou apt para o Ubuntu e seus derivados.

Do mesmo modo, poderá reinstalar/reconfigurar o GRUB2 ou fazer alterações no /etc/fstab com o sistema nesse estado.

3.2 Restaurando ArchLinux e sistemas baseados nele

Nesse quesito a família Archlinux e seus asseclas – Manjaro, EndeavourOS, etc – tem uma vantagem: Uma vez que você estiver no terminal e deu boot pelo systemd-nspawn, execute este comando:

$ sudo pacman -Qqn | sudo pacman -S - --overwrite '*'

Ele fará uma reinstalação completa de TODOS OS PACOTES do sistema atualmente instalados! Ou seja, se algo quebrou ou corrompeu será reinstalado e sobrescrito. Perfeito para quando há erros em bibliotecas ou dependências, muitas vezes por corrompimento de um upgrade, e você não faz muita ideia de qual o real pacote danificado.

Nos meus testes não houve perdas de dados do usuário ou de configurações de aplicativos mas é bom lembrar: Faça tal comando por sua conta e risco!

4. Encerrando

Uma vez terminadas as configurações/manutenções, saia do terminal com exit, depois CTRL + ] pressionado 3x seguidas.

Desmonte o sistema:

$ sudo umount /mnt/boot/efi
$ sudo umount /mnt

E reinicie! Remova o pendrive, seu sistema deve voltar ao normal sem maiores sequelas

5. Conclusão

O SystemD tem uma série de recursos que facilitam a vida de quem trabalha/usa Linux, e com certeza de tudo que já estudei por aí, o systemd-nspawn é uma das mais impressionantes.

Tal ferramenta não apenas permite dar manutenção de forma facilitada a qualquer distro, mas também permite que qualquer distro seja utilizada para tal manutenção: Posso usar um Ubuntu MATE pra consertar um ArchLinux ou mesmo usar o Fedora pra corrigir o Manjaro.

O comando é sempre o mesmo, a lógica é sempre a mesma!

Fonte:
opensource.com

Deixe um comentário