Artisan Numérique

/système/stockage/kernel/ Les volumes et leurs alias

Un point généralement assez irritant sous GNU/Linux lorsque l'on cherche à identifier précisément une partition issue d'un média amovible est que tout se passe comme si le kernel tirait le nom du périphérique aux dés. Le but ici est donc de se débrouiller pour que notre volume ait toujours le même nom sans aller torpiller UDEV, que chaque partition puisse avoir le sien, et, tant qu'à faire, qu'il soit compréhensible par un humain standard.

Une affaire d'alias

Sous Linux, un disque, qu'il soit branché à chaud ou pas, est visible sous /dev. Il y a encore peu de temps le nommage était /dev/hdX si le disque était IDE (PATA) et /dev/sdX dans le cas contraire. Si le disque possédait des partitions, celle-ci prenaient le même nom suivi d'un chiffre indiquant son numéro. Aujourd'hui, après une récente unification de la gestion des disques PATA/SATA dans le kernel, qu'il soit USB, IDE ou SCSI, il apparaîtra en /dev/sdX. Le X est ici la base de notre problème car en fonction de l'ordre d'insertion des médias, cette lettre n'est à peu prés jamais la même.

La solution à notre problème réside en le fait qu'une partition formatée avec un système de fichier donné possède, outre ce nom, au moins deux attributs modifiables par l'utilisateur : un label et un UUID.

L'UUID est une suite de chiffre que l'on peut considérer comme unique et le label est une simple une chaîne de caractères. Pour un système FAT32 c'est le numéro de série (XXXX-YYYY) qui fait office est d'UUID.

Ces deux attributs sont utilisés par udev pour créer automatiquement des alias des partitions permettant de s'affranchir du nommage pseudo aléatoire du kernel en utilisant des identifiants stables dans le temps.

Ainsi un même volume /dev/sda3 ayant pour UUID 2e39c022-589c-11dd-a48a-7162f299b21d et pour label ma_partition, va apparaître sous la forme d'un alias en /dev/disk/by-uuid/2e39c022-589c-11dd-a48a-7162f299b21d et d'un autre en /dev/disk/by-label/ma_partition.

Modifications des attributs

Chaque système de fichier a ses outils propres pour ce genre de travail. Pour lire les attributs d'un système EXT2/EXT3 nous utiliserons la commande dumpe2fs :

dumpe2fs /dev/sda3

Une autre commande (source slc66

blkid

Cette commande a en plus le bon goût de donner pour chaque volume le système de fichier utilisé.

Ne reste maintenant plus qu'à utiliser la commande tune2fs pour changer ces valeurs. Tout d'abord, le label :

tune2fs -L ma_partition /dev/sda3

Pour changer l'UUID, il faut déjà en générer un avec la commande uuidgen puis encore utiliser la commande tune2fs :

uuidgen
> dec3cbc6-0b42-11db-9e45-7542811b6ad4
tune2fs -U dec3cbc6-0b42-11db-9e45-7542811b6ad4 /dev/sda3

Pour donner le numéro de série dec3cbc6-0b42-11db-9e45-7542811b6ad4 à la partition sda3, et ainsi pouvoir y accéder par un /dev/disk/by-uuid/dec3cbc6-0b42-11db-9e45-7542811b6ad4, il suffit de taper :

tune2fs -U dec3cbc6-0b42-11db-9e45-7542811b6ad4 /dev/sda3

Une fois ces modifications réalisée, il suffit de débrancher puis de rebrancher le disque (ou démonter/remonter les partitions s'il s'agit de disques IDE ou SATA), pour que notre /dev/sda3 soit disponible sous le nom de /dev/disk/by-uuid/dec3cbc6-0b42-11db-9e45-7542811b6ad4 ou beaucoup mieux /dev/disk/by-label/ma_partition.

Pour les disques en FAT32, vous pouvez soit changer ces attributs au formatage de la partition :

mkdosfs -n truc_en_fat -i ABCD1234 /dev/sda4

Soit passer par la commande mlabel du paquet mtools (merci à M@N

mlabel -i /dev/sda4 -N ABCD1234 ::truc_en_fat

Ce qui dans les deux cas nous donne un /dev/disk/by-uuid/ABCD-1234 et un /dev/disk/by-label/truc_en_fat

Utiliser les attributs pour le montage

La syntaxe de fstab a été modifiée pour prendre directement en compte les deux attributs, soit par UUID :

UUID=dec3cbc6-0b42-11db-9e45-7542811b6ad4 /media/ma_partition ext3 noatime,nodiratime 1 2

Encore un peu cryptique, ce serait plus sympathique directement avec le label :

label=ma_partition /media/ma_partition ext3 noatime,nodiratime 1 2

Voilà qui est beaucoup mieux.

Utiliser les attributs pour désactiver des volumes

Dans de nombreuses situations il n'est pas souhaitable que certaines partitions apparaissent sur le bureau de Gnome ou même qu'elle soit montées automatiquement. C'est le cas lorsque l'on a un disque "Alien" contenant une série de partitions utilisées par exemple par VMWare ou encore pour la partition de pam_usb contenant les clefs.

Il est possible d'utiliser gconf-editor et de basculer /apps/nautilus/desktop/volumes_visible à false. Mais l'on perd du coup tous les volumes ce qui n'est pas acceptable.

Une autre solution consiste à ajouter un "noauto" dans les options de montage de gnome-volume-manager par un click-droit/propriétés sur le volume. Mais cela ne marche pas avec tous les millésimes de Gnome.

La solution que j'ai retenue est d'ajouter ses propres préférences à HAL qui est chargé de la découverte des volumes. Pour cela, il suffit simplement de créer un fichier /usr/share/hal/fdi/policy/preferences.fdi et d'utiliser les UUID des volumes à ne pas monter :

  <?xml version="1.0" encoding="UTF-8"?>
<deviceinfo version="0.2">
  <device>
    <match key="volume.uuid" string="a78f4795-08a4-4d7f-855d-23c61c769d49">
      <merge key="volume.ignore" type="bool">true</merge>
    </match>
  </device>
</deviceinfo>

A partir de maintenant cette partition sera systématiquement ignorée. Pour que cela fonctionne à chaud, il faut redémarrer HAL par /etc/init.d/haldaemon restart, retirer la clef et la repositionner. Le volume devrait du coup ne plus être affiché sur le bureau.

Conclusion

Voilà nos disques sont maintenant un peu plus civilisés. Ce type de nommage est particulièrement utile dés qu'il s'agit de périphériques USB, par exemple un disque de backup ou une clef de stockage. En gros à chaque fois que l'on a besoin d'utiliser un montage dans un script. Outre cet usage, les labels sont aujourd'hui universellement prise en charge par les bureaux pour nommer dynamiquement les icônes.