Udev (Русский)

From ArchWiki
Revision as of 08:15, 21 October 2012 by Klay (Talk | contribs)

Jump to: navigation, search

Если вы хотите перейти с DevFS на Udev, смотрите Переход с DevFS на Udev

Эта страница пытается обрисовать всё огромное количество изменений, происходивших в последнее время с изменением udev. Начиная с версии 084, udev отвечает за все hotplug и coldplug события. Соответственно, пакет hotplug устарел и удалён с репозиториев Arch, так как теперь udev отвечает за все эти события.

Note: На сегодняшний день, в связи с изменениями в пакете udev и содержании основного конфигурационного файла системы /etc/rc.conf, эта статья не полностью отражает текущее положение вещей и нуждается в доработке.

Правило номер один

В связи с последними изменениями в пакете udev, файл /etc/rc.conf теперь не поддерживает опцию MOD_AUTOLOAD и работа по определению и загрузке необходимых модулей предоставлена udev. Разница в том, что udev не будет по-умолчанию загружать некоторые проблемные модули (см. ниже) В любом случае, вы можете запустить команду hwdetect --modules, которая сгенерирует имена необходимых для вашей системы модулей. Затем вы можете скопировать их в параметр MODULES файла rc.conf или же добавить туда только нужные вам модули, которые не были загружены автоматически.

Основные требования

  • Вам нужно свежее ядро: все ядра, вышедшие до 2.6.15 не будут работать.
  • Вы больше не можете использовать имена устройств в стиле DevFS в вашем fstab или конфигурационном файле загрузчика! Для получения дополнительной информации смотрите Переход с DevFS на Udev.

Недавние изменения

  • Программа startudev удалена. Пользуйтесь скриптом /etc/start_udev, если вы хотите, чтобы udev перезагрузил правила.
  • Udev теперь заменяет функциональность hotplug и hwdetect. Несмотря на то, что мы предоставляем hwdetect, он обычно используется только в процессе создания initrd программой mkinitrd.
  • Udev будет загружать модули одновременно, что может повлечь возрастание скорости загрузки. Однако, он не всегда загружает модули в одинаковом порядке, что может повлечь проблемы с сетевыми и звуковыми картами (если у вас есть оба устройства). Информацию об этом смотрите ниже.
  • Начиная с udev>= 171, OSS-модули, (snd_seq_oss, snd_pcm_oss, snd_mixer_oss) по-умолчанию, автоматически не загружаются. Вы можете загрузить их вручную:
sudo modprobe snd_mixer_oss
и, если требуется, добавить в /etc/rc.conf, в секцию модулей:
MODULES=(snd_mixer_oss)
Обратите внимание: TVtime использует snd_mixer_oss для программного управления звуком.

Добавление модулей в черный список

Udev часто может совершать ошибки и загружать ненужные модули. Для предотвращения этого вы можете поместить их в черный список. Будучи занесенным в него, модуль никогда не будет загружаться udev'ом. Ни во время загрузки, ни во время работы (например, когда вы подключите USB-накопитель).

Для добавления модуля в черный список, предварите его название восклицательным знаком (!) в параметре MODULES файла rc.conf.

Например,

MODULES=(!moduleA !moduleB)

load_modules: полезный параметр загрузки

Если вы укажете load_modules=off в параметрах загрузки ядра, udev не будет выполнять автозагрузку модулей. Это своего рода спасательный круг, на тот случай, если что-то пошло не так. Если udev загружает проблемный модуль, который подвешивает вашу систему или делает что-то ужасное, вы можете обойти автозагрузку модулей с помощью этого параметра, а затем внести коварный модуль в черный список.

Известные проблемы с железом

- Устройства BusLogic могут быть неработоспособны и могут подвешивать систему при загрузке. Это баг в ядре, и он пока не исправлен. - Устройства для чтения карт памяти, подключающиеся по PCMCIA не будут относиться к съемным устройствам.

 Для получения доступа к ним с помощью pmount, добавьте их в /etc/pmount.allow

Известные проблемы с автозагрузкой

Модули CPUFreq

У нас пока нет хорошего метода обнаружения различных CPUFreq-контроллеров, так что модули для них не будут загружаться автоматически. Для использования функции изменения частоты процессора, вы должны загрузить нужный модуль, добавив его в параметр MODULES файла rc.conf.

