Udev - знакомство с системой управления устройствами

Базовый скрипт

Udev – это подсистема Linux, которая снабжает ваш компьютер событиями устройства. Говоря простым языком, это означает, что это код, который определяет, когда к вашему компьютеру подключены такие вещи, как сетевая карта, внешние жесткие диски (включая флэш-накопители USB), мыши, клавиатуры, джойстики и геймпады, приводы DVD-ROM и т. д. Это делает его потенциально полезной утилитой, которая проста настолько, чтобы обычный пользователь мог вручную написать сценарий для выполнения таких задач, как инициализация определенных задач при подключении определенного жесткого диска.

В этой статье вы узнаете, как создать скрипт udev, запускаемый каким-либо событием udev, например, подключением определенного флэш-накопителя. Как только вы поймете процесс работы с udev, вы сможете использовать его для выполнения самых разных задач, например, для загрузки определенного драйвера, когда подключен геймпад, или для выполнения автоматического резервного копирования при подключении вашего резервного диска.

Лучший способ взаимодействия с Udev – это маленькие скрипты. Не пишите весь скрипт заранее, а вместо этого начните с чего-то, что просто подтверждает, что udev запускает какое-то пользовательское событие.

В зависимости от цели вашего сценария, вы не можете гарантировать, что когда-нибудь увидите результаты сценария своими глазами, поэтому убедитесь, что ваш сценарий регистрирует, что он был успешно запущен. Обычное место для файлов журнала находится в каталоге /var, но это в основном домен пользователя root. Для тестирования используйте /tmp, который доступен обычным пользователям и обычно очищается перезагрузкой.

Откройте ваш любимый текстовый редактор и введите этот простой скрипт:

Поместите его в /usr/local/bin или в другое место на пути к исполняемому файлу по умолчанию. Назовите его trigger.sh и, конечно, сделайте его исполняемым с помощью chmod + x.

Этот скрипт не имеет ничего общего с udev. При его выполнении сценарий помещает отметку времени в файл /tmp/udev.log. Протестируйте скрипт самостоятельно:

Следующий шаг – заставить udev запускать скрипт.

Уникальная идентификация устройства

Чтобы ваш скрипт запускался событием устройства, udev должен знать, при каких условиях он должен вызывать скрипт. В реальной жизни вы можете определить флэш-накопитель по его цвету, производителю и тому факту, что вы только что подключили его к компьютеру. Ваш компьютер, однако, нуждается в другом наборе критериев.

Udev идентифицирует устройства по серийным номерам, производителям и даже идентификаторам поставщиков и номерам продуктов. Другими словами, вы хотите сначала перехватить почти любое допустимое событие udev для запуска вашего скрипта.

Задействуя команду udevadm monitor вы можете подключиться к udev в режиме реального времени и увидеть, что он видит, когда вы подключаете разные устройства. Для этого вам понадобятся права root-пользователя.

Функция монитора регестрирует полученные события для:

  • UDEV – событие, которое udev отправляет после обработки правила;
  • KERNEL – ядро событий.

Когда запущен монитор udevadm, подключите флэш-накопитель и наблюдайте, как вся информация выводится на ваш экран. Обратите внимание, что типом события является событие ADD. Это хороший способ определить, какой тип события вы хотите.

Команда udevadm monitor предоставляет много полезной информации, но вы можете увидеть ее с более хорошим форматированием с помощью команды udevadm info. Предполагается, что вы знаете, где в данный момент находится ваш флэш-накопитель в дереве /dev. Если нет, отсоедините и снова подключите флэш-накопитель, а затем немедленно выполните эту команду:

Например, если эта команда вернула sdb: sdb1, вы знаете, что ядро назначило вашему жесткому диску метку sdb.

Кроме того, вы можете использовать команду lsblk для просмотра всех дисков, подключенных к вашей системе, включая их размеры и разделы.

Теперь, когда вы определили, где находится ваш диск в вашей файловой системе, вы можете просмотреть информацию об этом устройстве с помощью этой команды:

Она предоставит вам много информации. Сосредоточьтесь на первом блоке информации на данный момент.

