Trazendo a VM webserver de volta à vida

Ao fim do mês de abril de 2015, o volume RAID do servidor cefala2 começou a falhar e, de maneira esporádica e imprevisível, o sistema se tornava "read-only". Nesta mesma época, eu decidi, de maneira impensada obviamente, fazer a atualização do sistema Debian da wheezy para a jessie, apesar das nuvens negras que apareciam naquele não tão belo horizonte.

Não deu outra. Durante a atualização do sistema via aptitude dist-upgrade, o volume RAID falhou de novo e o sistema ficou num estado de morte cerebral. Como bem diz o Hani, o ponto nevrálgico do sistema foi atingido, pois a atualização do GRUB ficou pelo meio do caminho.

Em 1º de maio, dia em que tive muito trabalho com o sistema, desci às profundezas do inferno (i.e. mount em loop device), dominei o Cérbero (i.e. chroot), negociei com o Hades (i.e. GRUB) e trouxe de volta ao mundo dos vivos o servidor webserver. Segue abaixo o relato passo à passo da minha Odisseia, durante a qual vesti o manto de root no arcano mundo do cefala2.

A imagem da VM será montada como um dispositivo loop e ficará disponível como um disco do sistema. Para tanto, devemos obter o primeiro dispositivo loop do sistema que esteja livre:

# LOOPDEV=$(sudo losetup -f | sed s:/dev/::)

No meu caso, foi:

# echo $LOOPDEV
loop0

En seguida, associei a imagem da VM a este dispositivo loop (ATENÇÃO: a VM tem que estar completamente desligada neste momento, ou seja, shutoff):

# losetup /dev/$LOOPDEV /home/images_kvm/WinImages/CEFALA_VMs/CEFALAServer.img

Usei o kpartx para criar os dispositivos neste disco virtual:

# kpartx -av /dev/$LOOPDEV
add map loop0p1 (253:0): 0 58591232 linear /dev/loop0 2048
add map loop0p2 (253:1): 0 15624192 linear /dev/loop0 58593280
add map loop0p3 (253:2): 0 97656832 linear /dev/loop0 74217472
add map loop0p4 (253:3): 0 876699648 linear /dev/loop0 171874304

Verifiquei que as partições foram criadas corretamente:

# ls -alF /dev/mapper
total 0
drwxr-xr-x  2 root root     140 Mai  1 03:36 ./
drwxr-xr-x 16 root root    3880 Mai  1 03:36 ../
crw------T  1 root root 10, 236 Abr 30 10:34 control
lrwxrwxrwx  1 root root       7 Mai  1 03:36 loop0p1 -> ../dm-0
lrwxrwxrwx  1 root root       7 Mai  1 03:36 loop0p2 -> ../dm-1
lrwxrwxrwx  1 root root       7 Mai  1 03:36 loop0p3 -> ../dm-2
lrwxrwxrwx  1 root root       7 Mai  1 03:36 loop0p4 -> ../dm-3

Em seguida, criei um ponto de montagem no sistema:

# mkdir -p /mnt/vm

Aí, já pude montar as partições (na verdade, eu tive que fazer uns testes antes para descobrir onde estavam as partições /, /home e /var, além da partição de swap):

# mount /dev/mapper/${LOOPDEV}p1 /mnt/vm
# mount /dev/mapper/${LOOPDEV}p3 /mnt/vm/home
# mount /dev/mapper/${LOOPDEV}p4 /mnt/vm/var

Para que o chroot funcione corretamente mais tarde, é preciso também montar os sistemas de arquivos udev, proc e sysfs do kernel no futuro ponto raiz de chroot:

# mount --bind /proc /mnt/vm/proc
# mount --bind /sys /mnt/vm/sys
# mount --bind /dev /mnt/vm/dev

Neste ponto, estamos prontos para lançar o chroot e entrar, virtualmente, na máquina VM webserver:

# chroot /mnt/vm

À partir daí, usei o dpkg --configure -a e o aptitude para consertar o sistema. O problema de boot da webserver vinha do pacote GRUB, cuja atualização tinha sido interrompida brutalmente pelo apagão em Terra Brasilis. O problema foi corrigido ao reinstalar o MBR (master boot record) na imagem da VM, o que foi feito desta maneira:

# echo "(hd0) /dev/loop0" > /boot/grub/device.map
# grub-install /dev/loop0
# update-grub
# rm -f /boot/grub/device.map
# exit

Depois disto, de volta ao cefala2, desfiz as montagens das partições e liberei o dispositivo loop:

# umount /mnt/vm/dev
# umount /mnt/vm/sys
# umount /mnt/vm/proc
# umount /mnt/vm/var
# umount /mnt/vm/home
# umount /mnt/vm
# kpartx -d /dev/$LOOPDEV
# losetup -d /dev/$LOOPDEV

A partir daí, basta ressuscitar a VM moribunda, apertando no botão "Run" do virt-manager ou através de virsh start CEFALAServer.

social