Fixer les règles : prendre le contrôle d’udev pour avoir votre disque externe là ou ont veux et au démarrage (si, si !)

Sur mon poste de travail j’utilise un disque externe, qui héberge les fichiers relatif à mes machines virtuelles kvm. Les machines elles-même, mais aussi les image iso.

Ce disque est soit branché au démarrage, ou pas. Sur ma debian, le daemon libvirt n’est pas lancé au boot pour cette raison.

J’ai donc décidé de rédiger une règle udev, qui effectue le montage de mon disque externe dans /media/dd_ext et qui démarre le daemon libvirt dans la foulée.

Première étape : Identifier le disque externe.
On va travailler sur l’UUID. Mon disque est actuellement connecté sous l’appellation /dev/sdd1.
Pour obtenir son uuid :

root@desktop# blkid /dev/sdd1
/dev/sdd1: UUID= »1e8aa98c-0839-4112-b1e9-832355a5c3fc » TYPE= »ext4″

Deuxième étape : écrire la règle udev
Les règles udev sont dans le répertoire /etc/udev/rules.d. Pour que notre règle soit prioritaire sur les règles générales, elle doit commencer par un nombre inférieur. La deuxième contrainte est que le nom de la règle finisse par rules. Entre les deux, c’est openbar.
Ma règle s’appelle : /etc/udev/rules.d/10-perso-hdd-ext.rules
Ainsi je suis sur de comprendre qu’elle n’est pas « officiel » et à quoi elle correspond.
Le contenu :
On commence par indiquer à udev dans quel cas il doit appliquer la règle.
Si l’évènement noyau ne fait pas allusion à l’expression régulière sd[a-z][0-9] alors file à la section hdd_end (nom arbitraire)
KERNEL!="sd[a-z][0-9]", GOTO="hdd_end"
Donc si on est bien en présence d’un sd[a-z][0-9], on récupère dans la variable IMPORT le contenu de l’exécution de la commande /sbin/blkid -o udev -p %N
Le chemin complet vers l’utilitaire est obligatoire. Ici, on va donc exécuter blkid en lui demandant d’envoyer les informations au format udev, pour le périphérique %N. %Nest une variable udev qui correspond au nom temporaire du périphérique, auquel on accède. Il s’agit du nom avant son affectation définitive. Avant qu’il ne deviennent sdd1 par exemple.
IMPORT{program}="/sbin/blkid -o udev -p %N"
Maintenant que udev à récupéré les informations importante de mon disque (comme l’uuid, mais aussi le type de filesystem) on va lui dire quoi faire :
Si le périphérique est de type filesystem, que son uuid est 1e8aa98c-0839-4112-b1e9-832355a5c3fc alors, crée un lien dans /dev avec comme nom dd_ext, et exécute le programme /etc/init.d/libvirt-bin start
En langue udev, ça donne :
ENV{ID_FS_USAGE}=="filesystem", ENV{ID_FS_UUID}=="1e8aa98c-0839-4112-b1e9-832355a5c3fc", SYMLINK+="dd_ext", RUN+="/etc/init.d/libvirt-bin start"
Voila c’est presque fini. Il nous reste à écrire la correspondance à notre GOTO, pour que dans les autres cas, udev aille directement à l’étiquette hdd_end et face ce qui la suit, c’est à dire ici : rien :
LABEL="hdd_end"
La règle complète est donc :

# cat /etc/udev/rules.d/10-perso-hdd-ext.rules
KERNEL!= »sd[a-z][0-9]« , GOTO= »hdd_end »
IMPORT{program}= »/sbin/blkid -o udev -p %N »
ENV{ID_FS_USAGE}== »filesystem », ENV{ID_FS_UUID}== »1e8aa98c-0839-4112-b1e9-832355a5c3fc », SYMLINK+= »dd_ext », RUN+= »/etc/init.d/libvirt-bin start »
LABEL= »hdd_end »

Notre règle est terminée. Il ne reste plus qu’a modifier notre fichier fstab pour que le système puisse mounter notre disque au bon endroit avec les bon paramètres. On ajoute donc la ligne suivante au fichier /etc/fstab :
/dev/dd_ext /media/dd_ext auto user,atime,auto,rw,nodev,exec,suid 0 0

Il suffit de relancer udev par un petit :

/etc/init.d/udev restart

et de rebrancher notre disque pour constater que tout fonctionne.

Print Friendly
Vus : 1253
Publié par Alexandre LUCAZEAU : 35