Правило 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 monitor и udevadm info). Если я не могу поверить, что ID_BUS = scsi не может быть чем-то еще, кроме запоминающего устройства USB.
Уве Геудер

@UweGeuder - ничто не мешает вам использовать имя устройства в качестве аргумента для вашей программы и основано на этом действии на разделах ...
don_crissti

Ну, в событиях USB имя устройства выглядит как / dev / bus / usb / 002/040. Не уверен, что делать с этим в моей программе. В событиях Block имя устройства выглядит как / dev / sdb или / dev / sdb1. Это то, что я хочу, но теперь я вернулся к проблеме, что ID_BUS = scsi. Я получил немного дальше: есть файл правил 80-udisk2, который добавляет свойство ID_DRIVE_THUMB. Не уверен, насколько он надежен, кажется, что в списке очень мало поставщиков. Мой файл правил назывался 70- *, поэтому, как и ожидалось, мой / dev / sdb не совпадал. Достаточно странно, что / dev / sdb1 совпал, хотя мое правило выполняется первым.
Уве Geuder

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

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