Table des matières

Logical Volume Mapper (LVM)

ressources:

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.

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”:

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