mount non viene eseguito quando chiamato da udev


17

Ho provato a creare alcune regole udev per montare e smontare le mie unità flash USB; le regole per il momento sono molto semplici:

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 è anche molto semplice:

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"

Ho fatto alcuni test in modo da poter accertare che:

  • Quando collegato, la mia unità flash viene rilevata; un file viene creato in / dev
  • plug_flash_drive.sh viene chiamato da udev
  • la parte mkdir dello script funziona
  • tuttavia, sembra che la parte "mount" dello script non sia eseguita, quindi il mio disco non è montato
  • quando chiamo i miei script dalla riga di comando, funzionano perfettamente

Qualcuno sa perché mount non viene eseguito quando chiamato da udev?

EDIT 28/08/14: Ho aggiunto "grep -q / proc / mounts && echo success || echo failure" alla fine del mio script per controllare nel mio registro di debug se il dispositivo è effettivamente montato prima che lo script termini. Sembra che il dispositivo sia montato a quel punto anche quando lo script è chiamato da udev. Quindi il vero problema è ora "il mio dispositivo a blocchi è apparentemente smontato dopo la fine dello script mount quando chiamato tramite udev": s


Questo può essere questo il punto, ma il motivo per cui farlo mkdir "$mount_dir", ma rmdir "/media/$device_name"? Dove è $mount_dirimpostato?
G-Man dice "Ripristina Monica" il

scusate, questo è un refuso, ho usato alcune aliasing variabili abbastanza inutili nei codici originali e le ho rimosse qui per motivi di chiarezza
magva,

Hai provato il debug della vecchia scuola; ad esempio, inserendo set -xve exec >> "$HOME"/mount.log 2>&1nei .shfile?
G-Man dice "Ripristina Monica" il

1
L'ho fatto, ma secondo il registro che ottengo, mount viene eseguito quando lo script viene chiamato da udev. Non c'è alcuna differenza nel registro tra una chiamata da udev e dalla riga di comando ... in realtà è piuttosto sconcertante
magva

1
in tal caso, lo script fallirebbe anche quando eseguito dalla riga di comando
magva,

Risposte:


22

systemd-udevd viene eseguito nel proprio spazio dei nomi di file system e per impostazione predefinita i montaggi eseguiti all'interno di udev .rules non si propagano all'host. Per rendere i vostri vecchi script funzionano è possibile impostare MountFlags=sharedin /usr/lib/systemd/system/systemd-udevd.serviceo (meglio) la creazione e la modifica la sua copia a/etc/systemd/system/

Vedere man 5 systemd.execper ulteriori informazioni, MountFlagsopzione.


Cosa intendi con "non propagare all'host"?
sebelk,

2
@sebelk Credo che user83388 significhi che non si propagano allo spazio dei nomi "root"
Mark

2

Al momento della stesura di questo documento, le altre risposte sono errate (o non aggiornate).

Non si dovrebbe eseguire mountda un servizio Systemd. Anche dopo aver commentato le righe MountFlagse , la tua regola non funzionerà per i filesystem FUSE come NTFS o exFAT, perché il processo FUSE verrà utilmente ucciso da Systemd.PrivateMountssystemd-udevd.service

Vedi questa pagina ArchWiki che elenca diverse opzioni migliori. La mia preferenza è un piccolo progetto su GitHub chiamato udev-media-automount , che riavvia semplicemente un servizio Systemd dalla regola Udev. Questo è un modo conveniente per aggirare le varie ingombranti restrizioni su spazi dei nomi e processi secondari.

Vedi anche questo anwser , che mostra come utilizzare la SYSTEMD_WANTSvariabile Udev per avviare un'unità Systemd.


-1

È possibile provare a utilizzare :=anziché +=nelle assegnazioni RUN delle regole.

L' :=operatore imposta il valore dell'elenco e non consente ulteriori modifiche.


grazie, ma mount non funziona ancora :(
magva,

1
Forse non è il tuo caso, ma nel mio sistema mount si trova in / bin / mount. Prova "comando -v mount".
xae,

1
Nel mio sistema, il percorso restituito da "command -v mount" è / usr / bin / mount. Ho notato che avevo anche un eseguibile / bin / mount, ma non funziona neanche quando viene chiamato da udev
magva il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.