Une compilation de documentations   { en , fr }

Les identificateurs de partitition sous Linux

Étiquettes:
Créé en:
Dernière modification:
Auteur:
Xavier Béguin
Version en anglais : Partition identifiers on Linux

Limites du système de nommage traditionnel des partitions

Sous les systèmes GNU/Linux, les partitions ont longtemps été montées en les désignant par le fichier bloc du périphérique correspondant que les systèmes de type Unix utilisent pour accéder aux dispositifs de stockage, par exemple /dev/sda1, /dev/sdc3, etc.

Cette méthode fonctionne bien dans la plupart des cas, mais peut parfois poser problème car le nom du fichier bloc du disque ou du dispositif de stockage peut changer après un redémarrage en cas de modification ou reconfiguration matérielle.

Ce sera par exemple le cas lorsqu'un dispositif USB est branché en même temps qu'un autre dispositif de stockage plutôt que seul, ou si un nouveau disque est ajouté au système et est détecté au démarrage avant le disque déjà en place. Dans ces cas-là, le nom du fichier bloc précédemment utilisé par une partition va changer après redémarrage, et le système ne reconnaîtra pas la partition ou tentera de monter une autre partition qui a réutilisé son nom précédent, causant parfois des erreurs empêchant le démarrage du système.

Les identificateurs alternatifs des partitions

Pour contourner ce problème, il existe d'autres manières de désigner une partition qui peuvent (selon les cas) être plus pérennes dans le temps. Ces désignations sont acceptées par certains logiciels accédant aux partitions, comme des programmes d'amorçage (comme GRUB) ou la commande mount.

La page de manuel mount(8) (en français) de la commande mount liste les identificateurs de systèmes de fichiers et de partitions qu'elle accepte (en ligne de commande ou dans le fichier /etc/fstab) en remplacement des noms de bloc périphérique. Voici un résumé de cette liste :

  • LABEL=étiquette : permet d'utiliser l'étiquette définie par un administrateur pour le système de fichiers à utiliser (si celui-ci en définit une). En ligne de commande, l'option -L peut aussi être utilisée pour la désigner (et dans ce cas on omettra le LABEL=) ;
  • UUID=uuid : utilise l'identifiant unique universel (UUID), généralement une série de chiffres hexadécimaux séparés par des traits d’union, définis par la plupart des systèmes de fichiers. Les caractères hexadécimaux doivent être fournis en minuscule. En ligne de commande, l'option -U peut aussi être utilisée pour le désigner (sans le UUID=) ;
  • PARTLABEL=étiquette: utilise une étiquette de partition, attribué par un administrateur dans les tables de partitionnement GUID (GPT), indépendamment du système de fichiers ;
  • PARTUUID=uuid : utilisé l'identifiant unique universel de partition, géré par les tables de partitionnement GUID (GPT), indépendamment du système de fichiers ;
  • ID=id : utilise le numéro d'identification du périphérique bloc matériel créé par udev (attention, cet identificateur dépend d'udev, de ses règles et du matériel, et n'est pas recommandé pour un usage général).

Notez qu'il faut choisir judicieusement les identificateurs utilisés car certains dépendent du matériel et d'autres peuvent ne pas être uniques dans certains cas (voir encadré ci-dessous).

L'UUID des systèmes de fichiers est toutefois l'identifiant le plus répandu, et est d'ailleurs généralement utilisé par défaut dans de nombreuses distributions GNU/Linux.

Les identificateurs basés sur le système de fichiers sont les plus pratiques mais doivent être utilisés avec précaution : en cas de clonage d'un système de fichiers, l'identificateur n'est pas modifié et ne sera plus unique dans le système.

Une partition désignée par un identificateur qui n'est pas unique ne sera pas montée par le système, ce qui peut empêcher le bon démarrage du système. C'est le cas des UUIDs des systèmes de fichiers, et encore plus de leurs étiquettes, gérées par les administrateurs (dont l'usage n'est généralement pas conseillé).

En pratique, on peut donc monter une partition dont le label serait VMSTORAGE depuis la ligne de commande à l'aide de la commande suivante :

mount LABEL=VMSTORAGE /mnt

L'identificateur LABEL=VMSTORAGE peut également être utilisé à la place de /dev/sdc2 par exemple dans le fichier /etc/fstab (voir le manuel fstab(5) pour plus d'information à ce sujet).

Les étiquettes des systèmes de fichiers doivent être définies ou modifiées à l'aide des outils spécialisés des différents types de systèmes de fichiers. Ce peut être, par exemple :

  • pour les systèmes ext2/3/4 : e2label /dev/sdc3 ETIQUETTE ou tune2fs -L ETIQUETTE /dev/sdc3 ;
  • pour les systèmes FAT : fatlabel /dev/sdc2 ETIQUETTE (fatlabel était auparavant appelé dosfslabel) ;
  • pour les systèmes NTFS : ntfslabel /dev/sdc2 ETIQUETTE ;
  • pour les partitions swap : swaplabel -L ETIQUETTE /dev/sdc2 ;
  • pour les partitions LUKS : cryptsetup config /dev/sdc2 --label ETIQUETTE (cette commande ne fonctionne que pour les partitions LUKS2).

