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
set -xv
i exec >> "$HOME"/mount.log 2>&1
w .sh
plikach?
mkdir "$mount_dir"
, alermdir "/media/$device_name"
? Gdzie jest$mount_dir
ustawiony?