jeudi 18 février 2016

libvirt QEMU : resize en live d'une partition (guest) basé sur un LV (host)

Pouet,

sur mon super NAS maison (un HP Proliant Microserver Gen8), j'ai un système principal à base de CentOS qui me sert d'hyperviseur (libvirt+QEMU), et j'ai des VM dont une sous OpenMediaVault (OMV) qui sert de NAS (fournit une GUI pour les partages, toussa). Sur mes 3 disques, les 2 gros servent au NAS (l'autre est en mode miroir pour un espace sécurisé), j'utilise le génial LVM pour partitionner les disques (et en réalité, des partitions aussi, car plusieurs VG).

Digression : je n'ai cependant pas profité de la fonctionnalité qui permet d'agréger des disques, c'est volontaire : lorsque les disques sont agrégés, c'est plus simple à l'usage car 1 seul FS, mais en cas de panne d'un des disques .. c'est effectivement tout cet unique FS qui est mort (et avec les bouts de fichiers probablement répartis partout sur les 2 disques, bonne chance pour une éventuelle récupération). J'ai donc 1 FS par disque, que OMV me permet d’agréger à l'aide de AUFS pour n'afficher qu'un FS à l'usage :).

Pour la VM OMV, je garde de l'espace dans le VG au cas où, et il m'arrive d'avoir besoin d'allouer de cet espace à OMV, seulement il faut agrandir le LV, puis relancer la VM, ce que je n'ai pas toujours envie de faire ; ça serait quand même plus cool de pouvoir le faire en live, non ? Surtout que QEMU permet ça lorsque le mode virtio est utilisé :).

Bref, assez de blabla, des commandes.

Agrandissement du LV sur l'host :

[root@equuleus ~]# pvs -o pv_name,vg_name,pv_fmt,pv_attr,pv_size,pv_free,lv_name,seg_start_pe,seg_size_pe,seg_start,seg_size,segtype,seg_pe_ranges
  PV         VG   Fmt  Attr PSize   PFree   LV                 Start SSize  Start  SSize   Type   PE Ranges
  /dev/sda3  sys  lvm2 a--  125.00g  72.00g root                   0   2500     0    9.77g linear /dev/sda3:0-2499
  /dev/sda3  sys  lvm2 a--  125.00g  72.00g home                   0   3750     0   14.65g linear /dev/sda3:2500-6249
  /dev/sda3  sys  lvm2 a--  125.00g  72.00g swap                   0   2018     0    7.88g linear /dev/sda3:6250-8267
  /dev/sda3  sys  lvm2 a--  125.00g  72.00g root_inst              0   2560     0   10.00g linear /dev/sda3:8268-10827
  /dev/sda3  sys  lvm2 a--  125.00g  72.00g root_sinst7            0   2510     0    9.80g linear /dev/sda3:10828-13337
  /dev/sda3  sys  lvm2 a--  125.00g  72.00g root                2500     60  9.77g 240.00m linear /dev/sda3:13338-13397
  /dev/sda3  sys  lvm2 a--  125.00g  72.00g root_sinst7         2510     50  9.80g 200.00m linear /dev/sda3:13398-13447
  /dev/sda3  sys  lvm2 a--  125.00g  72.00g swap                2018     30  7.88g 120.00m linear /dev/sda3:13448-13477
  /dev/sda3  sys  lvm2 a--  125.00g  72.00g home                3750     90 14.65g 360.00m linear /dev/sda3:13478-13567
  /dev/sda3  sys  lvm2 a--  125.00g  72.00g                        0  18431     0   72.00g free
  /dev/sda4  vm   lvm2 a--  125.00g  69.00g iso                    0   2560     0   10.00g linear /dev/sda4:0-2559
  /dev/sda4  vm   lvm2 a--  125.00g  69.00g images                 0   3840     0   15.00g linear /dev/sda4:2560-6399
  /dev/sda4  vm   lvm2 a--  125.00g  69.00g omv                    0   2560     0   10.00g linear /dev/sda4:6400-8959
  /dev/sda4  vm   lvm2 a--  125.00g  69.00g vm2                    0   2560     0   10.00g linear /dev/sda4:8960-11519
  /dev/sda4  vm   lvm2 a--  125.00g  69.00g t1                     0    256     0    1.00g linear /dev/sda4:11520-11775
  /dev/sda4  vm   lvm2 a--  125.00g  69.00g vm2_fresh              0   2560     0   10.00g linear /dev/sda4:11776-14335
  /dev/sda4  vm   lvm2 a--  125.00g  69.00g                        0  17663     0   69.00g free
  /dev/sda5  data lvm2 a--    2.48t 100.00g [secured_rmeta_2]      0      1     0    4.00m linear /dev/sda5:0-0
  /dev/sda5  data lvm2 a--    2.48t 100.00g [secured_rimage_2]     0 230400     0  900.00g linear /dev/sda5:1-230400
  /dev/sda5  data lvm2 a--    2.48t 100.00g                        0  25600     0  100.00g free
  /dev/sda5  data lvm2 a--    2.48t 100.00g nas-1                  0 395270     0    1.51t linear /dev/sda5:256001-651270
  /dev/sdb2  data lvm2 a--  931.51g  21.50g [secured_rmeta_0]      0      1     0    4.00m linear /dev/sdb2:0-0
  /dev/sdb2  data lvm2 a--  931.51g  21.50g [secured_rimage_0]     0 230400     0  900.00g linear /dev/sdb2:1-230400
  /dev/sdb2  data lvm2 a--  931.51g  21.50g nas-db                 0   2560     0   10.00g linear /dev/sdb2:230401-232960
  /dev/sdb2  data lvm2 a--  931.51g  21.50g                        0   5505     0   21.50g free
  /dev/sdc5  data lvm2 a--    5.21t 874.00g [secured_rmeta_1]      0      1     0    4.00m linear /dev/sdc5:0-0
  /dev/sdc5  data lvm2 a--    5.21t 874.00g [secured_rimage_1]     0 230400     0  900.00g linear /dev/sdc5:1-230400
  /dev/sdc5  data lvm2 a--    5.21t 874.00g                        0  25600     0  100.00g free
  /dev/sdc5  data lvm2 a--    5.21t 874.00g nas-2                  0 911361     0    3.48t linear /dev/sdc5:256001-1167361
  /dev/sdc5  data lvm2 a--    5.21t 874.00g                        0 198144     0  774.00g free

