Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Некоторые замечательные правила и примеры использования udev

Оригинал: Some Nifty udev Rules and Examples
Авторы: Vimal Daga, Davender Singh
Дата публикации: 28 Июня 2012 г.
Перевод: А.Панин
Дата публикации перевода: 23 октября 2012 г.

Благодаря системе udev, которую разработали Greg Kroah-Hartman, Kay Sievers и Dan Stekloff, процесс подключения flash-накопителей, жестких дисков, камер и мобильных телефонов к системе под управлением ОС Linux стал простым и управляемым как никогда раньше. Впервые реализованная в ядре Linux версии 2.6, система udev обрабатывает как горячее подключение устройств к работающей системе, так и холодное подключение устройств (присоединенных до включения системы). В этой статье мы рассмотрим процесс динамического создания файлов устройств в каталоге /dev и приведем несколько примеров настроек, пригодных для использования или просто для развлечения.

Под udev понимается реализация файловой системы устройств devfs в пространстве пользователя. Система включает в себя службу udevd, файлы настроек и файлы правил, используемые для динамического управления файлами устройств Linux, находящимися в директории /dev, в ответ на события, генерируемые ядром (uevents). Udev с успехом полностью заменила старую реализацию devfs начиная с ядра Linux версии 2.6.

Для чего же понадобилась полностью переработанная реализация системы управления файлами устройств? И почему внедрение udev было столь успешным? Для получения ответа необходимо рассмотреть историю развития интерфейсов драйверов устройств ОС Linux.

С каждым файлом устройства связано два 8-битных значения: младший идентификатор (minor number) и старший идентификатор (major number). Каждый драйвер устройства имеет старший идентификатор; и все файлы устройств, работающих под управлением этого драйвера имеют одинаковый старший идентификатор. Младшие идентификаторы устройств различны у разных устройств, работающих под управлением этого драйвера.

В ранних версиях Linux файловая система /dev содержала по одному статическому файлу для каждого устройства, которое могло бы быть подключено к системе (и управлялось бы драйвером устройства). К сожалению, этот подход имел ряд проблем: было недостаточно значений идентификаторов для присвоения всем возможным устройствам, в особенности в условиях растущего количества поддерживаемых устройств. Также, наличие более 18000 файлов устройств требовало большого количества дополнительного дискового пространства. Эти проблемы были решены путем предоставления возможности udev игнорировать значения младшего и старшего идентификатора файлов устройств.

При горячем подключении устройств, таких как оборудование с интерфейсом USB, не было постоянства при присвоении названия и идентификатора файлу устройства. К примеру, на системе с двумя USB-принтерами, один из принтеров может быть представлен файлом /dev/usb/lp0, а другой файлом /dev/usb/lp1 - но при этом нет точного понимания, какой из принтеров представлен тем или иным файлом. Это поведение могло меняться в зависимости от того, какое из устройств было включено при загрузке компьютера или подключено раньше - или может меняться в зависимости от того, подключено ли устройство к USB-разветвителю или напрямую к USB-порту системы. Такое поведение всегда разочаровывало и сбивало с толку пользователей. Система udev позволяет задать постоянное имя устройства при помощи правил.

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

Как работает udev

Служба udevd слушает netlink-сокет в ожидании событий, генерируемых ядром при подключении или отключении устройства. Вы можете наблюдать за этими событиями при помощи команды udevmonitor - запустите ее, подключите USB-устройство, например, flash-накопитель, и отключите его (в новейших дистрибутивах может не быть программы udevmonitor - в этом случае используйте udevadm.)

Во время запуска udev монтирует файловую систему tmpfs в в директорию /dev. После этого файлы устройств копируются из директории /lib/udev/device в директорию /dev и udev начинает принимать события ядра для устройств с холодным подключением. Директория /etc/udev/rules.d используется для изменения параметров устройств, создания символических ссылок на файлы устройств и выполнения других действий. Для устройств, использующих горячее подключение, udevd принимает события ядра при помощи D-Bus, после чего получает атрибуты нового устройства из файловой системы /sys и применяет правила в зависимости от атрибутов - после этого создается файл устройства в файловой системе /dev. Udev также позволяет подгружать предназначенные для этого драйверы устройств при помощи механизма "modalias".

Правила и примеры использования udev

Udev предоставляет возможность изменять свое поведение на основе правил и конфигурационных файлов. Вы можете переопределить принцип работы правил, поставляемых в комплекте с системой (обычно находящихся в /lib/udev/rules.d) или добавить индивидуальные и специфические возможности, удовлетворяющие вашим потребностям. Правила можно добавлять в директорию /etc/udev/rules.d/ - директорию для индивидуальных пользовательских правил.