Проблемы со звуком, не все модули загружаются автоматически

Некотоые пользователи обнаружили эту проблему при наличии старых записей в /etc/modprobe.d/modprobe.conf. Попробуйте почистить этот файл.

Смешивание устройств, порядок сетевых/звуковых карт меняется при каждой загрузке

Поскольку udev загружает все модули одновременно, устройства иногда инициализируются в различном порядке. Например, с двумя сетевыми картами, вы можете обнаружить, что они меняются именами eth0 и eth1.

Решение тут состоит в самостоятельном указании порядка загрузки модулей с помощью параметра MODULES в файле rc.conf. Модули, добавленные в этот список, будут загружены перед стартом udev, так что вы имеете полный контроль над порядком их загрузки.

# Модуль 8139too всегда будет загружаться перед e100
MODULES=(8139too e100)

Другой метод определения порядка сетевых карт - использование правил udev для именования каждого сетевого интерфейса. Создайте файл /etc/udev/rules.d/10-network.rules и внесите туда MAC-адреса ваших сетевых карт:

SUBSYSTEM=="net", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="lan0"
SUBSYSTEM=="net", ATTR{address}=="ff:ee:dd:cc:bb:aa", NAME="wlan0"

Обратите внимание, что:

  • Для получения MAC-адреса каждой карты, запустите такую команду: udevadm info -a -p /sys/class/net/<ваше_устройство> | grep address
  • Убедитесь, что используете нижний регистр, указывая MAC-адрес в правиле udev.
  • Некоторые люди имели проблемы, именуя сетевые интерфейсы в старом стиле: eth0, eth1, и т.д. Попробуйте что-нибудь вроде "lan" или "wlan", если встретитесь с проблемами.

Не забудьте обновить /etc/rc.conf и другие конфигурационные файлы, использующие старый стиль именования!

Известные проблемы с самосборными ядрами

Udev не запускается вообще

Убедитесь, что версия вашего ядра - 2.6.15 или выше. Ранние ядра не умеют работать с событиями uevent, которые необходимы udev для автозагрузки.

Символические ссылки на CD/DVD и права сломались

Если вы используете ядро 2.6.15, вам нужен патч для uevent из ABS (он портирует нужную функциональность uevent из ядра 2.6.16). Просто синхронизируйте ваше дерево ABS командой abs, и вы найдете патч в директории /var/abs/kernels/kernel26/.

Трюки с Udev

Автомонтирование USB-устройств

KERNEL!="sd[a-z][0-9]", GOTO="auto_mount_end"

IMPORT{program}="/sbin/blkid -o udev -p %N"
ENV{ID_FS_LABEL}!="", ENV{dir_name}="%E{ID_FS_LABEL}"
ENV{ID_FS_LABEL}=="", ENV{dir_name}="usbhd-%k"

ACTION=="add", RUN+="/bin/mkdir -p /media/%E{dir_name}", RUN+="/bin/mount -t auto -o rw,relatime,noexec,nodev,utf8 
/dev/%k /media/%E{dir_name}"

ACTION=="remove", ENV{dir_name}!="", RUN+="/bin/umount -l /media/%E{dir_name}", RUN+="/bin/rmdir /media/%E{dir_name}"

LABEL="auto_mount_end"

Поместите это правило в любой файл директории /etc/udev/rules.d/, имя которого оканчивается на .rules. Например, на моей системе этот код находится в файле /etc/udev/rules.d/10-usb.rules.

Важно! Если вы используете любые несъемные устройства, именуемые как /dev/sdX (например жесткие диски SATA), измените во всех sd[a-z] все a на первые неиспользуемые буквы для sd*-устройств. Например, если у вас есть один SATA-диск, распознающийся как /dev/sda, измените все "sd[a-z]" на "sd[b-z]". Хорошая идея - начинать имена файлов с вашими правилами с номера. Например, 010-udev.rules. Тогда udev прочтет их до стандартных правил (например, если Вы хотите применить свои правила перед использованием hal (файл 90-hal.rules)). Эти правила не требует никаких изменений в /etc/fstab. Просмотрите команды монтирования, возможно вы захотите изменить параметры прав доступа, синхронизации и т.д. (поищите в форумах последствия различных конфигураций).