Notes et transcriptions du cours “Montez un serveur de fichiers sous Linux” disponible sur la plateforme Openclassrooms.
Dans les chapitres précédents, vous avez vu comment partitionner un disque. Le problème est qu’une fois que vous avez partitionné votre disque, il est laborieux et risqué de redimensionner les partitions et d’en ajouter de nouvelles. De plus, quand on manque de place dans une partition, on pourrait être tenté d’en ajouter une nouvelle mais on ne pourra pas répartir automatiquement les données sur les deux partitions. Il faudra créer un point de montage pour chaque partition et répartir manuellement nos données entre ces différents points de montage. Ça peut vite devenir compliqué à gérer…
LVM répond à ces problématiques et va vous permettre de gérer beaucoup plus facilement vos espaces de stockage. Voyons un peu comment ça fonctionne.
LVM, qui signifie Logical Volume Management pour gestion de volume logique, est basé sur trois niveaux d’abstraction.
La première couche concerne les volumes physiques. Un volume physique peut être un disque entier, une partition ou un volume RAID. On doit “marquer” un volume physique pour pouvoir l’utiliser avec LVM. Essayons d’utiliser LVM avec notre disque RAID :
$ sudo umount /dev/md0 #Le volume doit être démonté $ sudo pvcreate /dev/md0 WARNING: ext4 signature detected on /dev/md0 at offset 1080. Wipe it? [y/n]: y Winping ext4 signature on /dev/md0 Physical volume “/dev/md0” successfully created
Vous pouvez voir toutes les informations sur vos volumes physiques avec les commandes sudo pvs
ou sudo pvdisplay
.
Ensuite, vous regrouperez ces volumes physiques dans des groupes de volumes. Pour l’instant, vous allez créer un groupe de volumes appelé “raid-volume” qui ne contient que votre RAID. Vous pourrez plus tard ajouter dynamiquement n’importe quel volume physique à ce groupe.
$ sudo vgcreate raid-volumes /dev/md0
Vous pouvez voir toutes les informations sur vos groupes de volumes avec les commandes sudo vgs ou sudo vgdisplay .
Enfin, vous allez découper ces groupes de volumes en volumes logiques qui sont l’équivalent LVM des partitions. Pour l’instant, vous allez créer un volume logique “data1” de 800 Mo et un volume “data2” de 200 Mo sur votre groupe de volume.
$ sudo lvcreate --name data1 --size 800M raid-volumes $ sudo lvcreate --name data2 --size 200M raid-volumes
Vous pouvez voir toutes les informations sur vos volumes logiques avec les commandes sudo lvs
ou sudo lvdisplay
.
Pour information, toutes les commandes qui concernent :
pv*
;vg*
;lv*
.
Comme évoqué précédemment, les volumes logiques fonctionnent comme des partitions. Pour chaque volume logique, LVM crée un fichier périphérique dans /dev
sous la forme /dev/{groupe_de_volume}/{volume_logique}
. Pour les utiliser, il vous faut donc les formater et les monter.
$ sudo mkfs -t ext4 /dev/raid-volumes/data1 $ sudo mount -t ext4 /dev/raid-volumes/data1 /var/data1 $ sudo mkfs -t ext4 /dev/raid-volumes/data2 $ sudo mkdir /var/data2 $ sudo mount -t ext4 /dev/raid-volumes/data2 /var/data
Et voilà, on a bien une partition /var/data1
de 800 Mo et une partition /var/data2
de 200 Mo.
Imaginons qu’après un certain temps d’utilisation, vous vous apercevez que 600 Mo vous suffiraient pour /var/data1
et que vous avez besoin de 1,4 Go pour /var/data2
.
Avec un système de partitionnement classique, vous seriez bien embêté mais avec LVM tout devient plus facile.
Une solution pourrait être :
/var/data1
et d’utiliser l’espace libéré sur ce volume ;Essayons !
Pour pouvoir réduire /var/data1
de 800 Mo à 600 Mo, il vous faut d’abord réduire le système de fichier et ensuite réduire le volume logique. LVM vous permet de faire tout ça en une seule commande !
Évidemment, pour que ce soit possible, il faut avoir assez d’espace disponible (moins de 600 Mo de données dans notre cas) et que votre système de fichiers supporte l’opération de réduction.
C’est le cas d’ext4 donc tout va bien.
$ sudo lvreduce --size 600M --resizefs /dev/raid-volumes/data1 Do you want to unmount “/var/data1” ? [Y|n] y fsck from util-linux 2.34 /dev/mapper/raid--volume-data1: 11/51296 files (0.0% non-contiguous), 7726/204800 blocks resize2fs 1.45.5 (07-Jan-2020) Resizing the filesystème on /dev/mapper/raid--volume-data1 to 153600 (4k) blocks. The filesystème on /dev/mapper/raid--volume-data1 is now 153600 (4k) blocks long. Size of logical volume raid-volume/data1 changed from 800.00 MiB (200 extents) to 600.00 MiB (150 extents). Logical volume raid-volume/data1 successfully resized
Avec l’option --resizefs
, la commande lvreduce
s’occupe de démonter la partition, de lancer un e2fsck
et un resize2fs
sur le système de fichier puis de réduire la taille du volume logique et de remonter la partition.
On voit au passage que le système utilise un autre nom pour notre volume logique dans /dev
mais si vous allez vérifier à coup de ls -l
, vous verrez que ce sont tous des liens qui pointent vers la même chose.
Les commandes LVM parlent d’extents. C’est comme ça que LVM gère son découpage. Un extent est un petit bout de groupe de volumes (unité d'allocation). LVM alloue ensuite ces extents à chaque volume logique.
Éteignez votre serveur, ajoutez un nouveau disque de 1Go (vde) et rallumez-le.
Commencez par sortir le disque de spare /dev/vdd
de votre RAID : il faudra simplement être plus réactif pour changer un disque qui tomberait en défaut.
$ sudo mdadm --manage /dev/md0 --fail /dev/vdd --remove /dev/vdd
Vous allez alors pouvoir utiliser ce disque /dev/vdd “libéré” pour créer un RAID 1 avec le nouveau disque /dev/vde
$ sudo mdadm --create /dev/md1 --level=raid1 --raid-devices=2 /dev/sdb /dev/sde
Enfin, pensez à mettre votre fichier /etc/mdadm/mdadm.conf
à jour :
/dev/md0
, indiquez spares=0
;/dev/md1
.
Vous avez maintenant 200 Mo de libres sur votre groupe de volume et un disque RAID vierge de 1 Go. Avec un partitionnement classique, vous ne pourriez pas augmenter la taille d’une partition “par l’arrière” ni la faire déborder sur un nouveau support physique. Vous devriez donc créer une nouvelle partition dans chaque espace disponible, les formater et les monter par exemple sur /var/data2b
et /var/data2c
.
Après cela, bonjour la gestion de la répartition des données entre /var/data2
, /var/data2b
et /var/data2c
!
Avec LVM, vous ne vous occupez plus de savoir où sont vos données et vous profitez simplement de cet espace libre pour agrandir votre volume logique.
On commence par marquer le nouveau RAID 1 comme un volume physique LVM :
$ sudo pvcreate /dev/md1
Ajoutez ce volume physique à votre groupe de volumes “raid-volumes” par la commande :
$ sudo vgextend raid-volumes /dev/md1
Il ne vous reste plus qu’à étendre votre volume logique à la taille souhaitée sans vous soucier de savoir où sont placées les données :
$ sudo lvextend --size +1200M --resizefs /dev/raid-volume/data2
En plus, avec l’option --resizefs
, lvextend
s’occupe d’agrandir votre système de fichier à votre place.
LVM facilite vraiment la gestion du partitionnement puisqu’on peut faire plus de choses avec moins d’effort. Pourtant, les possibilités de LVM ne s’arrêtent pas là. Une des fonctionnalités les plus intéressantes de LVM est la possibilité de faire des “snapshots”.
Un “snapshot” ou “instantané” en français est une image de l’état de votre volume logique à un instant t. Un snapshot est stocké sur le volume groupe donc il vous faut un peu d’espace non utilisé sur votre volume groupe.
$ sudo lvreduce --size -300M --resizefs /dev/raid-volumes/data2 $ sudo dd if=/dev/zero of=/var/data2/fichier_5M bs=1k count=5000 $ sudo dd if=/dev/zero of=/var/data2/fichier_10M bs=1k count=10000
Ici, vous avez réduit le volume logique/dev/raid-volume/data2 de 300 Mo et vous avez créé deux fichiers dans /var/data2
: un de 5 Mo et un de 10 Mo.
Pour ça, vous avez utilisé la commande dd
qui copie des données bit par bit. Comme son nom l’indique, le périphérique spécial /dev/zero
ne renvoie que des zéros. Vous l’avez donc utilisé pour écrire respectivement 5000 et 10000 blocs de 1 ko de zéros dans nos fichiers.
Créez maintenant un snapshot appelé backup_ddmmyyyy du volume logique /dev/raid-volume/data2
et allouez lui une taille de 100 Mo par la commande :
$ sudo lvcreate –snapshot –name backup_ddmmyyyy –size 100M /dev/raid-volumes/data2
Vous pouvez voir votre snapshot par les commandes sudo lvs
ou sudo lvdisplay
.
À sa création, un snapshot a une taille de 0. Il n’y a pas eu de copie des données, on a juste marqué le moment à partir duquel on va enregistrer les changements. Un snapshot est donc quasi-instantané même sur de très gros volumes de données. Ensuite, quand vous continuez à travailler, à ajouter, supprimer et modifier des fichiers sur votre volume logique, tous vos changements vont être enregistrés dans votre snapshot et ce dernier va grossir :
$ sudo rm /var/data2/fichier_10M && sudo lvs $ sudo rm /var/data2/fichier_5M && sudo lv
Si votre snapshot atteint la taille maximale que vous lui aviez allouée, il devient inutilisable. Heureusement, en cas de besoin, vous pouvez augmenter cette taille par la commande lvresize .
Vous pouvez ensuite utiliser votre snapshot comme n’importe quel volume logique. Pour récupérer des fichiers effacés par erreur, vous pouvez par exemple monter ce volume et retrouver vos fichiers dans l’état où ils étaient au moment où vous avez fait le snapshot :
$ sudo mkdir /var/snapshot $ sudo mount -t ext4 /dev/raid-volume/backup_ddmmyyyy /var/snapshot $ sudo cp /var/snapshot/fichier_* /var/data2
Une fois que vous n’avez plus besoin de votre snapshot, vous pouvez le supprimer :
$ sudo umount /var/snapshot $ sudo lvremove /dev/raid-volume/backup_ddmmyyy
Voilà, vous avez maintenant un petit aperçu de ce qu’il est possible de faire avec LVM.
Dans la partie suivante, nous utiliserons ces volumes de stockage pour partager des fichiers en réseau.