Table des matières

LVM

Fonctionnement général

Augmenter un PV

Avec :

Réduire un PV

Il est possible d'avoir une erreur lors du `pvresize` initial du type /dev/vdc: cannot resize to 230399 extents as later ones are allocated. Cela vient du fait que les LV ont été taillés en plusieurs fois et donc des segments des LV sont un peu partout sur le disque, or, il faudrait qu'il soit tous au début de la partition pour pouvoir réduire le PV. Pour cela :

Commencer par lister les segments des LV :

# pvs -v --segments /dev/vdc
  PV         VG     Fmt  Attr PSize PFree    Start  SSize  LV               Start  Type   PE Ranges             
  /dev/vdc   vg_ssd lvm2 a--  1,57t <800,00g      0 153600 var                   0 linear /dev/vdc:0-153599     
  /dev/vdc   vg_ssd lvm2 a--  1,57t <800,00g 153600 153600                       0 free                         
  /dev/vdc   vg_ssd lvm2 a--  1,57t <800,00g 307200   2560 log                   0 linear /dev/vdc:307200-309759
  /dev/vdc   vg_ssd lvm2 a--  1,57t <800,00g 309760  25600 var              153600 linear /dev/vdc:309760-335359
  /dev/vdc   vg_ssd lvm2 a--  1,57t <800,00g 335360  25600                       0 free                         
  /dev/vdc   vg_ssd lvm2 a--  1,57t <800,00g 360960  25600 var              179200 linear /dev/vdc:360960-386559
  /dev/vdc   vg_ssd lvm2 a--  1,57t <800,00g 386560  25599                       0 free

On voit ici que le LV `var` est divisé en trois segments et que l'on a plusieurs espaces libres dans le PV. Il faut alors déplacer les segments au début du disque dans un espace libre, tant qu'à faire de manière contiguë avec un autre segment du même LV (et dans le bon ordre, cf. champ Start du LV = la seconde colonne portant ce nom). Ici, on va donc commencer par déplacer le second segment dans l'espace libre juste après le premier segment. La commande pour cela est :

pvmove --alloc anywhere [PE Ranges du segment à déplacer] [PV]:[Start de emplacement libre]+[SSize du segment à déplacer]

et donc ici :

# pvmove --alloc anywhere /dev/vdc:309760-335359 /dev/vdc:153600+25600
  /dev/vdc: Moved: 0,01%
  /dev/vdc: Moved: 3,98%
  [...]
  /dev/vdc: Moved: 97,44%
  /dev/vdc: Moved: 100,00%

On affiche à nouveau les segments :

# pvs -v --segments /dev/vdc
  PV         VG     Fmt  Attr PSize PFree    Start  SSize  LV               Start  Type   PE Ranges             
  /dev/vdc   vg_ssd lvm2 a--  1,57t <800,00g      0 179200 var                   0 linear /dev/vdc:0-179199     
  /dev/vdc   vg_ssd lvm2 a--  1,57t <800,00g 179200 128000                       0 free                         
  /dev/vdc   vg_ssd lvm2 a--  1,57t <800,00g 307200   2560 log                   0 linear /dev/vdc:307200-309759
  /dev/vdc   vg_ssd lvm2 a--  1,57t <800,00g 309760  51200                       0 free                         
  /dev/vdc   vg_ssd lvm2 a--  1,57t <800,00g 360960  25600 var              179200 linear /dev/vdc:360960-386559
  /dev/vdc   vg_ssd lvm2 a--  1,57t <800,00g 386560  25599                       0 free

On va pouvoir maintenant déplacer le dernier segment à la suite des deux autres déjà réunis :

# pvmove --alloc anywhere /dev/vdc:360960-386559 /dev/vdc:179200+25600
  /dev/vdc: Moved: 0,02%
  /dev/vdc: Moved: 3,17%
  [...]
  /dev/vdc: Moved: 100,00%

On affiche à nouveau les segments :

# pvs -v --segments /dev/vdc
  PV         VG     Fmt  Attr PSize PFree    Start  SSize  LV               Start Type   PE Ranges             
  /dev/vdc   vg_ssd lvm2 a--  1,57t <800,00g      0 204800 var                  0 linear /dev/vdc:0-204799     
  /dev/vdc   vg_ssd lvm2 a--  1,57t <800,00g 204800 102400                      0 free                         
  /dev/vdc   vg_ssd lvm2 a--  1,57t <800,00g 307200   2560 log                  0 linear /dev/vdc:307200-309759
  /dev/vdc   vg_ssd lvm2 a--  1,57t <800,00g 309760 102399                      0 free

Pour finir, on déplace maintenant le LV `log` juste après le LV `var` :

# pvmove --alloc anywhere /dev/vdc:307200-309759 /dev/vdc:204800+2560
  /dev/vdc: Moved: 1,17%
  /dev/vdc: Moved: 36,02%
  /dev/vdc: Moved: 66,48%
  /dev/vdc: Moved: 100,00%

On affiche à nouveau les segments :

# pvs -v --segments /dev/vdc
  PV         VG     Fmt  Attr PSize PFree    Start  SSize  LV               Start Type   PE Ranges             
  /dev/vdc   vg_ssd lvm2 a--  1,57t <800,00g      0 204800 var                  0 linear /dev/vdc:0-204799     
  /dev/vdc   vg_ssd lvm2 a--  1,57t <800,00g 204800   2560 log                  0 linear /dev/vdc:204800-207359
  /dev/vdc   vg_ssd lvm2 a--  1,57t <800,00g 207360 204799                      0 free

Les LVs sont maintenant au début du PV et on va maintenant être en mesure de faire notre `pvresize`.

Réduire un LV

Pour un système de fichiers EXT3/EXT4 :

umount /dev/vg/lv
e2fsck -f /dev/vg/lv
resize2fs -M /dev/vg/lv
mount /dev/vg/lv
/dev/mapper/vg-lv   578M  578M     0 100% /mount/path
umount /dev/vg/lv
lvreduce -L 5G /dev/vg/lv
e2fsck -f /dev/vg/lv
resize2fs /dev/vg/lv
mount /dev/vg/lv

Snapshot

Très pratique ! Cela permet de faire un copie instantanée d'un LV sans pour autant ré-alloué la totalité de l'espace disque. Un snapshot est juste un composant de LVM stockant uniquement les modifications fait sur un LV qui on lieu entre le moment ou le snapshot est fait et le moment présent. Vous avez donc un copie du système du LV accessible en lecture seule uniquement. Tout l'intérêt est de faire en une fraction de seconde un copie du LV sans ré-alloué. Cette copie est en outre volatile et disparaitra au prochain reboot. La taille allouée doit être dimensionnée en fonction de volume de modifications qui auront lieu pendant votre utilisation de la copie.

Utilité

Très pratique pour les sauvegardes d'un système dont les services doivent être arrêtés pour sauvegarder leurs données. La création d'un snapshot prend une fraction de seconde alors que la sauvegarde complète du système prend beaucoup plus. Il ainsi possible d'arrêter les services le temps de faire un snapshot puis de les redémarrer et de faire ensuite une sauvegarde à partir du snapshot.

Procédures

lvcreate -s -L 100M -n snapdetmp /dev/vg_1/tmp
mount /dev/vg_1/snapdetmp /mnt/tmp
unmout /dev/vg_1/snapdetmp
lvremove /dev/vg_1/snapdetmp