На самом деле это довольно просто: вам нужно написать собственное правило udev, которое вы можете поместить в
/etc/udev/rules.d/10-local.rules
Преимущество этого состоит в том, что ваше пользовательское правило будет прочитано раньше других правил.
Этот файл будет содержать одну строку этой формы
<conditions to be met> KERNEL=="sd?1", NAME="my_usb_adapter", RUN+="/home/my_name/bin/my_program"
Смысл этого таков:
- «условия, которые должны быть выполнены» - это ряд условий, специфичных для вашего диска, которые однозначно идентифицируют его, поэтому никакие действия не выполняются, когда вставлен другой жесткий диск;
- KERNEL == "сд?1 "говорит udev начинать проверку этого правила только при обнаружении новых разделов /dev /sda1, /dev /sdb1, .... Если вам нужно, вы можете сделать то же самое не с разделом, а с устройством, в этом случае KERNEL == "sd?"является соответствующим утверждением.
- NAME = "my_usb_adapter" создаст постоянный узел в /dev /my_usb_adapter, чтобы вы знали, где найти dev для монтирования, если вам нужно его смонтировать.
- Правило RUN самоочевидно. Не забудьте сделать исполняемый файл
my_program
без ввода или вывода с терминала.
Вы можете получить информацию, необходимую для выполнения сопоставления, с помощью команды:
udevadm info -a -p $(udevadm info -q path -n /dev/sdb)
если ваш диск - /dev /sdb, измените его по своему усмотрению. Это обеспечит большое количество информации. Я бы искал
ATTRS{idVendor}=="18a5"
ATTRS{idProduct}=="0302"
ATTRS{serial}=="TT0E4E008XW3DT9H"
(эти значения для одного из моих USB-ключей, ваши значения будут другими). Одно важное предостережение: соответствующие правила должны быть взяты с одного и того же родительского устройства, их нельзя смешивать.
Теперь мы можем написать окончательное правило как:
ATTRS{idVendor}=="18a5", ATTRS{idProduct}=="0302", ATTRS{serial}=="TT0E4E008XW3DT9H", KERNEL=="sd?1", NAME="my_usb_adapter", RUN+="/home/my_name/bin/my_program"
Помните, что файлы udev не могут разбивать строки: если вы это сделаете, udev увидит ломаную как два отдельных правила. Там не будет никакого вывода на ваш терминал. Кроме того, я был весьма осторожен в различении =
, ==
и +=
: убедитесь, что вы не допустили ошибок в этом.