Как запустить программу при подключении определенного жесткого диска (в Debian)?

Как запустить программу при подключении определенного жесткого диска (в Debian)?

Я хочу автоматически запускать определенную команду всякий раз, когда диск (определенный диск или любой диск) подключается в горячем режиме. Я работаю в системе 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"

Значение этого таково:

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

Связанный контент