Правило Udev відповідати будь-якому пристрою зберігання USB


10

Як я можу реалізувати udevправила для будь-якого підключеного USB-накопичувача, а не лише для конкретного? Що потрібно змінити в idVendorі idProduct?

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

Відповіді:


7

Запам'ятовуючий пристрій знаходиться в blockпідсистемі, тому вам потрібно SUBSYSTEM=="block", як правило, таке правило:

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

Якщо ви користуєтесь systemd, ви можете запускати systemdпристрій щоразу, коли додається USB-накопичувач. Створіть файл одиниці, наприклад /etc/systemd/system/my-usb-rule.service:

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

і правило, наприклад /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"

Тепер udevспрацьовує my-usb-rule.service(що в свою чергу буде виконувати скрипт) на будь-якому пристрої зберігання USB надбудовою події.


Не забудьте перезавантажити конфігурацію після редагування правил / одиниць:

udevadm control --reload
systemctl daemon-reload

Коли я додаю USB-накопичувач, я хотів би діяти на розділах, які він містить. На рівні udev я можу бачити події з 4-х підсистем: usb, scsi, bdi та block (у цьому порядку). Перші 3 з них є непридатними, оскільки розділ ще не відомий. Подія блоку має ID_BUS = scsi, а не usb, як у вашому прикладі коду. Я не бачу жодного відповідного атрибута в події блоку, який би сказав мені, чи це USB-накопичувач чи ні. (Дослідження проводили за допомогою монітора udevadm та інформації про udevadm). Якщо я не можу довіряти, що ID_BUS = scsi не може бути розумним іншим, крім маси USB.
Уве Ґюдер

@UweGeuder - ніщо не заважає вам використовувати ім'я пристрою як аргумент до вашої програми і на основі цього акта на розділах ...
don_crissti

Ну а в подіях USB назва пристрою на зразок / dev / bus / usb / 002/040. Не впевнений, що з цим робити у своїй програмі. У блокових подіях назва пристрою на зразок / dev / sdb або / dev / sdb1. Це я хочу, але зараз я повернувся до проблеми, що ID_BUS = scsi. Я трохи пізніше: Є файл правил 80-udisk2, який додає властивість ID_DRIVE_THUMB. Не впевнені, наскільки він надійний, мабуть, мало продавців у списку. Мій файл правил називався 70- *, тому, як очікувалося, мій / dev / sdb не збігався. Досить дивно / dev / sdb1 збігався, хоча моє правило працює першим.
Уве Ґюдер

1
Ах, я лише зазначу, що оригінальним питанням було будь-який накопичувач USB-накопичувача. Це має працювати з правилом SUBSYSTEM=="block", SUBSYSTEMS=="usb"(зверніть увагу на різницю з S ). Я сумніваюся, що це завжди може працювати з ENV{ID_BUS}=="usb"оригінальною відповіддю, тому що я бачу тут значення scsi. Але я працюю над дещо іншою проблемою, ніж просили спочатку, я хочу будь-який USB-накопичувач (pendrive), але ніяких зовнішніх накопичувачів.
Уве Ґюдер

1
Насправді кепська правда полягає в тому, що ENV{ID_BUS}значення не однакове для всіх систем. Вчора я працював над старішою системою з udev 210 (я вважаю. Не можу зараз перевірити, оскільки машини немає в Інтернеті), там значення було scsi . Тепер я перебуваю на більш новій машині з udev 228 і значенням є usb . Для тієї самої USB-палички я ношу її з собою. (не впевнений, що версія udev тут є відповідним фактором, може також бути ядро ​​чи будь-який інший пакет, що встановлює правила udev, e, g, udisks2) Все-таки SUBSYSTEM=="block", SUBSYSTEMS=="usb"(примітка S ) може бути портативним та безпечним.
Уве Ґюдер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.