15 novembre 2012

guestfish

Les machines virtuelle c’est bien mais …
… comment extraire des fichiers d’une machine virtuelle sans avoir à la démarrer, ou, plus grave, quand elle ne veut pas démarrer ?

Le cœur de la solution s’appelle guestfish. Il s’agit d’un shell permettant de ‘dialoguer’ avec une machine virtuelle en fonctionnement mais surtout à l’arrêt. Il faut cependant que le daemon libvirtd fonctionne (/etc/init.d/libvirtd start)

Dans ce qui suit:
  • --ro : indique un accès en lecture seule, ce qui permet d’accéder à une machine virtuelle en cours de fonctionnement sans risques.
  • -i : a pour effet d’inspecter la machine virtuelle et de monter ses divers filesystem automatiquement.
  • /path/to/file et /path/to/dir : sont des chemins absolus dans la machine virtuelle.
  • local/dir et local/file : sont relatifs ou absolus sur la machine hôte.

A) Commandes de base pour extraire des fichiers d'une machine virtuelle (domaine) nommée ‘vm1’:
guestfish -d vm1  --ro  -i  cat      /path/to/file
guestfish -d vm1  --ro  -i  download /path/to/file  local/file
guestfish -d vm1  --ro  -i  tar-out  /path/to/dir   local/file
guestfish -d vm1  --ro  -i  copy-out /path/to/dir   local/dir


Note: 'copy-out' effectue une copie récursive en combinant download et tar-out.

Ces commandes sont très utiles pour ausculer les logs et fichiers de conf d'une machine virtuelle qui ne boote pas, ou pour sauvegarder des fichiers avant de reconstruire la machine virtuelle.

B) Commandes de base pour modifier des fichiers d'une machine virtuelle (domaine) nommée ‘vm1’. Cette machine virtuelle doit impérativement être à l’arrêt. (shutdown)
guestfish -d vm1  -i  edit     /path/to/file
guestfish -d vm1  -i  upload   local/file    /path/to/file
guestfish -d vm1  -i  tar-in   local/tarfile /path/to/dir
guestfish -d vm1  -i  copy-out local/dir     /path/to/dir


Note: 'edit' combine download + édition en local avec $EDITOR + upload. Si votre editeur est vi ou emacs vous pouvez remplacer la commande 'edit' par 'vi' ou 'emacs'. Pour utiliser un autre éditeur il faudra configurer la variable $EDITOR.

Ces commandes sont très utiles pour corriger les fichiers de conf comme /boot/grub/grub.conf, ou /etc/passwd, d'une machine virtuelle qui ne boote pas, ou pour personaliser des machinesvirtuelles bâties sur le même master (hostname, ip, domaine, ect...)


C) Enfin, comme avec tout shell on peut entrer en mode interactif avec guestfish et le quitter avec ^D ou exit ou quit. Pour automatiser certaines taches vous pouvez écrire des scripts guestfish, comme avec bash ou perl. Il suffit de commencer le script par :

#!/usr/bin/guestfish –f

Puis de taper les commandes.

Une autre solution est de faire un script bash en y invoquant guestfish et en lui passant les commandes via une redirection de stdin :

#!/bin/sh

guestfish <<_EOF_
domain vm1
run
write /etc/resolv.conf "nameserver 8.8.8.8"
_EOF_


Cette méthode est plus souple car on bénéficie de la puissance de bash pour, par exemple, traiter les paramètres du script et les résultats retournés par guestfish.

Plus d’info :
La référence: http://libguestfs.org/guestfish.1.html à lire absolument pour voir l'étendu des possibiltés.
Plein de petits scripts: http://libguestfs.org/guestfs-recipes.1.html
Pour les cas graves: http://libguestfs.org/virt-rescue.1.html