Don't go /home-less!

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!

social