Et oui… ça n’arrive pas qu’aux autres !
Une instance nova qui ne démarre plus et c’est le drame, les collègues courent dans tous les sens.
Avons-nous des sauvegardes ? Non ? Quoi ?
Ahhhhh !!! Mais qu’allons-nous dire au client ?
En théorie il existe une solution, je dis bien en théorie car si l’image de l’instance est gravement corrompue alors dans ce cas c’est le drame. 😀
qemu-nbd, un ami qui vous veut du bien
Les instances nova sont dans notre cas des instances KVM/Qemu et donc par conséquent encapsulée dans un disque de type QCOW2 ou RAW.
La solution consiste à utiliser la commande qemu-nbd qui permet de monter le disque d’une instance dans un répertoire et donc :
- De récupérer des données (votre client sera content…)
- De réparer une instance (réseau par exemple)
Le disque de l’instance sera accessible via le périphérique de bloc /dev/nbd0. Par défaut il existe 16 blockdevice de ce type, cela ce paramètre lors du chargement du module via la commande modprobe (nbd max_part=24). Un petit modinfo sur le module nbd nous permet d’obtenir cette information :
# modinfo nbd
Résultat :
filename: /lib/modules/3.8.0-29-generic/kernel/drivers/block/nbd.ko license: GPL description: Network Block Device srcversion: BF45D7CA1A39D7C71128C84 depends: intree: Y vermagic: 3.8.0-29-generic SMP mod_unload modversions parm: nbds_max:number of network block devices to initialize (default: 16) (int) parm: max_part:number of partitions per device (default: 0) (int) parm: debugflags:flags for controlling debug output (int)
Go Go Go !
Dans un premier temps il est nécessaire d’obtenir des informations sur l’instance en question :
- Le compute sur lequel est exécutée l’instance
- Le nom de l’instance en question
Ces informations s’obtiennent via la commande nova show ID. C’est bon, toutes les informations sont entre vos mains ? Dans l’exemple ci-dessous, notre instance aura pour nom : instance-00000682
On liste les instances en cours d’exécutions :
# virsh list
Résultat :
Id Name State ---------------------------------------------------- 444 instance-00000682 running
L’instance doit être suspendue :
# virsh suspend 444
Par défaut, les instances nova se trouvent dans le répertoire /var/lib/nova/instances/ (en fonction de comment nova a été configuré).
# cd /var/lib/nova/instances/instance-00000682/
Passons aux choses sérieuses !
# qemu-nbd -c /dev/nbd0 `pwd`/disk
Si aucun message d’erreur apparaît alors un fichier périphérique de bloc nommé /dev/nbd0p1 est créé. Il ne reste plus qu’à monter le disque (et sa partition) /dev/nbd0p1 dans le répertoire /mnt/
# mount /dev/nbd0p1 /mnt/
À partir de maintenant les données de l’instance nova sont accessibles depuis le répertoire /mnt ! Alors, heureux ?
Maintenant que tout va bien dans le meilleur des mondes, il reste à démonter le disque de l’instance et à résumer cette dernière.
# umount /mnt # qemu-nbd -d /dev/nbd0 # virsh resume 444
Conclusion
Cette technique a fonctionner plusieurs fois, que se soit après le crash d’un compute qui endommagea le disque de l’instance ou bien une erreur de configuration réseau sur une instance Ubuntu ou aucun mot de passe root n’était défini… En fonction de l’état de l’instance il se peut que cette dernière ne puisse pas être démarrée par nova, ce n’est pas grave qemu-nbd sait se débrouiller comme un grand.
Gaëtan Trellu (goldyfruit)
Derniers articles parGaëtan Trellu (goldyfruit) (voir tous)
- Qinling, let’s the journey begin! - 23 mai 2019
- systemd-networkd, l’âge de la maturité ? - 13 mars 2018
- Hyper-V, Nova, VxLAN et Open vSwitch, enfin une belle histoire ! - 31 décembre 2017
OMG… Mon instance Nova OpenStack est cassée !!! par Gaëtan Trellu (goldyfruit) est sous Licence Creative Commons Internationale Attribution 4.0.