Augmenter la taille d’un disque dur sous Linux avec LVM et Hyper-V

Augmenter la taille d'un disque dur sous Linux avec LVM

Salut à tous, aujourd’hui un TP axé système pour savoir comment Augmenter la taille d’un disque dur sous Linux avec LVM sous Hyper-V . En effet, j’ai rencontré ce cas de figure récemment après avoir taillé un /var un peu trop court sur une de mes machines virtuelles. Et si on trouve plein de documentation sur LVM pour redimensionner ses partitions et ajouter d’autres disques dans un volume group, le changement de la taille physique du disque dur n’est pas vraiment abordé correctement en ligne à mon goût. D’où ma tentative de répondre à cette question, ci dessous.

LVM ?

Si vous ne savez de que c’est (mais qu’est ce que vous faîtes ici alors ?) : c’est pour Logical Volume Manager. C’est mieux expliqué sur Wikipédia, donc je ne vais pas m’étendre la dessus. Pour faire simple, cela permet d’ajouter une couche d’abstraction entre vos volumes physique et les partitions utilisée par l’OS et ainsi de gérer logiciellement le partitionnement, la réplication ou encore la taille des partitions utilisé sur la machine ; et de changer tout ça dynamiquement…

Le schéma ci dessous résume vite fait quelques concepts en jeu dans un système LVM.

Augmenter la taille d'un disque dur sous Linux avec LVM

Augmenter la taille d’un disque dur sous Linux avec LVM

Virtual Disk dans Hyper-V

Dans mon cas, je souhaite augmenter le /var d’une VM sous Hyper-V, mais garder à l’esprit que la manip est là même sur n’importe quel hyperviseur et pour n’importe quel partition du système puisque c’est le disque physique qui va changer de taille. Techniquement c’est peu comme si vous dumpiez le disque dur d’une machine physique pour le copier sur un autre HDD plus grand.

Première étape :  éteindre la VM et allez dans les paramètre du disque pour étendre votre virtual-disk :

Augmenter la taille d'un disque dur sous Linux avec LVM

Partitions pour LVM

Démarrer votre VM, loguez-vous en tant que root, et vérifier que la nouvelle taille du disque dur est bien prise en compte par le système d’exploitation à l’aide de la commande fdisk -l. Je vous mets en rouge les champs intéressants.

root@srv:~# fdisk -l

Disque /dev/sda : 500 GiB, 536870912000 octets, 1048576000 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0xae09a7f6

Device    Boot   Start     End       Sectors   Size   Id Type
/dev/sda1 *      2048      499711    497664    243M   83 Linux
/dev/sda2        501758    629143551 628641794 299,8G 5  Extended
/dev/sda5        501760    629143551 628641792 299,8G 8e Linux LVM

[...]
Disque /dev/mapper/srv--vg-var : 28 GiB, 29997662208 octets, 58589184 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
[...]

Donc on voit que j’ai 300G de disque et 30Go alloué pour /var dispo. Je veux donner tout l’espace nouveau à /var. Pour ça on va aussi utiliser fdisk pour modifier les partitions. C’est un peu « touchy » car on doit supprimer les 2 partitions /dev/sda2 et /dev/sda5 existantes, puis les recréer exactement au même endroit avec les même réglages mais avec un secteur de fin plus loin.

Bein « yapuka », je vous mets le détails en commentaire vert après les commandes

root@srv:~# fdisk /dev/sda # démarrer fdisk sur le disque physique /dev/sda

Bienvenue dans fdisk (util-linux 2.25.2).
Les modifications resteront en mémoire jusqu'à écriture.
Soyez prudent avant d'utiliser la commande d'écriture.