Создавайте свои правила (которые назначают имя файла устройства, создают символические ссылки, устанавливают права доступа и выполняют другие необходимые вам действия) в этой директории. Для того, чтобы удостоверится, что правило предшествует остальным, убедитесь, что имя файла начинается с числа, меньшего, чем остальные правила, которые должны выполняться после него - например, 10-local.rules.

Далее приведены примеры некоторых правил с комментариями, которые помогут вам писать собственные правила.

Отключить учетную запись пользователя root до того момента, как администратор подключит свой USB-диск
BUS=="usb", SUBSYSTEM=="block", PROGRAM="/bin/enable_root_login"

Для того, чтобы это правило работало, вам необходимо разработать приложение или сценарий оболочки с заданным именем, для того, чтобы получать серийный номер устройства, подключенного к системе и сравнивать его с известным серийным номером устройства администратора. В случае совпадения серийных номеров, программа удалит строку auth requisite pam_deny.so из файла /etc/pam.d/login, что позволит вход в систему под учетной записью пользователя root. В случае подключения других USB-устройств, никаких изменений файлов произведено не будет. Напротив, как только USB-носитель будет отключен, эта строка будет снова добавлена в файл.

Это правило было протестировано на дистрибутиве RHEL 5.0 и прекрасно работало, тем не менее, при использовании команды su или при входе в однопользовательском режиме при загрузке это правило не будет работать. Для запрета входа под учетной записью пользователя root при использовании команды su, можно сделать следующее:
  1. Отредактировать файл /etc/security/access.conf, добавив строку root: ALL.
  2. Отредактировать файл /etc/pam.d/system-auth, добавив в качестве второй строки account required pam_access.so.
  3. Отредактировать файл /etc/pam.d/su и сделать первой строкой этого файла строку account include system_auth.

Эти действия, конечно же, должны производиться программой enable_root_login. После проверки серийного номера USB-устройства на принадлежность администратору, программа должна убрать все сделанные изменения в файлах, а в том случае, если присоединенное устройство не принадлежит администратору, произвести все вышеприведенные действия над файлами.

Эти действия не спасут от входа под учетной записью пользователя root в однопользовательском режиме, тем не менее, вы можете установить пароль на загрузчик GRUB для предотвращения простого доступа к однопользовательскому режиму.

Для получения информации о серийном номере устройства, названии устройства, идентификаторе поставщика, названии производителя и других параметрах можно использовать следующую команду:
udevinfo -a -p /sys/block/sdb

В новейших дистрибутивах программы udevinfo может не быть - в этом случае следует использовать udevadm вместо udevinfo.

Отключить все USB-порты
BUS=="usb", OPTIONS+="ignore_device"

Итогом выполнения этого правила будет отключение всех устройств, подсоединенных к USB-портам вашей системы - USB-принтеры, клавиатуры и мыши не будут работать. Будьте осторожны при использовании!

Отключить все блочные устройства, присоединенные к USB-портам
BUS=="usb", SUBSYSTEM=="block", OPTIONS+="ignore_device"

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

Назначить постоянное имя файлу устройства второго IDE-диска
KERNEL=="sdb", NAME="my_spare"

Замените sdb в том случае, если хотите применить правило к другому диску.

Игнорировать второй USB SCSI/IDE-диск, подключенный по USB
KERNEL=="sdb", NAME="my_spare"

или

BUS=="usb", KERNEL=="hdb", OPTIONS+="ignore_device"
Добавить символическую ссылку на заданный файл устройства USB-мыши
SUBSYSTEM=="input", BUS=="usb", SYSFS{serial}=="0000:00:1d.0", SYMLINK+=="MY-USB-MOUSE"
Изменить имя файла устройства на основании производителя устройства
BUS=="usb", SYSFS{manufacturer}=="JetFlash", NAME="UNIVERSE"

Это правило изменяет имя файла устройства на 'UNIVERSE' в том случае, если производителем USB-накопителя является JetFlash.

Выборочно разрешить использование блочных USB-устройств при помощи специальной программы
BUS=="usb", SUBSYSTEM=="block", PROGRAM="/bin/usbc.jar", RESULT!="my", OPTIONS+="ignore_device"

В том случае, если программа выводит 'my', устройство может использоваться, в противном случае устройство игнорируется.

Для получения дополнительной информации читайте также: