mount tidak dieksekusi ketika dipanggil oleh udev

17

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

magva
sumber
Ini mungkin di samping titik, tapi mengapa Anda mkdir "$mount_dir"tapi rmdir "/media/$device_name"? Di mana $mount_dirdiatur?
G-Man Mengatakan 'Reinstate Monica'
maaf, ini salah ketik, saya menggunakan beberapa variabel yang tidak berguna alias dalam kode asli dan saya menghapusnya di sini demi kejelasan
magva
Sudahkah Anda mencoba debugging sekolah lama; misalnya, dengan meletakkan set -xvdan exec >> "$HOME"/mount.log 2>&1ke dalam .shfile?
G-Man Mengatakan 'Reinstate Monica'
1
Saya telah melakukan itu, tetapi menurut log yang saya dapatkan, mount dieksekusi ketika skrip dipanggil oleh udev. Tidak ada perbedaan dalam log antara panggilan dari udev dan dari baris perintah ... itu sebenarnya agak membingungkan
magva
1
dalam hal ini, skrip juga akan gagal ketika dijalankan dari command line
magva

Jawaban:

22

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=shareddi /usr/lib/systemd/system/systemd-udevd.serviceatau (lebih baik) membuat dan mengedit salinannya di/etc/systemd/system/

Lihat man 5 systemd.execuntuk informasi lebih lanjut, MountFlagsopsi.

pengguna83388
sumber
Apa yang Anda maksud dengan "jangan menyebar ke host"?
sebelk
2
@sebelk Saya percaya user83388 berarti mereka tidak menyebar ke namespace "root"
Mark
2

Pada tulisan ini, jawaban lain salah (atau kedaluwarsa).

Anda tidak boleh lari mountdari layanan Systemd. Bahkan setelah mengomentari MountFlagsdan PrivateMountsbaris dalam systemd-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_WANTSvariabel Udev untuk memulai unit Systemd.

Metamorf
sumber
-1

Anda bisa mencoba menggunakan :=alih-alih +=dalam aturan penugasan RUN.

The :=Operator menetapkan daftar nilai dan melarang perubahan lebih lanjut.

xae
sumber
terima kasih, tetapi mount masih tidak berfungsi :(
magva
1
Mungkin bukan kasus Anda, tetapi di sistem saya mount terletak di / bin / mount. Coba "command -v mount".
xae
1
Di sistem saya, jalur yang dikembalikan oleh "command -v mount" adalah / usr / bin / mount. Saya perhatikan bahwa saya juga memiliki executable / bin / mount, tetapi tidak berfungsi baik ketika dipanggil oleh udev
magva