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
mkdir "$mount_dir"
, alermdir "/media/$device_name"
? Gdzie jest$mount_dir
ustawiony?set -xv
iexec >> "$HOME"/mount.log 2>&1
w.sh
plikach?Odpowiedzi:
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=shared
w/usr/lib/systemd/system/systemd-udevd.service
lub (lepiej) tworzenie i edytowanie jego kopię na/etc/systemd/system/
Zobacz
man 5 systemd.exec
więcej informacji,MountFlags
opcja.źródło
W chwili pisania tego tekstu pozostałe odpowiedzi są niepoprawne (lub nieaktualne).
Nie należy uruchamiać
mount
z usługi Systemd. Nawet po komentowaniu liniiMountFlags
i , 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.PrivateMounts
systemd-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_WANTS
zmiennej Udev do uruchomienia jednostki Systemd.źródło
Możesz spróbować użyć
:=
zamiast+=
w regułach przypisań RUN.:=
Operator ustawia wartość listy i uniemożliwia dalsze zmiany.źródło