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
.