Certaines de ces commandes permettent également de modifier l'UUID des systèmes de fichiers (ce qui est nécessaire en cas de clonage d'une partition).

Lister les systèmes de fichiers existants

La commande suivante permet de lister le différentes partitions présentes dans le système et leurs identificateurs (ce qui permet par exemple de vérifier visuellement leur unicité) :

lsblk -o +UUID,LABEL,PARTUUID,PARTLABEL

La variante ci-dessous affiche uniquement les informations des systèmes de fichiers avec leur UUID et leur éventuelle étiquette (ces deux versions sont identiques, --fs est un alias plus pratique) :

lsblk --fs
lsblk -o NAME,FSTYPE,LABEL,UUID,FSAVAIL,FSUSE%,MOUNTPOINT

La commande partx peut être utilisée pour afficher les UUIDs et étiquettes définis par la table de partition GUID, c'est à dire la GPT (ce sont donc les identificateurs PARTUUID et PARTLABEL) :

partx --show /dev/sda

Enfin, la commande findfs permet de rechercher le fichier de bloc d'une partition à l'aide des mots-clefs des identificateurs :

~# findfs UUID=dfc81e29-6d74-3388-8924-370db61ebc6c
/dev/mapper/vg0-root
~# findfs LABEL=MYSTICK
/dev/sdc1

Les liens symboliques fournis sous /dev/disk

D'autres logiciels ou commandes ne prennent cependant en compte que des fichiers blocs de périphériques (comme /dev/sda1, etc.). Dans ce cas, il est toujours possible d'utiliser les identificateurs décrits ci-dessus grâce aux liens symboliques créés dynamiquement dans les sous-répertoires de /dev/disk par udev, le gestionnaire de périphérique du noyau Linux.

/dev/disk contient plusieurs sous-répertoires proposant des liens symboliques utilisant selon les répertoires les différents types identificateurs décrits ci-dessus. Ces liens pointent vers le fichier de bloc du périphérique et de sa partition :

/dev/disk/
├── by-id
├── by-label
├── by-partlabel
├── by-partuuid
├── by-path
└── by-uuid

Les liens du sous-répertoire by-path utilisent des noms qui désignent le port matériel auxquels sont connectés les périphériques, avec un éventuel numéro de partition, par exemple pci-0000:00:1f.2-ata-1.0-part1. Ils ne sont pas pris en compte par mount.

Tous ces liens symboliques peuvent être utilisés là où les noms de partitions de périphériques classiques peuvent l'être. Par exemple, pour monter simplement une partition depuis un shell interactif, on pourra utiliser une commande de ce type :

mount /dev/disk/by-label/VMSTORAGE /mnt

Ou encore, pour utiliser l'UUID d'un système de fichier :

mount /dev/disk/by-uuid/2232ac39-351d-47db-a649-f16385a5ebec /mnt

Dans les logiciels les prenant en compte, il est conseillé d'utiliser les mots-clefs (tels que UUID=uuid) plutôt que les liens symboliques /dev/disk/by-{label,uuid,partuuid,partlabel} car les mots-clefs sont plus lisibles, fiables, et portables.

Forcer la mise à jour des liens symboliques

Si vous changez par exemple l'étiquette d'un système de fichier, les liens symboliques sous /dev/disk/by-label seront dans la plupart des cas mis à jour immédiatement par le gestionnaire de périphériques udev.

Il peut cependant arriver que ce lien ne soit pas mis à jour automatiquement (c'était du moins mon expérience d'il y a quelques années). Pour forcer cette mise à jour, il n'est alors pas nécessaire de redémarrer le système (ce qui peut être gênant dans le cas d'un serveur). La commande suivante permet de forcer cette mise à jour, pour la partition sdg par exemple :

echo add > /sys/block/sdg/uevent

Cette astuce a été trouvée sur le site pieter.barrezeele.be et j'ai pu vérifier sa validité. L'action change semble plus appropriée que add et pourrait probablement suffire, mais je n'ai plus la possibilité de vérifier ce point.

La commande udevadm permet a priori de faire la même chose (mais je n'ai pas pu vérifier en conditions réelles) :

udevadm trigger /dev/sdg

L'action déclenchée par défaut par la commande ci-dessus est change. Si ça ne suffit pas, on peut déclencher une action add en la précisant explicitement :

udevadm trigger --action=add /dev/sdg

Voir la page de manuel udevadm(8) (en anglais) pour plus de précisions.