Ваша задача – выбрать части отчета udev об устройстве, которые являются наиболее уникальными для этого устройства, а затем дать команду udev запустить ваш скрипт при обнаружении этих уникальных атрибутов.

Информационный процесс udevadm сообщает об устройстве (указанном путем к устройству), а затем «идет» вверх по цепочке родительских устройств. Для каждого найденного устройства он печатает все возможные атрибуты в формате ключ-значение. Вы можете составить правило для сопоставления в соответствии с атрибутами устройства и атрибутами одного родительского устройства.

Правило udev должно содержать один атрибут от одного родительского устройства.

Родительские атрибуты – это вещи, которые описывают устройство с самого базового уровня, например, что-то, что было подключено к физическому порту, или это что-то с размером, или это съемное устройство.

Поскольку метка KERNEL в sdb может меняться в зависимости от того, сколько других дисков было подключено до того, как вы подключили этот флэш-накопитель, это не оптимальный родительский атрибут для правила udev. Тем не менее, оно сработает для подтверждения концепции, так что вы можете использовать его. Еще лучшим кандидатом является атрибут SUBSYSTEM, который идентифицирует, что это блочное системное устройство (именно поэтому команда lsblk выводит список устройств).

Откройте файл с именем 80-local.rules в /etc/udev/rules.d и введите этот код:

Сохраните файл, отключите тестовый флэш-накопитель и перезагрузите компьютер. Подождите, перезагрузите компьютер на Linux?

Теоретически вы можете просто выполнить команду udevadm control --reload, которая должна загрузить все правила, но на этом этапе игры лучше всего исключить все переменные. Udev достаточно сложен, и вы не хотите лежать в постели всю ночь, задаваясь вопросом, не сработало ли это правило из-за синтаксической ошибки или просто нужно было перезагрузиться. Поэтому перезагружайтесь независимо от того, что говорит вам ваша гордость POSIX.

Когда ваша система вернется в режим онлайн, переключитесь на текстовую консоль (с помощью Ctl + Alt + F3 или аналогичной) и подключите ваш флэш-накопитель. Если вы используете последнее ядро, вы, вероятно, увидите кучу выходных данных на вашей консоли, когда вы подключите диск. Если вы видите сообщение об ошибке, например "Не удалось выполнить /usr/local/bin/trigger.sh", вы, вероятно, забыли сделать исполняемый скрипт. В противном случае, надеюсь, все, что вы видите, это подключенное устройство, которое получило какое-то назначение устройства ядра и так далее.

Теперь момент истины:

Если вы видите очень недавнюю дату и время, возвращенные из /tmp/udev.log, udev успешно запустил ваш скрипт.

Безопасность

В свете всего вышенаписанного, поднимаются проблемы безопасности при написании правил udev для автоматического выполнения каких-либо действий при подключении диска. На моих машинах даже не включено автоматическое монтирование, но в этой статье предлагаются сценарии и правила, которые выполняют команды при подключении какого-либо устройства.

Здесь нужно иметь в виду две вещи:

  1. Как только ваши правила udev станут работать, сделайте так, чтобы они запускали сценарии только тогда, когда вы действительно этого хотите. Выполнение скрипта, который слепо копирует данные на ваш компьютер или с него. Это очень плохая идея, если кто-то, у кого есть флэш-накопитель той же марки, подключит его к вашему компьютеру.
  2. Не пишите свои правила и сценарии udev, и забудьте о них. Я знаю, на каких компьютерах есть мои правила udev, и это чаще всего мои персональные компьютеры, а не те, которые я беру с собой на конференции или держу в своем офисе на работе. Чем более "социальный" компьютер, тем менее вероятно, что он получит на нем правило udev, которое потенциально может привести к тому, что мои данные окажутся на чужом устройстве (или же чужие данные, или вредоносная программа на моем устройстве).

Другими словами, как и в случае с большей частью свободы, предоставляемой системой GNU, ваша работа – помнить о том, как вы эту свободу используете. Если вы пренебрегаете ею или не относитесь к ней с уважением, все может обернуться настоящей катастрофой.

Наверх
Меню