Aturan Udev untuk mencocokkan perangkat penyimpanan usb

10

Bagaimana saya bisa menerapkan udevaturan untuk semua perangkat penyimpanan massal USB yang terpasang, tidak hanya untuk yang spesifik? Apa yang harus diubah idVendor, dan idProduct?

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

Jawaban:

7

Perangkat penyimpanan ada di dalam blocksubsistem, jadi Anda harus menginginkannya SUBSYSTEM=="block", seperti ini:

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

Jika Anda menggunakan systemd, Anda bisa menjalankan systemdunit setiap kali perangkat penyimpanan USB ditambahkan. Buat file unit, misalnya /etc/systemd/system/my-usb-rule.service:

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

dan aturannya, misalnya /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"

Sekarang udevakan memicu my-usb-rule.service(yang pada gilirannya akan menjalankan skrip Anda) pada setiap perangkat penyimpanan usb menambahkan acara.


Jangan lupa memuat ulang konfigurasi setelah Anda mengedit aturan / unit:

udevadm control --reload
systemctl daemon-reload
don_crissti
sumber
Ketika saya menambahkan penyimpanan massal USB, saya ingin bertindak pada partisi yang dikandungnya. Pada level udev saya dapat melihat acara dari 4 subsistem: usb, scsi, bdi, dan blok (dalam urutan ini). 3 yang pertama tidak dapat digunakan, karena partisi belum diketahui. Acara blokir memiliki ID_BUS = scsi, bukan usb seperti pada contoh kode Anda. Saya tidak melihat atribut yang cocok di blok acara, yang akan memberi tahu saya apakah itu penyimpanan massal USB atau tidak. (Investigasi dilakukan menggunakan monitor udevadm dan info udevadm). Kecuali saya bisa percaya bahwa ID_BUS = scsi tidak bisa masuk akal selain penyimpanan massal USB.
Uwe Geuder
@UweGeuder - tidak ada yang menghentikan Anda untuk menggunakan nama perangkat sebagai argumen untuk program Anda dan berdasarkan tindakan pada partisi ...
don_crissti
Nah, dalam acara USB nama perangkat itu seperti / dev / bus / usb / 002/040. Tidak yakin apa yang harus dilakukan dengan itu di program saya. Dalam acara Block the name device adalah sesuatu seperti / dev / sdb atau / dev / sdb1. Itulah yang saya inginkan, tetapi sekarang saya kembali ke masalah bahwa ID_BUS = scsi. Saya mendapat sedikit lebih jauh: Ada file aturan 80-udisk2, yang menambahkan properti ID_DRIVE_THUMB. Tidak yakin seberapa kuat itu, tampaknya ada beberapa vendor yang terdaftar. File aturan saya dipanggil 70- *, jadi seperti yang diharapkan / dev / sdb saya tidak cocok. Cukup aneh / dev / sdb1 cocok, meskipun aturan saya berjalan dulu.
Uwe Geuder
1
Ah saya hanya mencatat pertanyaan aslinya adalah drive penyimpanan massal USB apa pun . Itu harus bekerja dengan aturan SUBSYSTEM=="block", SUBSYSTEMS=="usb"(perhatikan perbedaan dengan S ). Saya ragu itu selalu dapat bekerja dengan ENV{ID_BUS}=="usb"jawaban yang asli, karena saya melihat nilai scsi di sini. Tapi saya sedang mengerjakan masalah yang sedikit berbeda dari yang semula diminta, saya ingin USB stick (flashdisk), tetapi tidak ada drive eksternal.
Uwe Geuder
1
Sebenarnya kebenaran yang buruk adalah bahwa ENV{ID_BUS}nilai tidak sama pada semua sistem. Kemarin saya bekerja pada sistem yang lebih tua dengan udev 210 (saya percaya. Tidak dapat memeriksa sekarang karena mesin tidak ada di internet), Ada nilainya scsi . Sekarang, saya menggunakan mesin yang lebih baru dengan udev 228 dan nilainya adalah usb . Untuk stik USB yang sama, saya membawanya. (tidak yakin apakah versi udev adalah faktor yang relevan di sini, bisa juga merupakan kernel atau paket lain yang memasang aturan udev, e, g, udisks2) Tetap SUBSYSTEM=="block", SUBSYSTEMS=="usb"(catatan S ) mungkin portabel dan aman.
Uwe Geuder