Niveau :
Résumé : lvcreate -s
Avançons encore un peu dans notre exploration de lvm. LVM permet beaucoup de choses, et entre autre la création de snapshots. Un snapshot c'est une prise de vue instantanée, qui dans le cas de lvm se fait au niveau du disque. Ce qui veut dire que le contenu du snapshot peut ne pas être cohérent, par exemple si le système est en train d'écrire sur le disque en plein milieu du snapshot.
On peut utiliser les snapshot pour beaucoup de choses, par exemple, Apple l'utilise pour faire sa machine à remonter dans le temps, on peut l'utiliser pour faire des backup cohérents mais aussi pour faire des expérimentations avec des retours arrière rapide.
Un snapshot
Partons d'un lv existant avec un vg sur lequel il reste de la place (hé oui, il faudra bien stocker nos snapshots. Faisons un snapshot de notre lv :
$ lvcreate -L 50M -s -n snap /dev/vg0/original
Et voila, c'est tout, fin de l'article !
Bon, pas encore. Déjà, pourquoi donner une taille au snapshot ? Tout simplement parce que celui-ci est intelligent, donc il ne va pas copier l'intégralité du lv original. Au contraire, il ne va stocker que les différences. C'est pourquoi il est instantané et commence avec une occupation taille nulle. Par contre, il faut lui allouer une taille dans le vg, donc 50Mo sera la quantité maximum de différence qu'il pourra stocker. Au delà de cette taille, le snapshot sera cassé et il ne pourra plus fonctionner correctement (les données ne sont plus valides, laissez tomber).
C'est pourquoi il faut faire attention à bien dimensionner ses snapshots et les gérer correctement. Après quelque quelque temps, vous verrez l'occupation du lv augmenter avec la commande lvdisplay :
$ lvdisplay /dev/vg0/snap ... Allocated to snapshot 26,27% ...
Votre snapshot est occupé à 26%, vous avez encore un peu de marge. C'est à vous de monitorer cette valeur et de prendre une décision, soit supprimer le snapshot (lvremove) ou d'augmenter la place allouée au snapshot (lvextend).
Une fois le snapshot cassé, vous avez ce genre d'information :
$ lvdisplay /dev/vg0/snap ... LV snapshot status source of /dev/vg0/original [INACTIVE] ...
Backup
Donc la technique pour faire un backup est simple, seul problème, si la machine a besoin du système de fichier pendant le snapshot. La meilleure méthode serait de faire "umount;lvcreate -s;mount", mais on ne peut pas. On va donc avoir de préférence un système de fichier qui résiste au crash (ext3 par exemple) et limiter la casse avec sync :
$ sync # on espère qu'il y aura le moins d'écriture possible entre ces 2 commandes $ lvcreate -s -L 500M -s -n backup /dev/vg0/original # et maintenant on a une durée de 500Mo d'écriture pour faire tranquillement notre backup $ mount /dev/vg0/backup /mnt $ tar cfz /backups/today.tgz /mnt # c'est vous qui voyez $ umount /mnt $ lvremove /dev/vg0/backup
Annulation
Maintenant supposons que nous voulions nous amuser avec notre système de fichier (par exemple pour tester un passage à la prochaine debian sans pour autant avoir peur de tout perdre. Sur / ça risque d'être un peu difficile. Pour ne pas vous perturber nous allons simplifier en utilisant le / d'une machine virtuelle (ou d'un chroot).
$ sync # choisissez une grande taille, voire la même taille que la partition originale pour éviter tout problème $ lvcreate -L 5G -s -n backup /dev/vg0/root # pas besoin de monter le backup # on bidouille $ vi /etc/apt/sources.list && apt-get update && apt-get dist-upgrade
Et là paf c'est cassé, réparons (avec un noyau <= 2.6.27):
# on va le casser $ umount /dev/vg0/root # on récupère le backup dans un espace temporaire $ dd if=/dev/vg0/bakup of=/srv/temp.dd # et on le restaure sur le lv d'origine $ lvremove /dev/vg0/bakup $ dd if=/srv/temp.dd of=/dev/vg0/root # fin $ rm /srv/temp.dd $ mount /dev/vg0/root
Le problème de cette technique est qu'elle nécessite un espace aussi gros que la partition disponible pour la restauration. Un petit gzip bien placé peut vous faire gagner en place, mais c'est pas top. Mais ... un patch est en cours pour permettre de faire tout ça en une seule commande et sans nécessiter d'espace intermédiaire. Il ne devrait malheureusement pas être disponible dans le noyau avant la version 2.6.28
# noyau > 2.6.27 $ lvconvert -M bakcup --nameorigin
Lire l'annonce pour plus de détails.
Deux snapshots
Remarquez que de même, il n'est pas possible de faire le snapshot d'un snapshot. C'est bien dommage car cela empêche de faire des tests sur un arbre de test et de revenir à l'endroit ou l'on veut. Ce genre de fonctionnalité n'est pas encore prévue. Il va donc falloir le faire soi-même, ou alors atendre la sortie de btrfs qui devrait permettre ce genre de chose directement sur le système de fichiers..
Donc en attendant, les commandes qui permettent de faire ça en utilisant des copies complètes :
# on snapshotte l'original $ lvcreate -L 50M -s -n v1x /dev/vg0/v0 # on copie le snapshot (vérifier la taille) $ lvcreate -L 5G -n v1 vg0 $ dd if=/dev/vg0/v1x of=/dev/vg0/v1 $ lvremove /dev/vg0/v1x # et on peut resnapshotter $ vcreate -L 500M -s -n v2 /dev/vg0/v1
Comments