Rollback d'un Snapshot
Utiliser les snapshots de LVM c'est bien, savoir comment procéder à son rollback, c'est encore mieux.
La plupart des distribs Linux ne fournissent pas d'options aux commandes lv
pour rollbacker avec un snapshot.
Cette option est particulièrement intéressante lorsqu'on fait de la virtualisation, et qu'on veut pouvoir procéder au rollback des VM, installées sur des LV.
Pour faire ce 'retour au snapshot', nous allons utiliser ici un tool non standard et quelques commandes dmsetup. Cet utilitaire s'appelle dm-merge. Vous devez le télécharger et le compiler depuis son repository git ou télécharger le dernier snapshot. Le principe de fonctionnement de dm-merge est simple : il remplace les blocks modifiés par ceux présent dans le snapshot. Il faut le compiler (un make suffit). La doc indique qu'il y a deux méthodes possibles : rollbacker sur un volume logique actif, ou inactif. Le premier cas permet de revenir sur un cliché instantané lorsque le système de fichiers est encore monté. C'est surement une très mauvaise idée. La méthode sur système inactif est beaucoup plus sure !
Attention, cette procédure est un peu funky tout de même, je vous conseille de procéder sur un LV de test d'abord !
Dans l'exemple, j'ai un LV nommé /dev/myvg/win2008 (oui, cette procédure m'as permis de rollbacker souvent une VM crash test windows 2008), bien évidemment, j'avais créé un snapshot 'snap1' avant de crasher ma VM.
lvcreate --size 1G --snapshot --name snap1 /dev/myvg/win2008
Chose intéressante, il est possible de modifier la taille du snapshot sans compromettre celui-ci : lvresize -L 20G /dev/myvg/snap1
J'ai utilisé la méthode sur un volume LVM inactif, mais j'imagine qu'il en est de même sur le LVM d'une VM qui as été simplement shutdown (LV 'actif' d'un point de vue LVM, mais inutilisé)
Stopper l'accès au volume logique
(ie. /dev/myvg/win2008)
Puisque c'est une VM, j'ai juste besoin de shutdown la VM (ou destroy, peu importe). Sinon, démontez votre lv umount /dev/myvg/win2008
Dupliquer les tables du LV et du snapshot
(notez l'utilisation des suffixes spéciaux -real
et -cow
# dmsetup table myvg-win2008-real | dmsetup create tmplv # dmsetup table myvg-snap1-cow | dmsetup create tmpcow
Désactiver le LV principal
# lvchange -a n /dev/myvg/win2008
Flusher les buffers
# blockdev --flushbufs /dev/mapper/{tmplv,tmpcow}
Faire un essai
Vous allez voir un paquet de lignes commençant par dd
et un résumé à la fin de ce qui sera fait.
# dm-merge -i /dev/mapper/tmpcow -o /dev/mapper/tmplv -vd ... dd of="/dev/mapper/tmplv" seek=2135444 if='/dev/mapper/tmpcow' iflag=direct skip=8275 count=1 bs=8b dd of="/dev/mapper/tmplv" seek=2135445 if='/dev/mapper/tmpcow' iflag=direct skip=8276 count=1 bs=8b dd of="/dev/mapper/tmplv" seek=2135446 if='/dev/mapper/tmpcow' iflag=direct skip=8277 count=1 bs=8b dd of="/dev/mapper/tmplv" seek=5056466 if='/dev/mapper/tmpcow' iflag=direct skip=8278 count=1 bs=8b dd of="/dev/mapper/tmplv" seek=5056467 if='/dev/mapper/tmpcow' iflag=direct skip=8279 count=1 bs=8b Found 8246 exceptions of chunksize 4096, total size 33775616 bytes (32984 KiB, 32.211 MiB, 0.031 GiB).
Le faire en vrai
Quelques lignes en plus du même résumé
# dm-merge -i /dev/mapper/tmpcow -o /dev/mapper/tmplv -f Artificial sleep (1 second) Found a proper MAGIC header: 0x70416e53 valid = 1 version = 1 chunk_size = 8 (4096 bytes) Found 8246 exceptions of chunksize 4096, total size 33775616 bytes (32984 KiB, 32.211 MiB, 0.031 GiB).
Flusher les buffers encore une fois
# blockdev --flushbufs /dev/mapper/{tmplv,tmpcow}
Supprimer les LV temporaires
Ce ne sont que des références aux données, ça va va pas supprimer les données réelles !
# dmsetup remove tmplv # dmsetup remove tmpcow
Activer le LV
# lvchange -a y /dev/myvg/win2008
Il est temps de redémarrer la VM - remonter le filesystem - qui a été inverti sur l'instantané. Si le snapshot a été réalisé sur une VM bootée ou sur un FS monté, un fsck (ou chkdsk) sera réalisé ou sera demandé avant de remonter le FS.
Il est a présent possible de supprimer le snapshot initial (ou pas, si jamais il faut re-rollbacker) lvremove /dev/myvg/snap1
Sources: