udev tarafından çağrıldığında mount yürütülmez


17

USB flash sürücülerimi bağlamak ve bağlantısını kesmek için bazı udev kuralları oluşturmaya çalıştım; an için kurallar çok basit:

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 da çok basit:

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"

Belirleyebilmem için bazı testler yaptım:

  • Takıldığında, flash sürücüm algılandı; / dev içinde bir dosya oluşturulur
  • plug_flash_drive.sh udev tarafından çağrılır
  • betiğin mkdir kısmı çalışır
  • ancak, betiğin "mount" kısmının yürütülmediği anlaşılıyor, bu yüzden sürücüm bağlı değil
  • komut satırımda komut dosyalarımı çağırdığımda, mükemmel çalışıyorlar

Udev tarafından çağrıldığında bağlantının neden yürütülmediğini bilen var mı?

EDIT 28/08/14: Aygıt gerçekten komut dosyası bitmeden önce bağlanmışsa hata ayıklama günlüğümde kontrol etmek için komut dosyama "grep -q / proc / mounts && echo success || echo hatası" ekledim. Cihaz anlaşılmaktadır olan komut udev tarafından çağrılan hatta bu noktada monte. Yani asıl sorun şimdi "blok cihazım udev üzerinden çağrıldığında mount komut dosyası bittikten sonra kaldırılıyor gibi görünüyor": s


Bu konunun yanında olabilir, ama neden mkdir "$mount_dir"ama rmdir "/media/$device_name"? Nerede $mount_dirayarlanır?
G-Man, 'Monica'yı Yeniden Başlat' diyor

üzgünüm, bu bir yazım hatası, orijinal kodlarda bazı takma değişkenler kullandım ve netlik uğruna burada kaldırdım
magva

Eski okul hata ayıklamasını denediniz mi; örneğin, dosyaları koyarak set -xvve exec >> "$HOME"/mount.log 2>&1içine .sh?
G-Man, 'Monica'yı Yeniden Başlat' diyor

1
Bunu yaptım, ancak aldığım günlüğe göre, komut dosyası udev tarafından çağrıldığında mount yürütülür.
Günlükte udev'den

1
bu durumda, komut satırı komut satırından çalıştırıldığında da başarısız olur
magva

Yanıtlar:


22

systemd-udevd kendi dosya sistemi ad alanında çalışır ve varsayılan olarak udev .rules içinde yapılan bağlar ana bilgisayara yayılmaz. Eski komut dosyaları ayarlayabilirsiniz çalışmasını sağlamak için MountFlags=sharedde /usr/lib/systemd/system/systemd-udevd.serviceya da (iyi) oluşturma ve onun kopyasını düzenleme/etc/systemd/system/

Daha man 5 systemd.execfazla bilgi için MountFlagsseçeneğe bakınız.


"Ev sahibine yayılma" ile ne demek istiyorsun?
sebelk

2
@sebelk Bence user83388 "kök" ad alanına yayılmadığı anlamına geliyor
Mark

2

Bu yazıdan itibaren, diğer cevaplar yanlıştır (ya da güncel değildir).

mountBir Systemd hizmetinden çalıştırmamalısınız . MountFlagsVe PrivateMountssatırları yorum yaptıktan sonra bile systemd-udevd.service, NTUSE veya exFAT gibi FUSE dosya sistemleri için kuralınız çalışmayacaktır, çünkü FUSE işlemi Systemd tarafından yararlı bir şekilde öldürülecektir.

Birkaç iyi seçeneği listeleyen bu ArchWiki sayfasına bakın . Benim tercihim GitHub'da udev-media-automount adında küçük bir proje . Bu, Udev'in ad alanları ve alt süreçler üzerindeki çeşitli hantal kısıtlamalarını aşmanın kolay bir yoludur.

Ayrıca bkz . Systemd birimini başlatmak için Udev değişkeninin nasıl kullanılacağını gösteren bu anwserSYSTEMD_WANTS .


-1

RUN atamaları kurallarında kullanmak :=yerine deneyebilirsiniz +=.

:=Operatör liste değeri belirler ve daha fazla değişiklik yapılmasına izin verilmez.


teşekkürler, ancak montaj hala çalışmıyor :(
magva

1
Belki senin durumun değil, ama benim sistem montaj / bin / mount yer almaktadır. "Command -v mount" komutunu deneyin.
xae

1
Sistemimde, "command -v mount" tarafından döndürülen yol / usr / bin / mount'dur. Ben de bir / bin / mount çalıştırılabilir vardı, ama udev tarafından çağrıldığında çalışmıyor
magva
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.