3

Я хочу автоматически запускать определенную команду всякий раз, когда диск (конкретный диск или любой другой диск) подключается в горячем режиме. Я использую безголовую систему Debian.

Чтобы быть более конкретным, я хочу автоматически смонтировать диск. Я мог бы сделать это с AutoFS, но это диск Truecrypt, и AutoFS не будет работать с этим AFAIK. Поэтому мне нужно выполнять какой-то сценарий всякий раз, когда подключен диск, который обнаружит диск и выполнит необходимые команды.

Как я могу сделать что-то автоматически в ответ на подключение диска? Опять же, как я могу сделать что-то еще в ответ на удаление диска?

1 ответ1

4

На самом деле это довольно просто: вам нужно написать собственное правило 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"

Смысл этого таков:

  1. «условия, которые должны быть выполнены» - это ряд условий, специфичных для вашего диска, которые однозначно идентифицируют его, поэтому никакие действия не выполняются, когда вставлен другой жесткий диск;
  2. KERNEL == "сд?1 "говорит udev начинать проверку этого правила только при обнаружении новых разделов /dev /sda1, /dev /sdb1, .... Если вам нужно, вы можете сделать то же самое не с разделом, а с устройством, в этом случае KERNEL == "sd?"является соответствующим утверждением.
  3. NAME = "my_usb_adapter" создаст постоянный узел в /dev /my_usb_adapter, чтобы вы знали, где найти dev для монтирования, если вам нужно его смонтировать.
  4. Правило 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 увидит ломаную как два отдельных правила. Там не будет никакого вывода на ваш терминал. Кроме того, я был весьма осторожен в различении = , == и +=: убедитесь, что вы не допустили ошибок в этом.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .