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 leLABEL=
) ;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 leUUID=
) ;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 :
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
outune2fs -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é) :
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) :
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
) :
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 :
Ou encore, pour utiliser l'UUID d'un système de fichier :
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 :
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) :
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 :
Voir la page de manuel udevadm(8) (en anglais) pour plus de précisions.