LXF165-166: Администрирование: Udev
|
|
|
Udev: Отшлифуйте свой компьютер
Системное администрирование: Настройте свое «железо» дивным менеджером устройств
Есть место, в котором Linux прячет свои самые глубокие и темные секреты. Нейл Ботвик заглядывает туда. Снова.
Кредо Unix «Все является файлом» относится и к устройствам. Когда вы вставляете флэшку или подключаете web-камеру, в каталоге /dev появляется узел устройства (файл), но как он туда попадает? В старые добрые времена нужно было прибегать к тайным заклинаниям mknod и обращаться к священному списку старших и младших номеров устройств; теперь подключить устройство достаточно просто. Новая волшебная команда – udev – работает как динамическая файловая система и как менеджер устройств. При загрузке системы udev создает в каталоге /dev виртуальную файловую систему вроде /proc или /sys, с файлами устройств для всей периферии, обнаруженной ядром. Затем она слушает события горячего подключения, поступающие от ядра, и на лету создает или удаляет файлы устройств для накопителей, сетевых адаптеров, устройств для работы с видео и всего, что можно подключить «на лету», когда эти устройства подключаются или отключаются от компьютера.
На первый взгляд она ничем не отличается от своей предшественницы devfs, но udev работает полностью в пространстве пользователя, а не как процесс ядра. Ядро обнаруживает устройство, но не создает файл устройства, передавая ответственность udev. Это означает, что udev может выполнять какие-то действия до создания файла устройства.
Все это работает под управлением правил – текстовых файлов, где описаны условия и действия: если устройство соответствует условиям, то действия выполняются. Правила находятся в двух каталогах: /lib/udev/rules.d и /etc/udev/rules.d. Первый содержит правила, установленные udev и другими пакетами – например, с SANE устанавливается огромный файл правил, где определяются действия, выполняемые при обнаружении различных сканеров. Файлы в /etc/udev/rules.d содержит правила, устанавливаемые другими пакетами, и пользовательские правила – именно они нас интересуют. Прежде чем начинать эксперименты с файлами в этом каталоге, учтите, что все файлы в нем уже установлены какими-то пакетами и могут быть перезаписаны при обновлении пакета, поэтому помещайте все свои правила в отдельный файл. Имена файлов имеют значение; они должны заканчиваться на .rules и считываться в определенном порядке, поэтому начинаются с числа. В расчет берется только имя файла, а не путь, так что файлы
/lib/udev/rules.d/10-foo.rules
/etc/udev/rules.d/20-bar.rules
/lib/udev/rules.d/30-stuff.rules
будут прочитаны именно в этом порядке. При наличии двух файлов с одинаковым именем используется только файл из /etc. Начните имя файла с 10, если правила должны выполняться первыми, или с 90, если последними. Порядок имеет значение, так как более поздние правила перегружают более ранние.
Условия и присваивания
Каждое правило – одна строка в файле, которая содержит несколько пар «ключ – значение». На практике нужны как минимум две пары: условие и присваивание. Если все условия верны, выполняется присваивание. Вот пример:
DRIVERS==”sd”, ATTRS{vendor}==”Google”, SYMLINK=”android”
Первая часть до запятой – условие; она сравнивает значения с помощью оператора == и проверяет, является ли устройство устройством хранения данных. Если это так, проверяется следующая часть ATTRS{vendor}, поле стандартного атрибута, и если оно равно «Google», значит, это телефон Android. Если второе условие верно, выполняется присваивание, которое настраивает символическую ссылку с имени устройства, назначенного ядром – скажем, с /dev/sdc на /dev/android. Прекрасно, скажете вы, но как узнать, на что именно делать проверку? Udev поможет нам и с этим, благодаря команде udevadm. Вставьте флэшку, отметьте имя появляющегося устройства, например, /dev/sdb1, затем выполните команду
udevadm info --name /dev/sdb1
Она выдаст полезную информацию об устройстве, из которой вы можете понять, что надо использовать для сравнения, но это не формат правила udev. Чтобы получить ее в нужном формате, скомандуйте
udevadm info --attribute-walk --name /dev/sdb1 | less
То, что мы пропускаем вывод команды через less, намекает, что команда выдает большой объем информации. Она выводит не только информацию об устройстве, но и проходит по дереву, показывая атрибуты каждого из его родителей, от /dev/sdb до USB-контроллера. Для проверки можно выбрать любое из них, но нас на самом деле интересуют только один или два верхних блока. В файле с правилом udev нам нужен формат вывода, поэтому можно вставить соответствующую строку в файл с правилом. Если нужно сравнивать с несколькими атрибутами, все они должны быть в одном и том же блоке. Чтобы правило сработало, все условия должны быть верны. Если достаточно, чтобы было верным только одно условие, придется добавить отдельное правило для каждого условия.
Добавить символические ссылки на файлы устройств просто, но можно сделать гораздо больше. Например, заглянув в /dev/disk, вы увидите подкаталоги, такие как by-id и by-partlabel. Они содержат символические ссылки для определения всех дисков и разделов по их UUID и меткам файловых систем. Если у вас в /etc/fstab используются UUID, вы увидите, на какие реальные дисковые устройства они ссылаются. Эти ссылки автоматически создаются при загрузке системы при запуске udev. Другие типы присваиваний, которые можно добавить в правило – OWNER, GROUP и MODE, они изменяют владельца и права доступа к файлу устройства. Например, если у вас есть сканер, который не могут найти SANE и GIMP, но root видит его, обычно это ограничения прав доступа к файлу устройства. Изменить их можно таким правилом:
ATTRS{product}==”CanoScan”, ATTRS{manufacturer}==”Canon”, GROUP:=”scanner”, MODE:=”0660”, SYMLINK=”scanner”
Это правило, которое я добавил для сканера Canon, обнаружившего именно такое поведение. Правило делает группу устройств сканеров доступной на запись, а ее владельцем становится группа scanner, поэтому любой пользователь в этой группе может им пользоваться. В однопользовательской системе можно просто установить режим в 0666, но группа scanner – это общепринятый способ.
Переименовывать файлы устройств больше нельзя, но сетевые интерфейсы – можно. Если у вас несколько сетевых карт, например, если компьютер является маршрутизатором или брандмауэром, было бы желательно, чтобы им всегда назначался один и тот же адрес. Переключение интерфейсов на брандмауэре способно вызвать катастрофу. В условии udev можно использовать MAC-адрес карты, указанный после “ether” в выводе ifconfig; например, с его помощью можно создать такое правило:
SUBSYSTEM==”net”, ATTR{address}==”e8:11:32:09:63:82”, NAME=”eth0”
SUBSYSTEM==”net”, ATTR{address}==”50:e5:49:bd:1e:45”, NAME=”eth1”
Если вы когда-нибудь меняли сетевую карту, возможно, вам было интересно, почему новая карта появлялась в системе как eth1. Все дело в правиле udev, которое автоматически создается в /etc/udev/rules.d/70-persistent-net.rules, оно очень похоже на правила выше. Так как старый адрес был выделен eth0, новому адресу будет выделено первое доступное имя устройства. Поэтому если вы заменили карту на новую, либо удалите старое правило из файла, либо удалите файл, и он будет вновь создан для новой карты при следующей перезагрузке системы. Постоянные сетевые правила были удалены из udev, и если вы хотите изменить сетевые имена на самых новых дистрибутивах, понадобится создать правила вручную в таком же формате, при котором сначала проверяется SUBSYSTEM, чтобы убедиться, что это сетевая карта, а затем MAC-адрес.
Не меняйте правила
Не поддавайтесь соблазну изменять существующие файлы с правилами; они устанавливаются менеджером пакетов и могут быть заменены при обновлениях. Вместо этого создавайте собственные файлы с правилами в /etc/udev/rules.d. Если вы хотите изменить существующее правило, скопируйте его в собственный файл и выполните изменения там. Если задать файлу больший номер, чем у существующего файла с правилом, у вашего правила будет преимущество. Также, пользуясь знаком := вместо =, можно задавать приоритет присваиваний – в этом случае не только выполняется присваивание, но и гарантируется, что ни одному из последующих правил не удастся изменить его на свое.
Наряду с изменением файлов устройств в /dev, udev также может запускать программы. Программа usb_modeswitch для 3G-модемов использует правила udev для переключения устройства из режима накопителя в режим модема, и теперь программу больше не нужно запускать вручную. Помните, что во время работы программы udev блокируется, поэтому пользуйтесь им только для программ, завершающихся быстро. Если нужно запустить нечто долгосрочное, поместите команду в скрипт и вызовите его из правила с &, чтобы он сразу вернул управление. Например, в правиле
KERNEL==”sd[a-z]1”, ATTRS{model}==”DMC-TZ30”, RUN=”/usr/local/bin/copyphotos.sh $devnode &”
используется параметр KERNEL для определения имени устройства и атрибут model для определения конкретной модели камеры. При подключении этой камеры правило запускает скрипт, передавая ему в качестве аргумента имя устройства. Текст скрипта выглядит так:
#!/bin/sh
pmount $1 camera
mv /media/camera/DCIM/100_PANA/*.JPG /home/nelz/photos/new
pumount /media/camera
Скрипт монтирует камеру, используя имя устройства, переданное udev, перемещает фотографии в домашний каталог и размонтирует камеру. Демон udev выполняется от имени суперпользователя-root, и все запущенные им команды тоже будут выполняться от имени root. Это следует учитывать, особенно для команд монтирования устройств, потому что обычно они должны быть доступны на запись только root. В этот скрипт можно добавить команду для изменения владельца после копирования.
Более подробную информацию можно найти на man-странице udev, заглянув в файлы правил в своей системе и в руководства в Интернете. Удобное руководство есть по ссылке www.reactivated.net/udevrules.php. |