====== Logical Volume Mapper (LVM) ====== ressources: * man lvcreate * man lvconvert * man lvs * https://www.linuxtricks.fr/wiki/lvm-avance-les-snapshots * https://www.claudiokuenzler.com/blog/1070/lvm-restore-logical-volume-merging-snapshot-will-occur-on-next-activation ===== Créer et utiliser un snapshot ===== Exemple de contexte: root@magrathea:~# vgs VG #PV #LV #SN Attr VSize VFree magrathea 1 17 0 wz--n- 1,00T 500,02G root@magrathea:~# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert [...] webtest magrathea -wi-ao---- 5,00G ==== Création d'un snapshot ==== Typiquement avant une opération délicate, mise à jour de LXC ou autre. # lvcreate -s -L $[10**9]B -n webtest_snap /dev/magrathea/webtest Rounding size to boundary between physical extents: 956,00 MiB. Size of logical volume magrathea/webtest_snap changed from 20,00 MiB (5 extents) to 956,00 MiB (239 extents). Logical volume magrathea/webtest_snap successfully resized. * ''%%-s --snapshot%%'' indique qu'on fait un snapshot * ''%%-L --size%%'' indique la taille (ici en ''%%bytes B%%'' pour avoir des puissance de 10) * ''%%-n --name%%'' nom du snapshot * ''%%/dev/.../...%%'' adresse de l'original Pour simuler la mise à jour, on ajoute un fichier ''%%flag%%'' Par exemple, si ''%%webtest%%'' est monté sur ''%%/var/lib/lxc/webtest/rootfs%%'', on peut voir le contenu du snapshot en le montant ailleurs, par exemple sur ''%%/mnt/tmp%%'': touch /var/lib/lxc/webtest/rootfs/tmp/flag mkdir -p /mnt/tmp mount -o ro /dev/magrathea/webtest_snap /mnt/tmp ls -la /mnt/tmp/tmp/flag ls: impossible d'accéder à '/mnt/tmp/tmp/flag': Aucun fichier ou dossier de ce type umount /mnt/tmp ==== Cas simple ==== Tout s'est bien passé, le snapshot n'est plus nécessaire, il suffit de l'enlever: lvremove /dev/magrathea/webtest_snap ==== Cas "récupération" ==== Il faut repartir sur le snapshot et l'original n'est plus bon, on va fusionner le snapshot dans l'original: # si on oublie de démonter le volume, la conversion sera différée jusqu'au démontage umount /dev/magrathea/webtest # le -i 1 permet de voir le pourcentage effectue toutes les secondes # sinon en faisant un lvs on le voit aussi dans la colonne Data% lvconvert --mergesnapshot -i 1 /dev/magrathea/webtest_snap # pendant la conversion: # lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert [...] another_lv magrathea -wi-ao---- 10,00G webtest magrathea Owi-a-s--- 5,00G 15% Noter les attributs par rapport a un autre LV "normal": * O : Origin with merging snapshot * o : open (volume monté ou ouvert par un processus) * s : target type: snapshot s'il n'y a pas de pourcentage, la conversion est simplement différée, un ''%%vgchange --refresh LVNAME%%'' va la relancer (à condition toutefois que le volume soit démonté) ==== Cas d'un snapshot trop petit ==== On veut faire un snapshot de la partition webtest (ici en ext4) avec seulement 10 Mo (ce qui est une mauvaise idée): root@magrathea:~# lvcreate -s -L 10000384B -n webtest_snap /dev/magrathea/webtest Rounding up size to full physical extent 12,00 MiB Logical volume "webtest_snap" created. lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert [...] webtest magrathea owi-aos--- 5,00G webtest_snap magrathea swi-a-s--- 12,58M webtest 0,10 Si il y a plus de 10 Mo de différence entre le LV ''%%webtest%%'' et le LV ''%%webtest_snap%%'' alors le snapshot sera dans l'état invalide, le filesystem corrompu et les données difficile et probablement impossible à récupérer alors que l'objet d'un snapshot est souvent de faire une sauvegarde. Pour être sûr de n'avoir jamais de snapshot invalid, il faut un snapshot de la même taille que la partition originale. Par exemple, si ''%%webtest%%'' est monté sur ''%%/var/lib/lxc/webtest/rootfs%%'', on peut voir le contenu du snapshot en le montant ailleurs, par exemple sur ''%%/mnt/tmp%%'': mkdir -p /mnt/tmp mount -o ro /dev/magrathea/webtest_snap /mnt/tmp ls -la /mnt/tmp [...] umount /mnt/tmp Le contenu de ''%%/mnt/tmp%%'' est celui de ''%%webtest%%'' figé au moment du snapshot si on rajoute plus de 10 Mo de différence sur l'original ''%%/var/lib/lxc/webtest/rootfs%%'': dd if=/dev/zero of=tmp/dummy bs=1024 count=10240 lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert webtest magrathea owi-aos--- 5,00G webtest_snap magrathea swi-a-s--- 12,58M webtest 83,76 on arrive a 83% de saturation du snapshot et si on répète la dernière commande, on arrive à 100% Pour éviter ça, tant que le snapshot n'est pas invalid, on peut l'agrandir: # lvresize -L20000256B /dev/magrathea/webtest_snap Rounding size to boundary between physical extents: 20,00 MiB. Size of logical volume magrathea/webtest_snap changed from 12,00 MiB (3 extents) to 20,00 MiB (5 extents). Logical volume magrathea/webtest_snap successfully resized. # lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert [...] webtest magrathea owi-aos--- 5,00G webtest_snap magrathea swi-a-s--- 20,97M webtest 50,45 Si on arrive à saturation par contre c'est trop tard: dd if=/dev/zero of=tmp/dummy bs=1024 count=10240 lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert webtest magrathea owi-aos--- 5,00G webtest_snap magrathea swi-I-s--- 12,58M webtest 100,00 Le snapshot est invalide, on ne peut plus le monter correctement: # mount -o ro /dev/magrathea/webtest_snap /mnt/tmp mount: /mnt/tmp: impossible de lire le superbloc à l’adresse /dev/mapper/magrathea-webtest_snap. # file -Ls /dev/magrathea/webtest_snap /dev/magrathea/webtest_snap: ERROR: cannot read `/dev/magrathea/webtest_snap' (Input/output error) Bref attention à la taille donnée à un snapshot