Rollback d'un Snapshot

De Sn4kY
Aller à : navigation, rechercher

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:

[1]