[root@equuleus ~]# lvextend data/nas-2 -L +174G /dev/sdc5
  Size of logical volume data/nas-2 changed from 3.48 TiB (911361 extents) to 3.65 TiB (955905 extents).
  Logical volume nas-2 successfully resized.

[root@equuleus ~]# pvs -o pv_name,vg_name,pv_fmt,pv_attr,pv_size,pv_free,lv_name,seg_start_pe,seg_size_pe,seg_start,seg_size,segtype,seg_pe_ranges
  PV         VG   Fmt  Attr PSize   PFree   LV                 Start SSize  Start  SSize   Type   PE Ranges
[..]
  /dev/sdc5  data lvm2 a--    5.21t 700.00g [secured_rmeta_1]      0      1     0    4.00m linear /dev/sdc5:0-0
  /dev/sdc5  data lvm2 a--    5.21t 700.00g [secured_rimage_1]     0 230400     0  900.00g linear /dev/sdc5:1-230400
  /dev/sdc5  data lvm2 a--    5.21t 700.00g                        0  25600     0  100.00g free
  /dev/sdc5  data lvm2 a--    5.21t 700.00g nas-2                  0 955905     0    3.65t linear /dev/sdc5:256001-1211905
  /dev/sdc5  data lvm2 a--    5.21t 700.00g                        0 153600     0  600.00g free

On informe le driver de la VM que le disque à changé de taille (attention aux unités, kb != kib) :

[root@equuleus ~]# virsh help blockresize
  NAME
    blockresize - Resize block device of domain.

  SYNOPSIS
    blockresize   

  DESCRIPTION
    Resize block device of domain.

  OPTIONS
    [--domain]   domain name, id or uuid
    [--path]   Fully-qualified path of block device
    [--size]   New size of the block device, as scaled integer (default KiB)


/!\ units ! (kb != kib) : 
[root@equuleus ~]# man lvs
[root@equuleus ~]# lvs data/nas-2 --units m
  LV    VG   Attr       LSize       Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  nas-2 data -wi-ao---- 3823620.00m

[root@equuleus ~]# virsh blockresize OMV /dev/data/nas-2 3823620m
Block device '/dev/data/nas-2' is resized

On check le syslog du guest : 

root@omv:~# dmesg
[3689800.752788] virtio_blk virtio7: new size: 7830773760 512-byte logical blocks (4.00 TB/3.64 TiB)
[3689800.752795] vde: detected capacity change from 3822525087744 to 4009356165120
[3689800.762729] VFS: busy inodes on changed media or resized disk vde


On lance le resize du FS (qui peut mettre plusieurs minutes, prévoir un screen/tmux pour cette étape serait pas mal) : 

root@omv:~# resize2fs -p /dev/vde
resize2fs 1.42.5 (29-Jul-2012)
Filesystem at /dev/vde is mounted on /media/211d3e2f-680f-4211-b597-203dcae5c756; on-line resizing required
old_desc_blocks = 446, new_desc_blocks = 467
Performing an on-line resize of /dev/vde to 978846720 (4k) blocks.
The filesystem on /dev/vde is now 978846720 blocks long.