Udev: различия между версиями
imported>Vix Нет описания правки |
imported>Vix Нет описания правки |
||
Строка 106: | Строка 106: | ||
mcedit /lib/udev/rules.d/40-usb_modeswitch.rules | mcedit /lib/udev/rules.d/40-usb_modeswitch.rules | ||
правим строку так: | правим строку так: | ||
KERNEL=="ttyUSB*", DRIVERS=="option1|usbserial", PROGRAM="/usr/sbin/usb_modeswitch_dispatcher --symlink-name %p||wvdial", SYMLINK="%c" | |||
где после '''<nowiki>||</nowiki>''' следом наша команда... | где после '''<nowiki>||</nowiki>''' следом наша команда... |
Версия от 00:46, 11 февраля 2014
Некоторые замечательные правила и примеры использования 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, можно сделать следующее:
Отредактировать файл /etc/security/access.conf, добавив строку root: ALL. Отредактировать файл /etc/pam.d/system-auth, добавив в качестве второй строки account required pam_access.so. Отредактировать файл /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', устройство может использоваться, в противном случае устройство игнорируется.
Для получения дополнительной информации читайте также:
- Например для автоматического соединения через wvdial модема, можно создать правило для программы usbmodeswitch
mcedit /lib/udev/rules.d/40-usb_modeswitch.rules
правим строку так:
KERNEL=="ttyUSB*", DRIVERS=="option1|usbserial", PROGRAM="/usr/sbin/usb_modeswitch_dispatcher --symlink-name %p||wvdial", SYMLINK="%c"
где после || следом наша команда...