Я хочу автоматически запускать определенную команду всякий раз, когда диск (определенный диск или любой диск) подключается в горячем режиме. Я работаю в системе Debian без головы.
Если говорить точнее, я хочу автоматически монтировать диск. Я мог бы сделать это с помощью AutoFS, но это диск Truecrypt, и AutoFS не будет работать с ним, насколько мне известно. Поэтому мне нужно выполнять какой-то скрипт при каждом подключении диска, который обнаружит диск и выполнит необходимые команды.
Как я могу сделать что-то автоматически в ответ на подключение диска? И снова, как я могу сделать что-то еще в ответ на извлечение диска?
решение1
На самом деле это довольно просто: вам нужно написать собственное правило 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=="sd?1" сообщает udev о необходимости начать проверку этого правила только при обнаружении новых разделов /dev/sda1, /dev/sdb1,.... При необходимости вы можете сделать то же самое не с разделом, а с устройством, в этом случае KERNEL=="sd?" является подходящим оператором.
- NAME="my_usb_adapter" создаст постоянный узел в /dev/my_usb_adapter, чтобы вы знали, где найти устройство для монтирования, если вам это нужно.
- Правило 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 воспримет разорванную строку как два отдельных правила. На ваш терминал не будет вывода. Кроме того, я был очень осторожен в различении =, ==, и +=: убедитесь, что вы не вносите никаких ошибок.


