Regola Udev per abbinare qualsiasi dispositivo di archiviazione USB


10

Come posso implementare le udevregole per qualsiasi dispositivo di archiviazione di massa USB collegato, non solo per uno specifico? Cosa dovrebbe essere cambiato idVendore idProduct?

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

Risposte:


7

Nel blocksottosistema è presente un dispositivo di archiviazione , quindi ti consigliamo di utilizzare SUBSYSTEM=="block"la regola, in questo modo:

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

Se lo stai utilizzando systemd, puoi eseguire systemdun'unità ogni volta che viene aggiunto un dispositivo di archiviazione USB. Creare il file di unità, ad esempio /etc/systemd/system/my-usb-rule.service:

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

e la regola, ad esempio /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"

Ora udevsi innescherà my-usb-rule.service(che a sua volta eseguirà il tuo script) su qualsiasi evento di aggiunta del dispositivo di archiviazione USB .


Non dimenticare di ricaricare la configurazione dopo aver modificato le regole / unità:

udevadm control --reload
systemctl daemon-reload

Quando aggiungo una memoria di massa USB, vorrei agire sulle partizioni che contiene. A livello di udev posso vedere eventi da 4 sottosistemi: usb, scsi, bdi e block (in questo ordine). I primi 3 sono inutilizzabili, perché la partizione non è ancora nota. L'evento di blocco ha ID_BUS = scsi, non usb come nell'esempio di codice. Non vedo alcun attributo adatto nell'evento di blocco, che mi direbbe se si tratta di archiviazione di massa USB o meno. (Indagine condotta utilizzando il monitor udevadm e le informazioni udevadm). A meno che non mi fidi che ID_BUS = scsi non possa ragionevolmente essere nient'altro che archiviazione di massa USB.
Uwe Geuder,

@UweGeuder - niente che ti impedisce di usare il nome del dispositivo come argomento per il tuo programma e basato su quell'atto sulle partizioni ...
don_crissti

Bene, negli eventi USB il nome del dispositivo è qualcosa come / dev / bus / usb / 002/040. Non sono sicuro di cosa farne nel mio programma. Negli eventi Block il nome del dispositivo è qualcosa come / dev / sdb o / dev / sdb1. Questo è quello che voglio, ma ora sono tornato al problema che ID_BUS = scsi. Sono andato un po 'oltre: esiste un file delle regole 80-udisk2, che aggiunge una proprietà ID_DRIVE_THUMB. Non sono sicuro di quanto sia robusto, sembrano pochi i fornitori elencati. Il mio file delle regole si chiamava 70- *, quindi come previsto il mio / dev / sdb non corrispondeva. Stranamente / dev / sdb1 corrisponde, sebbene la mia regola venga eseguita per prima.
Uwe Geuder,

1
Ah, ho appena notato che la domanda originale era qualsiasi unità di archiviazione di massa USB. Questo dovrebbe funzionare con la regola SUBSYSTEM=="block", SUBSYSTEMS=="usb"(notare la differenza con la S ). Dubito che possa sempre funzionare con ENV{ID_BUS}=="usb"la risposta originale, perché vedo il valore scsi qui. Ma sto lavorando a un problema leggermente diverso da quello originariamente chiesto, voglio qualsiasi chiavetta USB (pendrive), ma nessuna unità esterna.
Uwe Geuder,

1
In realtà la cattiva verità è che il ENV{ID_BUS}valore non è lo stesso su tutti i sistemi. Ieri stavo lavorando su un vecchio sistema con udev 210 (credo. Non riesco a controllare ora perché la macchina non è su Internet), lì il valore era scsi . Ora sono su una macchina più recente con udev 228 e il valore è usb . Per la stessa chiavetta USB, la porto con me. (non sono sicuro se la versione di udev sia il fattore rilevante qui, potrebbe anche essere il kernel o qualsiasi altro pacchetto che installa le regole di udev, e, g, udisks2) Comunque SUBSYSTEM=="block", SUBSYSTEMS=="usb"(nota S ) potrebbe essere portatile e sicuro.
Uwe Geuder,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.