mount nie jest wykonywany po wywołaniu przez udev


17

Próbowałem stworzyć kilka reguł udev do montowania i odmontowywania dysków flash USB; zasady w tej chwili są bardzo proste:

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 jest również bardzo prosty:

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"

Zrobiłem kilka testów, aby upewnić się, że:

  • Po podłączeniu mój dysk flash zostaje wykryty; plik jest tworzony w / dev
  • plug_flash_drive.sh jest wywoływany przez udev
  • część skryptu mkdir działa
  • Wydaje się jednak, że część skryptu „mount” nie jest wykonywana, więc mój dysk nie został zamontowany
  • kiedy wywołuję moje skrypty w wierszu poleceń, działają doskonale

Czy ktoś wie, dlaczego mount nie jest wykonywany, gdy jest wywoływany przez udev?

EDYCJA 28/08/14: Dodałem „grep -q / proc / mounts && echo success || echo failure” na końcu mojego skryptu, aby sprawdzić w dzienniku debugowania, czy urządzenie jest faktycznie zamontowane przed zakończeniem skryptu. Wygląda na to, że urządzenie jest montowane w tym momencie, nawet gdy skrypt jest wywoływany przez udev. Prawdziwy problem polega więc na tym, że „moje urządzenie blokowe jest pozornie odmontowane po zakończeniu skryptu montowania po wywołaniu przez udev”: s


Może to być obok punktu, ale dlaczego mkdir "$mount_dir", ale rmdir "/media/$device_name"? Gdzie jest $mount_dirustawiony?
G-Man mówi „Przywróć Monikę”

przepraszam, to literówka, użyłem trochę niepotrzebnych zmiennych aliasing w oryginalnych kodach i usunąłem je tutaj ze względu na przejrzystość
magva

Czy próbowałeś debugowania w starej szkole; np. poprzez umieszczenie set -xvi exec >> "$HOME"/mount.log 2>&1w .shplikach?
G-Man mówi „Przywróć Monikę”

1
Zrobiłem to, ale zgodnie z logem, który otrzymuję, mount jest wykonywany, gdy skrypt jest wywoływany przez udev. W dzienniku nie ma różnicy między rozmową z udev a linią poleceń ... to raczej zaskakujące
magva

1
w takim przypadku skrypt również nie
zadziała,

Odpowiedzi:


22

systemd-udevd działa we własnej przestrzeni nazw systemu plików, a domyślnie podłączenia wykonywane w udev .rules nie są propagowane do hosta. Aby dokonać stare skrypty pracy można ustawić MountFlags=sharedw /usr/lib/systemd/system/systemd-udevd.servicelub (lepiej) tworzenie i edytowanie jego kopię na/etc/systemd/system/

Zobacz man 5 systemd.execwięcej informacji, MountFlagsopcja.


Co rozumiesz przez „nie propaguj do hosta”?
sebelk

2
@sebelk Uważam, że user83388 oznacza, że ​​nie propagują się do przestrzeni nazw „root”
Mark

2

W chwili pisania tego tekstu pozostałe odpowiedzi są niepoprawne (lub nieaktualne).

Nie należy uruchamiać mountz usługi Systemd. Nawet po komentowaniu linii MountFlagsi , twoja reguła nie będzie działać dla systemów plików FUSE, takich jak NTFS lub exFAT, ponieważ proces FUSE zostanie zabity przez Systemd.PrivateMountssystemd-udevd.service

Zobacz stronę ArchWiki, która zawiera kilka lepszych opcji. Moje preferencje to niewielki projekt na GitHub o nazwie udev-media-automount , który po prostu restartuje usługę Systemd z reguły Udev. Jest to wygodny sposób na obejście różnych uciążliwych ograniczeń Udev dotyczących przestrzeni nazw i procesów potomnych.

Zobacz także tę odpowiedź , która pokazuje, jak użyć SYSTEMD_WANTSzmiennej Udev do uruchomienia jednostki Systemd.


-1

Możesz spróbować użyć :=zamiast +=w regułach przypisań RUN.

:=Operator ustawia wartość listy i uniemożliwia dalsze zmiany.


dzięki, ale mount wciąż nie działa :(
magva

1
Może nie twoja sprawa, ale w moim systemie mount znajduje się w / bin / mount. Spróbuj „polecenie -v zamontować”.
xae

1
W moim systemie ścieżka zwrócona przez „polecenie -v mount” to / usr / bin / mount. Zauważyłem, że mam również plik wykonywalny / bin / mount, ale nie działa on również, gdy został wywołany przez udev
magva
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.