Saya mencoba membuat beberapa aturan udev untuk memasang dan melepas USB flash drive saya; aturan untuk saat ini sangat sederhana:
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 juga sangat sederhana:
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"
Saya telah melakukan beberapa tes sehingga saya dapat memastikan bahwa:
- Ketika dicolokkan, flash drive saya terdeteksi; file dibuat di / dev
- plug_flash_drive.sh disebut oleh udev
- bagian mkdir dari skrip berfungsi
- Namun, tampaknya bagian "mount" dari skrip tidak dieksekusi, jadi drive saya tidak terpasang
- ketika saya memanggil skrip saya di baris perintah, mereka bekerja dengan sempurna
Adakah yang tahu mengapa mount tidak dieksekusi ketika dipanggil oleh udev?
EDIT 28/08/14: Saya menambahkan "grep -q / proc / mounts && echo success || echo failure" di akhir skrip saya untuk memeriksa log debug saya jika perangkat benar-benar dipasang sebelum skrip berakhir. Tampaknya perangkat yang dipasang di titik tersebut bahkan ketika script disebut oleh udev. Jadi masalah sebenarnya adalah sekarang "perangkat blok saya tampaknya tidak terpasang setelah script mount berakhir ketika dipanggil melalui udev": s
mkdir "$mount_dir"
tapirmdir "/media/$device_name"
? Di mana$mount_dir
diatur?set -xv
danexec >> "$HOME"/mount.log 2>&1
ke dalam.sh
file?Jawaban:
systemd-udevd berjalan di namespace sistem file sendiri dan secara default mount dilakukan di dalam udev. aturan tidak menyebar ke host. Untuk membuat script lama Anda bekerja, Anda dapat mengatur
MountFlags=shared
di/usr/lib/systemd/system/systemd-udevd.service
atau (lebih baik) membuat dan mengedit salinannya di/etc/systemd/system/
Lihat
man 5 systemd.exec
untuk informasi lebih lanjut,MountFlags
opsi.sumber
Pada tulisan ini, jawaban lain salah (atau kedaluwarsa).
Anda tidak boleh lari
mount
dari layanan Systemd. Bahkan setelah mengomentariMountFlags
danPrivateMounts
baris dalamsystemd-udevd.service
, aturan Anda tidak akan bekerja untuk filesystem FUSE seperti NTFS atau ExFAT, karena proses FUSE akan mendapatkan membantu dibunuh oleh systemd.Lihat halaman ArchWiki ini yang mencantumkan beberapa opsi yang lebih baik. Preferensi saya adalah proyek kecil di GitHub yang disebut udev-media-automount , yang dengan mudah me-restart layanan Systemd dari aturan Udev. Ini adalah cara yang mudah untuk mengatasi berbagai pembatasan rumit Udev pada ruang nama dan proses anak.
Lihat juga server ini , yang menunjukkan cara menggunakan
SYSTEMD_WANTS
variabel Udev untuk memulai unit Systemd.sumber
Anda bisa mencoba menggunakan
:=
alih-alih+=
dalam aturan penugasan RUN.The
:=
Operator menetapkan daftar nilai dan melarang perubahan lebih lanjut.sumber