le montage n'est pas exécuté lorsqu'il est appelé par udev

17

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

magva
la source
Cela peut être hors de propos, mais pourquoi le faites-vous mkdir "$mount_dir"mais rmdir "/media/$device_name"? Où est $mount_dirplacé?
G-Man dit «Réintègre Monica»
désolé, c'est une faute de frappe, j'ai utilisé des alias de variables assez inutiles dans les codes originaux et je les ai supprimés ici pour plus de clarté
magva
Avez-vous essayé le débogage à l'ancienne; par exemple, en mettant set -xvet exec >> "$HOME"/mount.log 2>&1dans les .shfichiers?
G-Man dit `` Réintègre Monica ''
1
Je l'ai fait, mais selon le journal que j'obtiens, le montage est exécuté lorsque le script est appelé par udev. Il n'y a pas de différence dans le journal entre un appel depuis udev et depuis la ligne de commande ... c'est en fait plutôt déroutant
magva
1
dans ce cas, le script échouerait également lors de l'exécution à partir de la ligne de commande
magva

Réponses:

22

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=shareddans /usr/lib/systemd/system/systemd-udevd.serviceou (mieux) créer et éditer sa copie à/etc/systemd/system/

Voir man 5 systemd.execpour plus d'informations,MountFlags option.

user83388
la source
Qu'entendez-vous par «ne pas propager à l'hôte»?
sebelk
2
@sebelk Je pense que user83388 signifie qu'ils ne se propagent pas à l'espace de noms "root"
Mark
2

Au moment de la rédaction de ce document, les autres réponses sont incorrectes (ou obsolètes).

Vous ne devez pas exécuter à mountpartir d'un service Systemd. Même après avoir commenté leMountFlagsPrivateMounts lignes et systemd-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_WANTSvariable Udev pour démarrer une unité Systemd.

Métamorphique
la source
-1

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.

xae
la source
merci, mais le montage ne fonctionne toujours pas :(
magva
1
Peut-être pas votre cas, mais dans mon système, le montage se trouve dans / bin / mount. Essayez "command -v mount".
xae
1
Dans mon système, le chemin renvoyé par "command -v mount" est / usr / bin / mount. J'ai remarqué que j'avais également un exécutable / bin / mount, mais cela ne fonctionne pas non plus lorsqu'il est appelé par udev
magva