Chapitre 1315 minIntermédiaire
Disques, partitions, fstab et LVM
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- identifier les disques, partitions et systèmes de fichiers d'un serveur ;
- partitionner, formater et monter un disque de façon permanente ;
- écrire et tester une ligne de
/etc/fstab; - créer des volumes LVM et agrandir un volume à chaud.
3 exercices corrigés1 schéma
Gérer les disques d'un serveur Linux, c'est les partitionner, y créer des systèmes de fichiers, les monter dans l'arborescence de façon permanente avec /etc/fstab, et surveiller l'espace libre. LVM (Logical Volume Manager) ajoute une couche souple entre les disques et les systèmes de fichiers : on agrandit un volume, ou on ajoute un disque, sans réinstaller ni arrêter le serveur. Ce chapitre suit srv-web et srv-journaux de l'ajout d'un disque jusqu'à l'agrandissement d'un volume.
Disques et partitions
Linux nomme les disques d'après leur type d'interface :
| Nom | Disque | Partitions |
|---|---|---|
/dev/sda, /dev/sdb | SATA, SAS, USB, et disques SCSI des VM (contrôleur VirtIO SCSI de Proxmox) | /dev/sda1, /dev/sda2 |
/dev/vda | Disque VirtIO en mode bloc (autre choix dans Proxmox, fréquent chez les hébergeurs) | /dev/vda1 |
/dev/nvme0n1 | SSD NVMe | /dev/nvme0n1p1 |
Un disque se découpe en partitions, décrites par une table : GPT, le format actuel (jusqu'à 128 partitions, disques de plus de 2 Tio, obligatoire pour démarrer en UEFI), ou MBR, l'ancien format des machines en BIOS. Chaque partition reçoit ensuite un système de fichiers :
| Système | Où on le trouve | Points forts |
|---|---|---|
| ext4 | Choix par défaut de Debian et d'Ubuntu | Éprouvé, se répare bien, s'agrandit à chaud et se réduit à froid |
| XFS | Choix par défaut de RHEL | Très gros fichiers et volumes ; s'agrandit, ne se réduit pas |
| Btrfs | openSUSE, Fedora | Instantanés, compression, sommes de contrôle |
| ZFS | Proxmox VE, TrueNAS | Gestion des disques, RAID, instantanés et intégrité en un seul outil |
| swap | Partition ou fichier d'échange | Mémoire de secours quand la RAM est pleine |
| vfat | Partition système EFI (/boot/efi) | Lisible par le micrologiciel UEFI |
Voir les disques.
clambert@srv-web:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 976M 0 part /boot/efi
├─sda2 8:2 0 977M 0 part /boot
└─sda3 8:3 0 18G 0 part
├─srv--web--vg-root 254:0 0 5,6G 0 lvm /
├─srv--web--vg-swap_1 254:1 0 2G 0 lvm [SWAP]
└─srv--web--vg-home 254:2 0 10,4G 0 lvm /home
sdb 8:16 0 50G 0 disk
sr0 11:0 1 1024M 0 rom
C'est le résultat du schéma « disque entier avec LVM, /home séparé » de l'installeur (les tailles exactes dépendent de la taille du disque et de la version de l'installeur) : une partition EFI, une partition /boot hors LVM, et une grande partition sda3 qui contient le groupe de volumes srv-web-vg, découpé en trois volumes logiques. Dans les noms du device mapper, les tirets d'origine sont doublés (srv--web--vg-root pour le volume root du groupe srv-web-vg). Le disque sdb, ajouté ensuite dans Proxmox (Hardware > Add > Hard Disk), est vierge.
| Commande | Ce qu'elle montre |
|---|---|
lsblk -f | Les systèmes de fichiers, leurs étiquettes et leurs UUID |
sudo blkid | Les UUID et types de chaque partition |
sudo fdisk -l /dev/sdb | La table de partitions d'un disque |
df -h | L'espace utilisé et libre de chaque système de fichiers monté |
df -i | Les inodes utilisés : un disque peut être « plein » de petits fichiers avec de l'espace libre |
du -sh /var/log | La place occupée par un dossier |
sudo du -xh --max-depth=1 / | sort -h | Les plus gros dossiers de la racine, sans traverser vers d'autres disques |
findmnt | Tous les montages, en arbre |
Partitionner et formater un disque
On prépare sdb pour les fichiers du site de suivi. parted fait le travail en une commande, fdisk en mode interactif (g pour une table GPT, n pour une partition, w pour écrire) :
sudo parted /dev/sdb --script mklabel gpt mkpart donnees ext4 0% 100%
sudo mkfs.ext4 -L donnees /dev/sdb1
lsblk -f /dev/sdb
mklabel gpt crée la table, mkpart donnees ext4 0% 100% une partition nommée donnees sur tout le disque (le type ext4 n'est qu'une indication ; c'est mkfs.ext4 qui crée le système de fichiers), et -L donnees donne une étiquette au système de fichiers.
Monter un système de fichiers
Monter, c'est rattacher un système de fichiers à un dossier de l'arborescence :
sudo mkdir -p /srv/www
sudo mount /dev/sdb1 /srv/www
findmnt /srv/www
sudo umount /srv/www # démonter (aucun fichier ne doit y être ouvert)
Un montage fait à la main disparaît au redémarrage. Pour le rendre permanent, on l'écrit dans /etc/fstab, une ligne par système de fichiers, en désignant la partition par son UUID (donné par blkid) : les noms sdb, sdc peuvent s'échanger quand on ajoute un disque, l'UUID ne change pas.
# /etc/fstab
# <système de fichiers> <point de montage> <type> <options> <dump> <ordre de vérification>
/dev/mapper/srv--web--vg-root / ext4 errors=remount-ro 0 1
UUID=6b1f0a2c-9d3e-4c7b-8a51-2f4e7d9c0b13 /boot ext4 defaults 0 2
UUID=4C2E-91A7 /boot/efi vfat umask=0077 0 1
/dev/mapper/srv--web--vg-home /home ext4 defaults 0 2
/dev/mapper/srv--web--vg-swap_1 none swap sw 0 0
UUID=0f3c8e51-7a2b-4d96-b1c4-5e8a2d7f9b60 /srv/www ext4 defaults,nofail,nodev,nosuid 0 2
| Champ | Sens |
|---|---|
| 1 | Ce qu'on monte : UUID=…, LABEL=donnees, ou un volume LVM /dev/mapper/… (stable lui aussi) |
| 2 | Où : le point de montage (none pour le swap) |
| 3 | Le type de système de fichiers |
| 4 | Les options : defaults, nofail (le démarrage continue si le disque manque), noexec, nosuid, nodev (pas d'exécutable, pas de setuid, pas de périphérique), ro (lecture seule) |
| 5 | Sauvegarde par dump : toujours 0 aujourd'hui |
| 6 | Ordre de vérification au démarrage : 1 pour /, 2 pour les autres, 0 pour ne pas vérifier |
Après une modification, teste avant de redémarrer :
sudo findmnt --verify # vérifie la syntaxe et l'existence des sources
sudo systemctl daemon-reload # systemd régénère les unités .mount à partir de fstab
sudo mount -a # monte tout ce qui ne l'est pas encore : une erreur s'affiche ici
Le swap. swapon --show et free -h montrent l'espace d'échange. Pour en ajouter sans partition, un fichier suffit :
sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile
sudo mkswap /swapfile && sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
LVM : volumes physiques, groupes et volumes logiques
Avec des partitions classiques, agrandir / quand il est plein oblige à déplacer les partitions suivantes, voire à réinstaller. LVM insère une couche entre les disques et les systèmes de fichiers :
- un volume physique (PV, physical volume) est un disque ou une partition donnée à LVM (
/dev/sda3,/dev/sdb) ; - un groupe de volumes (VG, volume group) réunit un ou plusieurs PV en une seule réserve d'espace (
srv-web-vg) ; - un volume logique (LV, logical volume) est découpé dans le groupe et reçoit un système de fichiers (
root,home), comme une partition, mais redimensionnable et pouvant s'étendre sur plusieurs disques.
| Niveau | Créer | Afficher | Agrandir |
|---|---|---|---|
| Volume physique | pvcreate /dev/sdc | pvs, pvdisplay | pvresize /dev/sda3 (après agrandissement de la partition) |
| Groupe de volumes | vgcreate vg_donnees /dev/sdc | vgs, vgdisplay | vgextend srv-web-vg /dev/sdc |
| Volume logique | lvcreate -n logs -L 8G srv-web-vg | lvs, lvdisplay | lvextend -r -L +5G srv-web-vg/root |
clambert@srv-web:~$ sudo vgs
VG #PV #LV #SN Attr VSize VFree
srv-web-vg 1 3 0 wz--n- <18,07g 0
clambert@srv-web:~$ sudo lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home srv-web-vg -wi-ao---- 10,45g
root srv-web-vg -wi-ao---- 5,62g
swap_1 srv-web-vg -wi-ao---- 2,00g
La colonne VFree est la plus importante : ici, l'installeur a donné tout l'espace aux volumes, il ne reste rien dans le groupe.
Agrandir un volume logique
/var/log de srv-web se remplit. On ajoute un disque de 30 Gio (sdc) dans Proxmox, on le donne au groupe, et on crée un volume dédié aux journaux :
sudo pvcreate /dev/sdc
sudo vgextend srv-web-vg /dev/sdc
sudo lvcreate -n logs -L 10G srv-web-vg
sudo mkfs.ext4 -L logs /dev/srv-web-vg/logs
Puis on déplace le contenu de /var/log sur le nouveau volume, depuis une fenêtre de maintenance (les services écrivent dans /var/log en permanence) : monter le volume ailleurs, copier avec cp -a, ajouter la ligne /dev/mapper/srv--web--vg-logs /var/log ext4 defaults,nodev,nosuid,noexec 0 2 à /etc/fstab, redémarrer, vérifier.
Pour agrandir un volume existant, une seule commande suffit tant que le groupe a de l'espace libre :
sudo lvextend -r -L +5G srv-web-vg/root # ajoute 5 Gio à / et agrandit son système de fichiers
sudo lvextend -r -l +100%FREE srv-web-vg/home # donne tout l'espace libre restant à /home
df -h / /home
L'option -r (--resizefs) agrandit le système de fichiers dans la foulée, à chaud, sans démonter : ext4 et XFS s'agrandissent pendant que le serveur travaille. Sans -r, le volume est plus grand mais df n'affiche rien de plus, tant qu'on n'a pas lancé resize2fs (ext4) ou xfs_growfs (XFS).
Agrandir le disque virtuel lui-même. Si l'hyperviseur permet d'agrandir le disque (sda de 20 à 40 Gio, dans Proxmox Hardware > Hard Disk > Disk Action > Resize), il faut ensuite agrandir la partition qui porte le PV, puis le PV, puis le LV :
sudo apt install cloud-guest-utils # fournit growpart
sudo growpart /dev/sda 3 # agrandit la partition 3 jusqu'à la fin du disque
sudo pvresize /dev/sda3 # le PV prend la nouvelle taille
sudo lvextend -r -l +100%FREE srv-web-vg/root
Les instantanés LVM. sudo lvcreate -s -n root-avant-maj -L 2G srv-web-vg/root fige l'état de / avant une opération risquée ; sudo lvconvert --merge srv-web-vg/root-avant-maj revient en arrière au redémarrage suivant, sudo lvremove le supprime si tout s'est bien passé. Un instantané s'appuie sur le volume d'origine et grossit à chaque modification : ce n'est pas une sauvegarde, et il doit être supprimé vite. Sur une VM, l'instantané de l'hyperviseur rend le même service plus simplement.
Exercices
Exercice 1 sur 3 Lire lsblk Réussi À revoir
Sur srv-journaux, lsblk affiche :
NAME SIZE TYPE MOUNTPOINTS
sda 20G disk
├─sda1 976M part /boot/efi
├─sda2 977M part /boot
└─sda3 18G part
├─srv--journaux--vg-root 17G lvm /
└─srv--journaux--vg-swap_1 1G lvm [SWAP]
sdb 100G disk
sdc 100G disk
- Comment s'appelle le groupe de volumes, et combien de volumes logiques contient-il ?
- Quels disques ne sont pas encore utilisés ?
- Où seront écrits les journaux reçus des autres machines, si l'on ne change rien ?
Voir la réponseMasquer la réponse de l'exercice 1
srv-journaux-vg(tirets doublés dans les noms du device mapper) ; deux volumes logiques,rootetswap_1.sdbetsdc, de 100 Gio chacun : aucune partition, aucun point de montage.- Sur
/, puisque/srvn'a pas de volume à lui : les journaux reçus rempliraient le système de fichiers racine, ce qui finit par bloquer tout le serveur. Il faut leur donner un volume dédié, sur les deux disques libres (chapitre 14).
Tu avais trouvé ?
Exercice 2 sur 3 Ajouter un disque de données Réussi À revoir
Écris la suite de commandes pour : créer une table GPT et une partition sur tout /dev/sdb ; la formater en ext4 avec l'étiquette archives ; la monter de façon permanente sur /srv/archives, sans bloquer le démarrage si le disque est absent, sans exécution possible de programmes ; vérifier.
Voir la réponseMasquer la réponse de l'exercice 2
lsblk # vérifier que sdb est bien le disque vierge
sudo parted /dev/sdb --script mklabel gpt mkpart archives ext4 0% 100%
sudo mkfs.ext4 -L archives /dev/sdb1
sudo blkid /dev/sdb1 # relever l'UUID
sudo mkdir -p /srv/archives
Ligne ajoutée à /etc/fstab (avec l'UUID relevé) :
UUID=<uuid-de-sdb1> /srv/archives ext4 defaults,nofail,noexec,nodev,nosuid 0 2
Puis sudo findmnt --verify, sudo systemctl daemon-reload, sudo mount -a, et df -h /srv/archives doit afficher le nouveau système de fichiers. On peut aussi écrire LABEL=archives à la place de l'UUID.
Tu avais trouvé ?
Exercice 3 sur 3 Un volume plein Réussi À revoir
df -h / affiche /dev/mapper/srv--web--vg-root 5,5G 5,5G 0 100% /, et sudo vgs affiche VFree 12,00g.
- Peut-on agrandir
/sans arrêter le serveur ? - Écris la commande qui ajoute 4 Gio à
/. - Que se passe-t-il si l'on oublie l'option
-r?
Voir la réponseMasquer la réponse de l'exercice 3
- Oui : le groupe a 12 Gio libres, et ext4 s'agrandit à chaud.
sudo lvextend -r -L +4G srv-web-vg/root, puisdf -h /pour vérifier.- Le volume logique passe à 9,5 Gio environ, mais le système de fichiers garde son ancienne taille :
dfaffiche toujours 100 %. Il faut alors lancersudo resize2fs /dev/srv-web-vg/root.
Agrandir ne règle pas la cause : cherche ce qui a rempli / (sudo du -xh --max-depth=1 / | sort -h), souvent des journaux ou des sauvegardes oubliées.
Tu avais trouvé ?