Udev kuralı herhangi bir usb depolama cihazıyla eşleşecek


10

udevTakılı herhangi bir USB yığın depolama aygıtı için kuralları, yalnızca belirli bir aygıt için değil, nasıl uygulayabilirim ? Neler değiştirilmeli idVendorve idProduct?

 ACTION=="add", SUBSYSTEM=="usb", SYSFS{idVendor}=="0204", SYSFS{idProduct}=="6025",
     RUN+="/home/workspace/bash_script.sh"

Yanıtlar:


7

blockAlt sistemde bir depolama cihazı olduğundan SUBSYSTEM=="block", kuralınızda şu şekilde istersiniz:

ACTION=="add", KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", \
    RUN+="/path/to/script"

Kullanıyorsanız systemd, systemdbir USB depolama aygıtı her eklendiğinde bir üniteyi çalıştırabilirsiniz . Birim dosyasını oluşturun, örneğin /etc/systemd/system/my-usb-rule.service:

[Service]
Type=oneshot
ExecStart=/path/to/script

ve kural, örneğin /etc/udev/rules.d/85-my-usb-rule.rules:

ACTION=="add", KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", \
    ENV{SYSTEMD_WANTS}="my-usb-rule.service"

Şimdi herhangi bir usb depolama cihazı add olayında (sırayla betiğinizi çalıştıracak) udevtetikleyecektir .my-usb-rule.service


Kuralları / birimleri düzenledikten sonra yapılandırmayı yeniden yüklemeyi unutmayın:

udevadm control --reload
systemctl daemon-reload

Bir USB yığın depolama birimi eklediğimde, içerdiği bölümlere göre hareket etmek istiyorum. Udev düzeyinde 4 alt sistemden olayları görebiliyorum: usb, scsi, bdi ve block (bu sırayla). İlk 3 tanesi kullanılamaz, çünkü bölüm henüz bilinmiyor. Block olayının kod örneğinizde olduğu gibi usb değil ID_BUS = scsi vardır. Block olayında USB yığın depolama olup olmadığını söyleyen uygun bir özellik görmüyorum. (İnceleme udevadm monitör ve udevadm bilgileri kullanılarak yapılır). Ben ID_BUS = scsi güvenebileceğiniz sürece USB yığın depolama dışında başka bir şey olamazdı.
Uwe Geuder

@UweGeuder - cihaz adını programınıza bir argüman olarak kullanmanızı ve bölümlerdeki bu eylemi temel alarak sizi durduracak hiçbir şey yok ...
don_crissti

USB olaylarında aygıt adı / dev / bus / usb / 002/040 gibi bir şeydir. Programımda bununla ne yapacağımdan emin değilim. Block olaylarında aygıt adı / dev / sdb veya / dev / sdb1 gibi bir şeydir. İstediğim bu, ama şimdi ID_BUS = scsi sorununa geri döndüm. Biraz daha ilerledim: ID_DRIVE_THUMB özelliği ekleyen bir kural dosyası 80-udisk2 var. Ne kadar sağlam olduğundan emin değilim, listelenen çok az satıcı var gibi görünüyor. Kural dosyam 70- * olarak adlandırıldı, bu nedenle beklediğim gibi / dev / sdb eşleşmedi. Kuralım ilk önce çalışmasına rağmen garip / dev / sdb1 eşleşti.
Uwe Geuder

1
Ah, orijinal sorunun herhangi bir USB yığın depolama sürücüsü olduğunu unutmayın. Bu kuralla çalışmalıdır SUBSYSTEM=="block", SUBSYSTEMS=="usb"( S ile farkı not edin ). Her zaman ENV{ID_BUS}=="usb"orijinal cevapta çalışabileceğinden şüpheliyim , çünkü burada scsi değerini görüyorum. Ama başlangıçta sorulmasından biraz farklı bir sorun üzerinde çalışıyorum, herhangi bir USB stick (pendrive) istiyorum, ancak harici sürücüler yok.
Uwe Geuder

1
Aslında kötü gerçek, ENV{ID_BUS}değerin tüm sistemlerde aynı olmamasıdır. Dün udev 210 ile daha eski bir sistem üzerinde çalışıyordum (inanıyorum. Makine internette olmadığı için şimdi kontrol edemiyorum), değer scsi oldu . Şimdi udev 228 ile daha yeni bir makinedeyim ve değer usb . Aynı USB bellek için yanımda taşıyorum. (udev sürümünün buradaki ilgili faktör olup olmadığından emin değilsiniz, çekirdek veya udev kurallarını yükleyen başka bir paket de olabilir, e, g, udisks2) Yine de SUBSYSTEM=="block", SUBSYSTEMS=="usb"(not S ) taşınabilir ve güvenli olabilir.
Uwe Geuder
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.