Recentemente, o servidor kvm
teve de ser reinicializado de maneira brutal
e as VMs que são nele abrigadas não foram enviadas em hibernação, como
deveriam ter sido. Quando kvm
retorna à vida, algumas das VMs que estão
em seu bojo não são inicializadas corretamente. Isto acontece porque a
partição /home
, disponibilizada pela VM nfs
ainda não está disponível
via NFS quando as outras VMs git
, a dev
e a sci
tentam montá-la.
Este problema poderia ser corrigido com um script de hook no servidor kvm
colocado em /etc/libvirt/hooks/qemu
. Este script é chamado várias vezes
durante a inicialização de cada VM. Por exemplo, ele é chamado quando
libvirt terminou de fazer o labeling de todos os recursos mas ainda não
inicializou a VM hospedada, desta forma:
/etc/libvirt/hooks/qemu guest_name start begin -
Neste caso, bastaria colocar no script de hook o seguinte código:
#!/bin/sh
if [ "$2" = start -a "$1" != CEFALA-NFS ] ; then
sleep 60
fi
Entretanto, como o Arlindo bem lembrou, existem dezenas de opções para Ligar e Desligar as VMs e seria um tanto crítico intervir com hooks em algo tão simples, que pode afetar o desligamento correto das VMs (caso esse sleep seja executa muitas vezes durante a hibernação a VM corre o risco de ultrapassar o timeout e ser encerrada abruptamente).
Resolvemos, então, adotar um outro método, baseado no script cron
/etc/cron.hourly/mount-home
contendo o seguinte código:
#!/bin/sh
grep -q '172.16.10.1:/home' /etc/mtab || mount -a
Este script foi integrado no repositório Git cefala-vm-conf
(descrito em
um outro artigo deste blog). Para
instalá-lo em cada VM, basta fazer:
$ git clone cefala-admin@git.cefala.org:cefala-vm-conf.git
$ cd cefala-vm-conf
$ sudo make cron
P.S.: O título deste post não tem nada a ver com os Shoulders e a sua canção!