Utilisez UUID dans les règles udev et montez le lecteur USB sur / media / $ UUID

13

Je veux monter le lecteur USB en /mediafonction de l'UUID du disque. Comment puis-je utiliser l'UUID d'un lecteur USB dans un fichier de règles udev et qu'est-ce qu'une règle udev pour monter le lecteur USB avec le numéro UUID comme nom de dossier.

La blkidcommande génère l'UUID d'un disque mais uniquement lors du montage.

Talespin_Kit
la source
1
Avertissement 2019: sur les systèmes Linux de bureau modernes utilisant systemd, les règles udev ne montent pas les systèmes de fichiers dans l'espace de noms utilisateur normal, c'est-à-dire que vous ne pouvez pas monter un système de fichiers à l'aide de la commande mount dans une règle udev. De plus, dans ces systèmes, le système de fusibles (systèmes de fichiers utilisateur) est configuré pour gérer les montages USB via une icône de bureau, donc le montage à la main à l'aide d'une règle fstab est dans une certaine mesure en conflit avec le système de fusibles. Pour monter automatiquement des systèmes de fichiers USB par UUID sur un serveur sans tête, il est préférable de supprimer la configuration de fusible systemd et d'utiliser les règles udev pour déclencher des services de montage en une seule fois.
Jonathan Ben-Avraham
Voir cette solution utilisant fstab, systemd et automount, testée sur la récente Debian: unix.stackexchange.com/a/347007/31228
Jonathan Ben-Avraham

Réponses:

14

Même si les UUID ne sont pas directement accessibles par udev, au moins dans Fedora et Ubuntu, ils sont définis comme variables d'environnement ( ENV). Vous pouvez lire toutes les variables d'environnement d'un périphérique en appelant udevadm info /dev/sdc. Par exemple, pour un NTFS sur un disque externe, j'obtiens:

$ udevadm info /dev/sdc2
P: /devices/pci0000:00/0000:00:14.0/usb4/4-2/4-2:1.0/host7/target7:0:0/7:0:0:0/block/sdc/sdc2
N: sdc2
[…]
E: ID_FS_TYPE=ntfs
E: ID_FS_USAGE=filesystem
E: ID_FS_UUID=4A6F2ABC1232FA37
[…]

Tout ce qui a un E:devant est défini comme une variable d'environnement.

Correspondance avec les UUID

Vous pouvez rivaliser avec ENV{ID_FS_UUID}=="4A6F2ABC1232FA37". En tant que premier filtre, je me compare KERNEL=="sd?2"pour m'assurer que je ne gère que les périphériques de bloc avec le numéro de partition correct. La règle complète ressemblerait à ceci:

KERNEL=="sd?2", ENV{ID_FS_UUID}=="4A6F2ABC1232FA37", RUN+="/usr/bin/logger --tag my-manual-usb-mount Mounting the device with UUID 4A6F2ABC1232FA37", RUN+="/usr/bin/mount [Your mount options here]"

La commande logger est utile pour affirmer que la règle est réellement exécutée. Ensuite, vous devez vérifier que la règle ne contient aucune erreur de syntaxe avec udevadm test /dev/sdc2. Votre fichier de règles doit être répertorié dans la sortie et aucun message d'erreur ne doit apparaître à côté. Maintenant , vous pouvez déclencher toutes les règles de votre appareil pour vérifier si votre règle fonctionne comme prévu: sudo udevadm trigger /dev/sdc2. Si votre règle correspond, vous trouverez le message de journal personnalisé dans le journal système ( /var/log/syslogou via journalctl -b).

Edit: ali_m a souligné que les variables d'environnement sont définies par les règles précédentes et donc uniquement accessibles si votre .rulesfichier a un ordre lexicographique suffisamment élevé . Commencer par "60" devrait suffire. Personnellement, je commence mes règles par "zz" (si possible) pour les distinguer des règles prédéfinies en un coup d'œil.

Utilisation des UUID dans la RUNcommande et ailleurs

Udev a une syntaxe de substitution de variable et d'attribut assez puissante . Plus précisément, chaque occurrence de $env{ID_FS_UUID}sera remplacée par l'UUID du lecteur. Donc, pour monter un appareil sous /media/UUIDvous pouvez utiliser cette règle:

KERNEL=="sd??", RUN+="/usr/bin/mkdir /media/$env{ID_FS_UUID}", RUN+="/usr/bin/mount $devpath /media/$env{ID_FS_UUID}"

Vous voudrez probablement configurer les udisks à la place, cependant, il est spécialisé pour l'espace de problème que vous souhaitez résoudre. Voir https://wiki.archlinux.org/index.php/udisks#udisks2:_mount_to_.2Fmedia comme point de départ.

Mon cas d'utilisation réel pour monter des périphériques avec udev au lieu de /etc/fstabou udisks est de monter des systèmes de fichiers zfs qui ont quelques particularités les rendant pas tout à fait adaptés aux outils habituels.

Perséides
la source
1
Un point crucial qui m'a pris un certain temps à comprendre: afin de faire correspondre les variables d'environnement, votre règle doit être appliquée après la configuration de ces variables. Pour ce faire, votre .rulesnom de fichier doit commencer par un nombre> 60 .
ali_m
@ali_m: Merci, j'ai ajouté vos informations à la réponse.
Perseids
Ubuntu 18.04, certaines commandes udevadm peuvent être pointées vers / dev / sdXX (par exemple, udevadm info), d'autres doivent être pointées vers / sys / block / sdXX pour une raison quelconque (par exemple, udevadm test).
Greg Bell
0

Il y a une solution approximative qui me vient à l'esprit. Définissez l'entrée fstab co-répondante identifiée par l'UUID. Et dans les règles udev, exécutez mount -achaque fois qu'un nouveau périphérique sd * est ajouté.

l'eau
la source