XEN et LVM2 : redimensionner une partition

Il y a un an de ça, avec des amis, nous avons décidé de prendre un serveur dédié chez OVH à fin d’y installer XEN et d’y faire tourner 4 machines virtuelles (VMs). L’organisation du disque dur est simple, une partition /boot et une partition root / pour l’hyperviseur (dom0) et tout le reste attribué à un LVM (Logical Volume Manager) qui contient les partitions des VMs. C’est une configuration classique qui permet d’être très flexible.

On avait aussi eu la bonne idée de créer une partition commune (/data) entre nous quatre où chacun pourrait y placer ses fichiers en libre partage avec les autres. On l’a donc placée aussi dans le LVM. Cependant, il n’existe pas de solution stable pour partager une partition avec plusieurs machines virtuelles XEN (le projet xenfs étant sans signe de vie depuis 2007). On s’est donc tourné vers une solution samba. Le serveur samba tourne sur l’hyperviseur et la partition est montée sur /data/.

Le système, bien qu’ingénieux (ou pas), pour partager cette partition marche relativement mal.  En effet, dès qu’il y a du gros débit à faire passer, le CPU commence à monter en flèche et c’est assez galère… La solution la plus simple est donc simplement d’exiger une limite de bande-passante lors des transferts pour éviter les freezes (oui, c’est violent à ce point). Bref, pas génial..

Après un an, on se retrouve donc avec un /data sous-exploité et moi avec ma partition /home/ remplie à 98%. J’aurais pu faire un peu de tri mais ça m’aurait fait de la peine de devoir supprimer des fichiers. Le serveur dispose de 2To au total, 500Go m’appartiennent. Il me suffit donc de retirer un peu d’espace libre (100Go) à /data/ et de les attribuer à ma /home/ ! Et c’est là que toute la magie de LVM rentre en jeux.

Jouons avec LVM !

Un petit état des lieux avant tout. Toutes les partitions sont en ext3. Le but, passer le /data/ de 655G à 555G. Et mon /home/ de 212G à 312G.

dom0
1
2
3
4
5
# df -h
 Filesystem            Size  Used Avail Use% Mounted on
 ..
 /dev/mapper/vg-data   655G  387G  235G  63% /data
 ..
ma VM, domU
1
2
3
4
5
# df -h
Filesystem            Size  Used Avail Use% Mounted on
..
/dev/xvda3            212G  196G  5.6G  98% /home
..

La première étape consiste à rétrécir la taille de /data/ de 100Go.

-100Go sur data
1
2
3
4
5
6
7
8
9
10
11
# service samba stop   
Stopping Samba daemons: nmbd smbd.
# umount /data
# e2fsck -f /dev/vg/data
e2fsck 1.42.1 (17-Feb-2012)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/vg/data: 2554/43581440 files (26.0% non-contiguous), 104090842/174325760 blocks
On retire 100Go sur le fs
1
2
3
4
5
6
7
8
9
10
# resize2fs -p /dev/vg/data 555G
resize2fs 1.42.1 (17-Feb-2012)
Resizing the filesystem on /dev/vg/data to 145489920 (4k) blocks.
Begin pass 2 (max = 70792)
Relocating blocks             XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 3 (max = 5320)
Scanning inode table          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 4 (max = 264)
Updating inode references     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The filesystem on /dev/vg/data is now 145489920 blocks long.
On retire 100Go du conteneur
1
2
3
4
5
6
# lvresize -L -100G /dev/vg/data 
  WARNING: Reducing active logical volume to 565.00 GiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce data? [y/n]: y
  Reducing logical volume data to 565.00 GiB
  Logical volume data successfully resized

On remarque que le conteneur est à 565Go alors que la partition est à 555Go. On peut donc lancer la commande resize2fs sans argument qui va avoir pour effet d’augmenter le FS à la taille exacte du conteneur.

1
2
3
4
# resize2fs /dev/vg/data 
resize2fs 1.42.1 (17-Feb-2012)
Resizing the filesystem on /dev/vg/data to 148111360 (4k) blocks.
The filesystem on /dev/vg/data is now 148111360 blocks long.
On remet tout en place
1
2
3
4
5
6
7
8
# mount /dev/vg/data /data/
# service samba start
Starting Samba daemons: nmbd smbd.
# df -h
Filesystem            Size  Used Avail Use% Mounted on
..
/dev/mapper/vg-data   557G  387G  142G  74% /data
..
Et on a 100Go de libre sur le LVM !
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#vgdisplay 
  --- Volume group ---
  VG Name               vg
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  109
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                14
  Open LV               14
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               1.81 TiB
  PE Size               4.00 MiB
  Total PE              475393
  Alloc PE / Size       449760 / 1.72 TiB
  Free  PE / Size       25633 / 100.13 GiB
..

Jusqu’ici rien n’a changé pour mon home comme on peut le voir

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# lvdisplay /dev/vg/mon-home         
  --- Logical volume ---
  LV Name                /dev/vg/mon-home
  VG Name                vg
  LV UUID                f6aulN-mQB7-NiXY-X1pD-MaBC-E665-xvHdrs
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                215.00 GiB
  Current LE             55040
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:10

Dernière étape sur le dom0, augmenter à chaud la taille du conteneur de 100Go.

+100Go poursur dom0
1
2
3
# lvresize -L +100G /dev/vg/Laura-home
  Extending logical volume Laura-home to 315.00 GiB
  Logical volume Laura-home successfully resized

La suite se déroule sur la VM (domU) :

Augmenter de 100Go le FS à chaud sur domU
1
2
3
4
5
6
# resize2fs /dev/xvda3
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/xvda3 is mounted on /home; on-line resizing required
old desc_blocks = 14, new_desc_blocks = 20
Performing an on-line resize of /dev/xvda3 to 82575360 (4k) blocks.
The filesystem on /dev/xvda3 is now 82575360 blocks long.

Cette dernière opération prend un peu plus de temps, vous pouvez vous assurer que le chantier se déroule sans problème dans un autre terminal à coup de “df -h” par exemple :

En cours..
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
% df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/xvda2             15G  5.2G  8.9G  38% /
tmpfs                 1.9G     0  1.9G   0% /lib/init/rw
udev                  1.8G   36K  1.8G   1% /dev
tmpfs                 1.9G  4.0K  1.9G   1% /dev/shm
/dev/xvda3            258G  196G   50G  80% /home
//172.16.0.1/data/    557G  387G  142G  74% /data
% df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/xvda2             15G  5.2G  8.9G  38% /
tmpfs                 1.9G     0  1.9G   0% /lib/init/rw
udev                  1.8G   36K  1.8G   1% /dev
tmpfs                 1.9G  4.0K  1.9G   1% /dev/shm
/dev/xvda3            259G  196G   51G  80% /home
//172.16.0.1/data/    557G  387G  142G  74% /data
et au final..
1
/dev/xvda3            311G  196G   99G  67% /home

Conclusion

LVM, c’est magique ! Mangez-en :)

Comments