Commande (m pour l'aide) : p  # afficher les partitions et notez dans un pastebin les valeurs en rouge
Disque /dev/sda : 500 GiB, 536870912000 octets, 1048576000 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0xae09a7f6

Device    Boot Start  End      Sectors    Size  Id  Type
/dev/sda1 *    2048   499711    497664    243M  83  Linux
/dev/sda2      501758 629143551 628641794 299,8G 5  Extended 
/dev/sda5      501760 629143551 628641792 299,8G 8e Linux LVM

Commande (m pour l'aide) : d # supprimer une partition
Numéro de partition (1,2,5, 5 par défaut) : 2 # la n°2 

La partition 2 a été supprimée.

Commande (m pour l'aide) : n # Créer un nouvelle partition
Type de partition
p primaire (1 primaire, 0 étendue, 3 libre)
e étendue (conteneur pour partitions logiques)
Sélectionnez (p par défaut) : e # Créer un nouvelle partition de type étendue
Numéro de partition (2-4, 2 par défaut) : 2 # Même numéro que celle qu'on vient de supprimer
Premier secteur (499712-1048575999, 499712 par défaut) : 501758 # La nouvelle partition commence exactement au même endroit que celle qu'on vient de supprimer
Dernier secteur, +secteurs ou +taille{K,M,G,T,P} (501758-1048575999, 1048575999 par défaut) : # on laisse par défaut, ce qui correspond à la fin du disque.

Une nouvelle partition 2 de type « Extended » et de taille 499,8 GiB a été créée.

Commande (m pour l'aide) : p # on réaffiche l'état actuel de nos partitions

Disque /dev/sda : 500 GiB, 536870912000 octets, 1048576000 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0xae09a7f6

Device    Boot   Start     End        Sectors    Size Id Type
/dev/sda1 *      2048      499711     497664     243M 83 Linux
/dev/sda2        501758    1048575999 1048074242 499,8G 5 Extended
/dev/sda5 2      628641793 628641792             299,8G 8e Linux LVM

Les entrées de la table de partitions ne sont pas dans l'ordre du disque.

Commande (m pour l'aide) : d # On supprime la n°5 créée en même temps que notre nouvelle partition étendue mais qui ne correspond plus à rien.
Numéro de partition (1,2,5, 5 par défaut) : 5

La partition 5 a été supprimée.

Commande (m pour l'aide) : n # on créé une nouvelle partition n°5
Type de partition
p primaire (1 primaire, 1 étendue, 2 libre)
l logique (numéroté à partir de 5)
Sélectionnez (p par défaut) : l # de type logique

Ajout de la partition logique 5
Premier secteur (503806-1048575999, 503808 par défaut) : # on laisse par défaut, l'outil ne proposant pas l'alignement initial (501760) que l'on veut pour l'instant.
Dernier secteur, +secteurs ou +taille{K,M,G,T,P} (503808-1048575999, 1048575999 par défaut) : # On prend tout l'espace dispo

Une nouvelle partition 5 de type « Linux » et de taille 499,8 GiB a été créée.

Commande (m pour l'aide) : x # passage en mode "avancé" de fdisk

Commande pour spécialistes (m pour l'aide) : b # on souhaite déplacer le début des données dans une partition
Numéro de partition (1,2,5, 5 par défaut) : 5 # pour la n°5
Nouveau début de données (501759-1048575999, 503808 par défaut) : 501760 # Début qu'on repositionne exactement au même endroit que l'initiale.

Commande pour spécialistes (m pour l'aide) : p # On ré-affiche nos partitions, pour s'assurer que le début de nos partitions correspond bien aux valeurs initiales

Disque /dev/sda : 500 GiB, 536870912000 octets, 1048576000 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0xae09a7f6

Device    Boot Start  End        Sectors   Id  Type     Start-C/H/S End-C/H/S  Attrs
/dev/sda1 *    2048   499711     497664     83 Linux    0/33/32     31/59/26   80
/dev/sda2      501758 1048575999 1048074242 5  Extended 31/27/59    758/31/213 00
/dev/sda5      501760 1048575999 1048074240 83 Linux    31/61/91    758/31/213 00

Commande pour spécialistes (m pour l'aide) : r # il reste juste à modifier le type, retour en mode normal.

Commande (m pour l'aide) : t # modifier le type d'une partition
Numéro de partition (1,2,5, 5 par défaut) : 5 # la n°5
Code Hexa (taper L pour afficher tous les codes) : L # on liste les types existant
[...]
8 AIX    4e     2e partie QNX4.    8e LVM Linux    df BootIt
[...]
Code Hexa (taper L pour afficher tous les codes) :8e # on veut une partition LVM linux comme initialement.
Type de partition « Linux » modifié en « Linux LVM ».

Commande (m pour l'aide) : p # On affiche l'état de nos partitions
Disque /dev/sda : 500 GiB, 536870912000 octets, 1048576000 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0xae09a7f6

Device    Boot Start  End       Sectors     Size  Id  Type
/dev/sda1 *    2048   499711     497664     243M   83 Linux
/dev/sda2      501758 1048575999 1048074242 499,8G 5  Extended
/dev/sda5      501760 1048575999 1048074240 499,8G 8e Linux LVM

#Attention une fois que les modifications seront écrite plus de retour en arrière possible. Donc si vous avez un doute, vérifier plutôt deux fois qu'une ici...
Commande (m pour l'aide) : w # Tout est bon On écrit les modifications sur le disque
La table de partitions a été altérée.
Appel d'ioctl() pour relire la table de partitions.
Échec de relecture de la table de partitions.: Périphérique ou ressource occupé

Comme on fait les modifications en live, le noyau continue à utiliser l’ancienne table.  La nouvelle sera utilisée lors du prochain démarrage. Donc on reboot :

shutdown -r now

PV, VG et LV  dans LVM

Bon c’est pas fini, on a réaligner nos partitions sur la taille du nouveau disque mais LVM lui n’est au courant de rien. Il faut lui dire d’occuper tout se nouvel espace :

root@srv:~# pvresize /dev/sda5
Physical volume "/dev/sda5" changed
1 physical volume(s) resized / 0 physical volume(s) not resized

On vérifie que tout s’est bien passé :

root@srv:~# pvs
PV        VG     Fmt  Attr PSize   PFree
/dev/sda5 srv-vg lvm2 a--  499,76g 200,00g

root@srv:~# vgs
VG     #PV #LV #SN Attr   VSize   VFree
srv-vg 1   5   0   wz--n- 499,76g 200,00g

Donc on a bien nos nouveaux 200Go marqués comme libres dans LVM désormais. On va étendre le volume logique /var pour utilisé cet espace.

root@srv:~# lvextend -l 100%FREE /dev/srv-vg/var
Size of logical volume srv-vg/var changed from 27,94 GiB (7152 extents) to 200,00 GiB (51200 extents).
Logical volume var successfully resized

A ce niveau je vous laisse vérifier avec pvdisplay ou pvs

File System

Par contre on a pas encore tout à fait terminé, il reste à redimensionner le système de fichier posé sur la partition  pour que lui aussi occupe tout l’espace :

root@srv:~# resize2fs /dev/srv-vg/var
resize2fs 1.42.12 (29-Aug-2014)
Le système de fichiers de /dev/srv-vg/var est monté sur /var ; le changement de taille doit être effectué en ligne
old_desc_blocks = 2, new_desc_blocks = 13
Le système de fichiers sur /dev/srv-vg/var a maintenant une taille de 52428800 blocs (4k).

Pour finir, on vérifie que le système a  bien pris en compte les changements;

root@srv:~# df -h
Sys. de fichiers        Taille Utilisé Dispo Uti% Monté sur
/dev/mapper/srv--vg-var 197G   27G     163G  14%  /var

Et voilou.

Le mot de la fin

Bon alors c’est à la fois très simple d’augmenter la taille d’un disque dur sous Linux avec LVM. il suffit d’aligner de nouvelles partitions similaires aux initiales sur le point de départ des anciennes et ensuite d’indiquer à tout le monde de se réajuster avec le nouvelle espace disponible. Et en même temps il ne faut pas se louper sur la partie fdisk, même sis c’est juste un jeu de poupée russes… Mais si vous cassez vos partitions : votre système ne redémarrera pas et vous allez commencer à « en chier » pour récupérer vos données, donc je vous conseille de faire un backup avant si vous n’êtes pas certains de ce que vous faîtes…

J’espère que ça en aidera un ou deux. et au pire ça me fera de la doc dans un coin !

@+

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *