Udev (Русский)
From ArchWiki
i18n |
---|
Русский |
English |
繁體中文 |
简体中文 |
Если вы хотите перейти с DevFS на Udev, смотрите Переход с DevFS на Udev
Эта страница пытается обрисовать всё огромное количество изменений, происходивших в последнее время с изменением udev. Начиная с версии 084, udev отвечает за все hotplug и coldplug события. Соответственно, пакет hotplug устарел и удалён с репозиториев Arch, так как теперь udev отвечает за все эти события.
Contents |
Правило номер один
Udev не будет загружать модули (как при загрузке, так и после), если только в вашем /etc/rc.conf
не включена опция MOD_AUTOLOAD
. Если она выключена, вы, как администратор, должны загружать нужные вам модули самостоятельно. Вы можете делать это различными способами. Лучше всего - указав все нужные модули в параметре MODULES
в файле rc.conf
или используя команду modprobe
для каждого требуемого модуля. Другой метод - запустить команду 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 часто может совершать ошибки и загружать ненужные модули. Для предотвращения этого вы можете поместить их в черный список. Будучи занесенным в него, модуль никогда не будет загружаться 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.conf
. Попробуйте почистить этот файл.
Смешивание устройств, порядок сетевых/звуковых карт меняется при каждой загрузке
Поскольку udev загружает все модули одновременно, устройства иногда инициализируются в различном порядке. Например, с двумя сетевыми картами, вы можете обнаружить, что они меняются именами eth0
и eth1
.
Решение тут состоит в самостоятельном указании порядка загрузки модулей с помощью параметра MODULES
в файле rc.conf
. Модули, добавленные в этот список, будут загружены перед стартом udev, так что вы имеете полный контроль над порядком их загрузки.
# Модуль 8139too всегда будет загружаться перед e100 MODULES=(8139too e100)
Другой метод определения порядка сетевых карт - использование правил udev для именования каждого сетевого интерфейса. Создайте файл /etc/udev/rules.d/10-network.rules
и внесите туда MAC-адреса ваших сетевых карт:
SUBSYSTEM=="net", ATTRS{address}=="aa:bb:cc:dd:ee:ff", NAME="lan0" SUBSYSTEM=="net", ATTRS{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]", NAME="%k", SYMLINK+="usb%m", GROUP="users", OPTIONS="last_rule" ACTION=="add", KERNEL=="sd[a-z][0-9]", SYMLINK+="usb%n", GROUP="users", NAME="%k" ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/mkdir -p /mnt/usb%n" ACTION=="add", KERNEL=="sd[a-z][0-9]", PROGRAM=="/lib/udev/vol_id -t %N", RESULT=="vfat", RUN+="/bin/mount -t vfat -o rw,noauto,flush,quiet,nodev,nosuid,noexec,noatime,dmask=000,fmask=111 /dev/%k /mnt/usb%n", OPTIONS="last_rule" ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/mount -t auto -o rw,noauto,sync,dirsync,noexec,nodev,noatime /dev/%k /mnt/usb%n", OPTIONS="last_rule" ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/umount -l /mnt/usb%n" ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/rmdir /mnt/usb%n", OPTIONS="last_rule"
Поместите эти правила в любой файл директории /etc/udev/rules.d/, имя которого оканчивается на .rules. Например, на моей системе этот код находится в файле /etc/udev/rules.d/sda.rules.
Версия с символическими ссылками в /media:
KERNEL=="sd[a-z]", NAME="%k", SYMLINK+="usbhd-%k", GROUP="users", OPTIONS="last_rule" ACTION=="add", KERNEL=="sd[a-z][0-9]", SYMLINK+="usbhd-%k", GROUP="users", NAME="%k" ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/mkdir -p /media/usbhd-%k" ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/ln -s /media/usbhd-%k /mnt/usbhd-%k" ACTION=="add", KERNEL=="sd[a-z][0-9]", PROGRAM=="/lib/udev/vol_id -t %N", RESULT=="vfat", RUN+="/bin/mount -t vfat -o rw,noauto,flush,quiet,nodev,nosuid,noexec,noatime,dmask=000,fmask=111 /dev/%k /media/usbhd-%k", OPTIONS="last_rule" ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/mount -t auto -o rw,noauto,sync,dirsync,noexec,nodev,noatime /dev/%k /media/usbhd-%k", OPTIONS="last_rule" ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/rm -f /mnt/usbhd-%k" ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/umount -l /media/usbhd-%k" ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/rmdir /media/usbhd-%k", OPTIONS="last_rule"
Важно! Если вы используете любые несъемные устройства, именуемые как /dev/sdX (например жесткие диски SATA), измените во всех sd[a-z] все a на первые неиспользуемые буквы для sd*-устройств. Например, если у вас есть один SATA-диск, распознающийся как /dev/sda, измените все "sd[a-z]" на "sd[b-z]". Хорошая идея - начинать имена файлов с вашими правилами с номера. Например, 010.udev.rules. Тогда udev прочтет их до стандартных правил. Эти правила не требует никаких изменений в /etc/fstab. Просмотрите команды монтирования, возможно вы захотите изменить параметры прав доступа, синхронизации и т.д. (поищите в форумах последствия различных конфигураций).