J'ai essayé de créer des règles udev pour monter et démonter mes lecteurs flash USB; les règles du moment sont très simples:
ACTION=="add",KERNEL=="sd[b-z]",RUN+="/root/scripts/plug_flash_drive.sh %k"
ACTION=="remove",KERNEL=="sd[b-z]",RUN+="/root/scripts/unplug_flash_drive.sh %k"
plug_flash_drive.sh est également très simple:
device_name=$1
mount_options="umask=000,utf8"
if [ ! -e "/media/$device_name" ]; then
mkdir "/media/$device_name"
fi
sleep 1
/usr/bin/mount "/dev/$device_name" "/media/$device_name" -o "$mount_options"
unplug_flash_drive.sh:
device_name=$1
umount "/dev/$device_name"
rmdir "/media/$device_name"
J'ai fait quelques tests afin de pouvoir vérifier que:
- Lorsqu'il est branché, mon lecteur flash est détecté; un fichier est créé dans / dev
- plug_flash_drive.sh est appelé par udev
- la partie mkdir du script fonctionne
- cependant, il semble que la partie "montage" du script ne soit pas exécutée, donc mon lecteur n'est pas monté
- quand j'appelle mes scripts sur la ligne de commande, ils fonctionnent parfaitement
Quelqu'un sait-il pourquoi le montage n'est pas exécuté lorsqu'il est appelé par udev?
EDIT 28/08/14: J'ai ajouté "grep -q / proc / mounts && echo success || echo failure" à la fin de mon script pour vérifier dans mon journal de débogage si le périphérique est réellement monté avant la fin du script. Il semble que le périphérique soit monté à ce point même lorsque le script est appelé par udev. Donc, le vrai problème est maintenant "mon périphérique de bloc est apparemment démonté après la fin du script de montage lorsqu'il est appelé via udev": s
mkdir "$mount_dir"
maisrmdir "/media/$device_name"
? Où est$mount_dir
placé?set -xv
etexec >> "$HOME"/mount.log 2>&1
dans les.sh
fichiers?Réponses:
systemd-udevd s'exécute dans son propre espace de noms de système de fichiers et, par défaut, les montages effectués dans udev .rules ne se propagent pas à l'hôte. Pour rendre vos anciens scripts fonctionnent , vous pouvez définir
MountFlags=shared
dans/usr/lib/systemd/system/systemd-udevd.service
ou (mieux) créer et éditer sa copie à/etc/systemd/system/
Voir
man 5 systemd.exec
pour plus d'informations,MountFlags
option.la source
Au moment de la rédaction de ce document, les autres réponses sont incorrectes (ou obsolètes).
Vous ne devez pas exécuter à
mount
partir d'un service Systemd. Même après avoir commenté leMountFlags
PrivateMounts
lignes etsystemd-udevd.service
, votre règle ne fonctionnera pas pour les systèmes de fichiers FUSE comme NTFS ou exFAT, car le processus FUSE sera utilement tué par Systemd.Voir cette page ArchWiki qui répertorie plusieurs meilleures options. Ma préférence est un petit projet sur GitHub appelé udev-media-automount , qui redémarre simplement un service Systemd à partir de la règle Udev. C'est un moyen pratique de contourner les diverses restrictions lourdes d'Udev sur les espaces de noms et les processus enfants.
Voir également cette réponse , qui montre comment utiliser la
SYSTEMD_WANTS
variable Udev pour démarrer une unité Systemd.la source
Vous pourriez essayer d'utiliser
:=
au lieu de+=
dans les affectations de règles RUN.L'
:=
opérateur définit la valeur de la liste et interdit les modifications supplémentaires.la source