Je viens de recevoir une commande de la semaine dernière, portant sur une jolie petite bête : un Seagate 7200.12 1To 32Mo :p
Ce disque me sert a remplacer le disque de 320Go qui tourne actuellement pour la partie stockage/NAS de mon serveur, 320Go qui est destiné a réintégrer mon desktop, il n’était dans le serveur que temporairement.
Ayant conçu dès le départ l’espace de stockage comme étant nécessairement modulaire (je veux pouvoir étendre l’espace disque simplement en rajoutant un disque à chaud, en en enlevant un, etc …), je l’ai mis en place avec LVM.
Aujourd’hui je vais donc ajouter le nouveau disque au groupe de volumes puis retirer l’ancien pour qu’il n’y ait plus que le nouveau utilisé dans le groupe.
L’existant
Pour la partie stockage je n’ai donc qu’un volume physique (mon 320Go), un groupe de volumes (“vg_data”), et un seul volume logique (“fichiers”), formaté en Ext3.
hippo:~# pvdisplay
--- Physical volume ---
PV Name /dev/sdc1
VG Name vg_data
PV Size 298,09 GB / not usable 2,81 MB
Allocatable yes (but full)
PE Size (KByte) 4096
Total PE 76310
Free PE 0
Allocated PE 76310
PV UUID wlwUyT-XhIG-G2FO-Azxi-12HX-xx4e-U4GO0J
--- Physical volume ---
PV Name /dev/md0
VG Name vg_system
PV Size 232,65 GB / not usable 1,38 MB
Allocatable yes
PE Size (KByte) 4096
Total PE 59557
Free PE 47075
Allocated PE 12482
PV UUID lexqD6-B9pR-htYi-uBQu-v15N-mpK5-vgRDDN
hippo:~# vgdisplay
--- Volume group ---
VG Name vg_data
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 1
Act PV 1
VG Size 298,09 GB
PE Size 4,00 MB
Total PE 76310
Alloc PE / Size 76310 / 298,09 GB
Free PE / Size 0 / 0
VG UUID wgtYBn-UvcL-V31e-gOsf-Kdf3-GheH-TiMBLx
--- Volume group ---
VG Name vg_system
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 22
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 10
Open LV 10
Max PV 0
Cur PV 1
Act PV 1
VG Size 232,64 GB
PE Size 4,00 MB
Total PE 59557
Alloc PE / Size 12482 / 48,76 GB
Free PE / Size 47075 / 183,89 GB
VG UUID KMYKeg-AOqC-nUte-BZyS-T3te-05JS-CtjDD8
(/dev/md0 est mon volume physique RAID-1 qui me sert à stocker le système et les DomU, il est attribué à un autre groupe de volumes, vg_system.)
/dev/sdc1 est mon disque de 320Go, attribué à vg_data.
(oui, j’ai pris l’habitude d’initialiser mes volumes physiques sur une partition prenant tout l’espace du disque, plutôt que directement sur le disque – /dev/sdc1 plutôt que /dev/sdc)
Quasi toutes les opérations suivantes peuvent être effectuées à chaud et volume monté, mais par propreté, j’ai préféré stopper le DomU de stockage
Préparation du nouveau disque dur
Confort du S-ATA, on peut se permettre de brancher le disque à chaud, ce que j’ai fait, et aussitôt, /dev/sdd fait son apparition.
Un petit coup de cfdisk pour créer une partition prenant l’intégralité du disque :
hippo:~# cfdisk /dev/sdd
[...]
Disk has been changed.
WARNING: If you have created or modified any
DOS 6.x partitions, please see the cfdisk manual
page for additional information.
De suite, on initialise comme volume physique cette nouvelle partition sdd1 :
hippo:~# pvcreate /dev/sdd1
Physical volume "/dev/sdd1" successfully created
On ajoute ce nouveau volume physique au groupe de volume existant :
hippo:~# vgextend vg_data /dev/sdd1
Volume group "vg_data" successfully extended
À ce moment-là, mon groupe de volumes est étendu sur les deux disques durs, le 320Go et le 1To :
hippo:~# vgdisplay
--- Volume group ---
VG Name vg_data
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 2
Act PV 2
VG Size 1,20 TB
PE Size 4,00 MB
Total PE 314776
Alloc PE / Size 76310 / 298,09 GB
Free PE / Size 238466 / 931,51 GB
VG UUID wgtYBn-UvcL-V31e-gOsf-Kdf3-GheH-TiMBLx
[...]
Sauf que ce que cherche à accomplir, c’est de ne plus utiliser que le disque de 1To pour ce groupe de volumes.
Sortir le premier disque dur du groupe de volumes
Voilà la situation des deux disques concernés :
hippo:~# pvdisplay
--- Physical volume ---
PV Name /dev/sdc1
VG Name vg_data
PV Size 298,09 GB / not usable 2,81 MB
Allocatable yes (but full)
PE Size (KByte) 4096
Total PE 76310
Free PE 0
Allocated PE 76310
PV UUID wlwUyT-XhIG-G2FO-Azxi-12HX-xx4e-U4GO0J
--- Physical volume ---
PV Name /dev/sdd1
VG Name vg_data
PV Size 931,51 GB / not usable 3,19 MB
Allocatable yes
PE Size (KByte) 4096
Total PE 238466
Free PE 238466
Allocated PE 0
PV UUID ij945a-IFIn-12qa-qOqG-Z1cb-nG2H-l9WwNH
[...]
On constate que même si sdd1 fait partie de vg_data, aucun de ses physical extents (PE) n’est utilisé, et pour cause, toutes les données sont restées sur sdc1.
On ne peut donc pas l’enlever tout de suite, on va d’abord devoir migrer toutes les données de sdc1 vers le reste du groupe de volumes, le vider en quelque sorte.
Une simple petite commande :
hippo:~# pvmove -v /dev/sdc1
Finding volume group "vg_data"
Archiving volume group "vg_data" metadata (seqno 3).
Creating logical volume pvmove0
Moving 76310 extents of logical volume vg_data/fichiers
Found volume group "vg_data"
Updating volume group metadata
Creating volume group backup "/etc/lvm/backup/vg_data" (seqno 4).
Found volume group "vg_data"
Found volume group "vg_data"
Suspending vg_data-fichiers (253:10) with device flush
Found volume group "vg_data"
Creating vg_data-pvmove0
Loading vg_data-pvmove0 table
Resuming vg_data-pvmove0 (253:11)
Found volume group "vg_data"
Loading vg_data-pvmove0 table
Suppressed vg_data-pvmove0 identical table reload.
Loading vg_data-fichiers table
Resuming vg_data-fichiers (253:10)
Checking progress every 15 seconds
/dev/sdc1: Moved: 0,2%
/dev/sdc1: Moved: 0,5%
[...]
/dev/sdc1: Moved: 99,9%
/dev/sdc1: Moved: 100,0%
Found volume group "vg_data"
Found volume group "vg_data"
Loading vg_data-fichiers table
Suspending vg_data-fichiers (253:10) with device flush
Suspending vg_data-pvmove0 (253:11) with device flush
Found volume group "vg_data"
Found volume group "vg_data"
Found volume group "vg_data"
Resuming vg_data-pvmove0 (253:11)
Found volume group "vg_data"
Resuming vg_data-fichiers (253:10)
Found volume group "vg_data"
Removing vg_data-pvmove0 (253:11)
Found volume group "vg_data"
Removing temporary pvmove LV
Writing out final volume group after pvmove
Creating volume group backup "/etc/lvm/backup/vg_data" (seqno 6).
Une heure et demie plus tard, voilà le résultat :
hippo:~# pvdisplay
--- Physical volume ---
PV Name /dev/sdc1
VG Name vg_data
PV Size 298,09 GB / not usable 2,81 MB
Allocatable yes
PE Size (KByte) 4096
Total PE 76310
Free PE 76310
Allocated PE 0
PV UUID wlwUyT-XhIG-G2FO-Azxi-12HX-xx4e-U4GO0J
--- Physical volume ---
PV Name /dev/sdd1
VG Name vg_data
PV Size 931,51 GB / not usable 3,19 MB
Allocatable yes
PE Size (KByte) 4096
Total PE 238466
Free PE 162156
Allocated PE 76310
PV UUID ij945a-IFIn-12qa-qOqG-Z1cb-nG2H-l9WwNH
[...]
sdc1 est désormais vidé (allocated PE à 0), tous les PE sont passés sur sdd1.
Le disque est désormais retirable du groupe de volumes :
hippo:~# vgreduce vg_data /dev/sdc1
Removed "/dev/sdc1" from volume group "vg_data"
Je l’éteins de façon logicielle pour pouvoir le débrancher à chaud :
hippo:~# hdparm -Y /dev/sdc
/dev/sdc:
issuing sleep command
Je le débranche donc et je le retire du serveur
Redimensionnements
Mais si le groupe de volumes occupe désormais le disque de 1To, le volume logique “fichiers” (la “partition” finale sous LVM) fait toujours l’ancienne taille (donc à peu près 300Go).
Il faut l’étendre, je demande donc à ce qu’il occupe la totalité du groupe de volumes :
hippo:~# lvextend -l 100%VG /dev/vg_data/fichiers
Extending logical volume fichiers to 931,51 GB
Logical volume fichiers successfully resized
Étape finale, il faut maintenant redimensionner le système de fichiers Ext3 pour qu’il utilise la totalité du volume logique, car il fait encore 300Go.
C’est uniquement pendant cette étape que le système de fichiers doit être démonté.
hippo:~# resize2fs /dev/vg_data/fichiers
resize2fs 1.41.3 (12-Oct-2008)
SVP exécutez « e2fsck -f /dev/vg_data/fichiers » d'abord.
Soit, je m’exécute :
hippo:~# e2fsck -f /dev/vg_data/fichiers
e2fsck 1.41.3 (12-Oct-2008)
Passe 1 : vérification des i-noeuds, des blocs et des tailles
Passe 2 : vérification de la structure des répertoires
Passe 3 : vérification de la connectivité des répertoires
/lost+found n'a pas été trouvé. Créer<o>? oui
Passe 4 : vérification des compteurs de référence
Passe 5 : vérification de l'information du sommaire de groupe
/dev/vg_data/fichiers: ***** LE SYSTÈME DE FICHIERS A ÉTÉ MODIFIÉ *****
/dev/vg_data/fichiers : 127313/19537920 fichiers (2.6% non contigus), 71360208/78141440 blocs
Puis :
hippo:~# resize2fs /dev/vg_data/fichiers
resize2fs 1.41.3 (12-Oct-2008)
Resizing the filesystem on /dev/vg_data/fichiers to 244189184 (4k) blocks.
Le système de fichiers /dev/vg_data/fichiers a maintenant une taille de 244189184 blocs.
Et le résultat, dans mon DomU de partage de fichiers :
hippo-nas:~# df -h
Sys. de fich. Tail. Occ. Disp. %Occ. Monté sur
/dev/xvda1 6,0G 583M 5,1G 11% /
tmpfs 513M 0 513M 0% /lib/init/rw
udev 10M 16K 10M 1% /dev
tmpfs 513M 4,0K 513M 1% /dev/shm
/dev/xvda2 917G 268G 603G 31% /var/fichiers
La voilà, ma grosse partition
Grapiller un peu de place
Mais pas assez grosse à mon goût, en effet, avec un disque de 1To, seulement 268+603 = 871Go d’espace exploitable, ça fait un peu mal.
Le journal Ext3, les inodes, et le marketing des fabricants font certes perdre un peu de place, mais pas autant, et pour cause : Ext3, par défaut pour des raisons de fiabilité du système, réserve 5% d’espace disque à root.
5%, dans l’absolu c’est peu, mais sur un disque de 1To, ça représente quand même 50Go, dommage, surtout pour un volume qui n’est pas du tout destiné à stocker des fichiers système.
Je rabaisse donc cette réservation à 0% (la manipulation peut se faire avec le système de fichiers monté) :
hippo-nas:~# tune2fs -m0 /dev/xvda2
tune2fs 1.41.3 (12-Oct-2008)
Initialisation du pourcentage de blocs réservés à 0% (0 blocs)
Le résultat parle de lui-même :
hippo-nas:~# df -h
Sys. de fich. Tail. Occ. Disp. %Occ. Monté sur
/dev/xvda1 6,0G 583M 5,1G 11% /
tmpfs 513M 0 513M 0% /lib/init/rw
udev 10M 16K 10M 1% /dev
tmpfs 513M 4,0K 513M 1% /dev/shm
/dev/xvda2 917G 268G 650G 30% /var/fichiers
47Go miraculeusement retrouvés !
L’opération est désormais terminée, j’ai plein d’espace à remplir et j’ai libéré mon 320Go pour qu’il parte vers d’autres horizons.
LVM, c’est le bien
J’espère que cet article vous aura donné envie d’utiliser LVM : on voit comment, avec des commandes simples (LVM a cette beauté d’utiliser une commande par action, au lieu de multiplier les options sur la même commande), on peut réaliser des opérations très puissantes sur nos précieuses données, et gérer avec souplesse son matériel.
Par rapport à du partitionnement classique, ça peut sembler un peu nébuleux, mais il ne faut pas hésiter à lire des tutoriaux, et l’essentiel est de garder à l’esprit l’arborescence :
Disque > Volume physique > Groupe de volumes > Volumes logiques > Systèmes de fichiers
Évidemment, j’aurais bien pu simplement formater directement le nouveau disque, lancer un rsync de l’ancien vers le nouveau, et modifier le montage pour aboutir au même résultat.
Mais ç’aurait été moins nerd, n’est-ce pas ?
Et surtout, avec plus de deux disques, les choses seraient devenues beaucoup moins simples.
Pour conclure : utilisez LVM !