Udev по умолчанию присваивает имена сетевым устройствам в соответствии с данными прошивки, BIOS'а или физическими характеристиками, такими как шина, слот или MAC-адрес. Целью такого соглашения об именовании является обеспечение того, чтобы сетевые устройства именовались последовательно, а не основывались на времени обнаружения сетевой карты. Например, в более старых версиях Linux—на компьютере с двумя сетевыми картами производства Intel и Realtek, сетевая карта производства Intel могла стать eth0, а карта Realtek — eth1. Иногда после перезагрузки карты именовались наоборот.
В новой схеме именования, типичными именами сетевых устройств являются enp5s0 или wlp3s0. Если такие имена для вас нежелательны, то может быть реализована традиционная схема именования или своя собственная.
Традиционная схема именования - eth0, eth1, и так далее, может
быть включена путем добавления параметра net.ifnames=0
в командную
строку ядра. Это решение подходит для систем, которые имеют
только одно сетевое устройство каждого типа. Часто в ноутбуках
несколько сетевых устройств с именами eth0 и wlan0; в таких
ноутбуках также может использоваться этот метод. Командная строка
указывается в файле конфигурации GRUB. Подробности смотрите на
странице Раздел 10.4.4,
«Создание файла конфигурации GRUB».
Схему именования можно настроить, создав пользовательские правила udev. В состав книги включен скрипт, который генерирует начальные правила. Чтобы их сгенерировать, выполните команду:
bash /usr/lib/udev/init-net-rules.sh
Теперь, проверьте файл /etc/udev/rules.d/70-persistent-net.rules
,
чтобы узнать какое имя с каким сетевым устройством сопоставлено:
cat /etc/udev/rules.d/70-persistent-net.rules
В некоторых случаях, например, когда MAC-адреса были назначены сетевой карте вручную или в виртуальной среде, такой как Qemu или Xen, возможно, файл сетевых правил не будет сгенерирован, поскольку адреса назначаются не последовательно. В таких случаях, этот способ не применим.
Файл начинается с блока комментариев, далее следуют две строки для каждой сетевой карты (NIC). Первая строка представляет собой описание с комментариями и содержит аппаратные идентификаторы (например, поставщика PCI и идентификаторы устройств, если это PCI-карта), а также информацию о драйвере (если его удалось обнаружить). Ни идентификатор оборудования, ни драйвер не используются для определения того, какое имя присвоить интерфейсу; эта информация предназначена только для справки. Вторая строка - это правило udev, которое соответствует этому сетевому адаптеру и фактически присваивает ему имя.
Все правила udev состоят из нескольких ключевых слов, разделенных запятыми и необязательными пробелами. Ниже приведены ключевые слова и пояснения по каждому из них:
SUBSYSTEM=="net"
- указывает
Udev игнорировать устройства, которые не являются сетевыми
картами.
ACTION=="add"
- указывает Udev
игнорировать правила для событий, отличных от добавления
(события "удалить" и "изменить" также происходят, но не
требуют переименования сетевых интерфейсов).
DRIVERS=="?*"
- существует для
того, чтобы Udev проигнорировал подинтерфейсы VLAN или
моста (потому что эти подинтерфейсы не имеют драйверов).
Эти подинтерфейсы пропускаются, потому что назначенные им
имена будут конфликтовать с именами их родительских
устройств.
ATTR{address}
- значением
этого ключевого слова является MAC-адрес сетевой карты.
ATTR{type}=="1"
- этот ключ
гарантирует выполнение правила соответствующего только
основному интерфейсу, при использовании определенных
беспроводных драйверов, которые создают несколько
виртуальных интерфейсов. Дополнительные интерфейсы
пропускаются по той же причине, что и подинтерфейсы VLAN и
мост, в ином случае произошел бы конфликт имен.
NAME
- значением этого
ключевого слова является имя, которое udev присвоит этому
интерфейсу.
Значение NAME
является очень важным.
Прежде чем продолжить, убедитесь, что вы знаете, какое имя
назначено каждой из сетевых карт и обязательно используйте это
значение NAME
при создании файлов
конфигурации сети.
Даже если создан пользовательский файл правил udev, udev все
равно может назначить одно или несколько альтернативных имен для
сетевой карты на основе физических характеристик. Если
пользовательское правило udev переименовывает какой-либо сетевой
адаптер, используя имя, уже назначенное в качестве
альтернативного имени другого сетевого адаптера, это правило udev
не будет выполнено. Если возникает эта проблема, вы можете
создать файл конфигурации /etc/udev/network/99-default.link
с пустой
альтернативной политикой назначения, переопределяющей файл
конфигурации по умолчанию /usr/lib/udev/network/99-default.link
:
sed -e '/^AlternativeNamesPolicy/s/=.*$/=/' \ /usr/lib/udev/network/99-default.link \ > /etc/udev/network/99-default.link
Некоторое программное обеспечение, которое вы, возможно, захотите
установить позже (например, различные медиаплееры) ожидают, что
устройства /dev/cdrom
или
/dev/dvd
и символические ссылки на
CD-ROM или DVD-ROM устройства должны существовать. Кроме того,
может быть удобно использовать эти символические ссылки в
/etc/fstab
. Udev поставляется с
файлом сценария, который будет генерировать правила для создания
этих символических ссылок, в зависимости от возможностей каждого
устройства, но вам нужно решить, какой из двух режимов работы вы
хотите использовать.
Во-первых, скрипт может работать в режиме «by-path» (используется по умолчанию для USB и FireWire устройств), где создаваемые им правила зависят от физического пути к CD или DVD устройству. Во-вторых, он может работать в режиме «by-id» (по умолчанию для устройств IDE и SCSI), где создаваемые им правила зависят от строк идентификации, хранящихся в самом устройстве CD или DVD. Путь определяется сценарием Udev path_id, а идентификационные строки считываются с оборудования командами ata_id или scsi_id, в зависимости от того, какой тип устройства у вас есть.
У каждого подхода есть свои преимущества; правильный подход к использованию будет зависеть от того, какие изменения устройств могут произойти. Если вы ожидаете, что физический путь к устройству (порты и/или слоты, в который оно подключено), изменится, например, потому, что вы планируете переместить диск в другой порт IDE или другой разъем USB, то вы должны использовать режим «by-id». С другой стороны, если вы ожидаете, что идентификация устройства изменится, например, потому, что оно может выйти из строя, и вы замените его другим устройством с теми же характеристиками и подключите к тем же разъемам, тогда вы должны использовать режим «by-path».
Если с вашим устройством возможен любой из вариантов, выберите тот, который по вашему мнению случается чаще.
Внешние устройства (например, привод компакт-дисков, подключенный через USB) не следует подключать методом «by-path», потому что каждый раз, когда устройство подключено в новый внешний порт, изменится его физический путь. Все внешние устройства подвержены этой проблеме, если при написании правил Udev применять режим распознавания по их физическому пути. К тому же, эта проблема не ограничивается CD и DVD-приводами.
Если вы хотите увидеть значения, которые будут использовать скрипты
udev, то для требуемого устройства CD-ROM найдите соответствующий
каталог в /sys
(например, это может
быть /sys/block/hdd
) и выполните
команду, аналогичную следующей:
udevadm test /sys/block/hdd
Обратите внимание на строки, содержащие вывод различных идентификаторов *_id. Режим «by-id» будет использовать значение ID_SERIAL если оно существует и не пустое, иначе будет использована комбинация ID_MODEL и ID_REVISION. Режим «by-path» будет использовать значение ID_PATH.
Если режим по умолчанию не подходит для вашей ситуации, то в файл
/etc/udev/rules.d/83-cdrom-symlinks.rules
можно
внести следующие изменения (где mode
является одним из значений
«by-id» или
«by-path»):
sed -e 's/"write_cd_rules"/"write_cd_rules mode
"/' \
-i /etc/udev/rules.d/83-cdrom-symlinks.rules
Обратите внимание, что на данный момент, нет необходимости
создавать файлы правил или символические ссылки, так как вы
смонтировали каталог /dev
хоста в
систему LFS, и мы предполагаем, что символические ссылки уже
существуют. Правила и символические ссылки будут создаваться при
первой загрузке LFS системы.
Однако, если у вас есть несколько устройств CD-ROM, то
символические ссылки, сгенерированные в это время, могут указывать
на другие устройства, и иметь различия от хост системы, потому что
устройства не будут обнаружены в предсказуемом порядке. Назначения,
созданные при первой загрузке системы LFS, будут правильными,
проблема возникнет только в том случае, если символические ссылки в
обеих системах указывают на одно и то же устройство. Если
потребуется, проверьте (и, возможно, отредактируйте)
сгенерированные правила в файле /etc/udev/rules.d/70-persistent-cd.rules
после
загрузки, чтобы убедиться, что назначенные символические ссылки
соответствуют тому, что вам нужно.
Как поясняется в Раздел 9.3,
«Взаимодействие с устройствами и модулями», порядок отображения
устройства с одинаковой функциональностью в /dev
является, как правило, случайным. Например,
если у вас есть веб камера и TV тюнер, иногда /dev/video0
ссылается на камеру, а /dev/video1
ссылается на TV тюнер, а иногда,
например, после перезагрузки системы, порядок поменяется на
противоположный. Для всех классов оборудования, за исключением
звуковых и сетевых карт, это можно исправить, написав правила udev
для создания постоянных символических ссылок. Случай с сетевыми
картами описан отдельно в Раздел 9.5, «Настройка сети»,
инструкции по настройке звуковых карт можно найти в
BLFS.
Для каждого из ваших устройств, которые могут иметь такую проблему
(даже если проблема не существует в текущем дистрибутиве Linux ),
найдите соответствующий каталог в /sys/class
или /sys/block
. Для видеоустройств это может быть
/sys/class/video4linux/video
. Определите атрибуты,
которые однозначно идентифицируют устройство (обычно это
идентификаторы поставщика и продукта и/или серийные номера):
X
udevadm info -a -p /sys/class/video4linux/video0
Затем напишите правила, которые создают символические ссылки, например:
cat > /etc/udev/rules.d/83-duplicate_devs.rules << "EOF"
# Persistent symlinks for webcam and tuner
KERNEL=="video*", ATTRS{idProduct}=="1910", ATTRS{idVendor}=="0d81", SYMLINK+="webcam"
KERNEL=="video*", ATTRS{device}=="0x036f", ATTRS{vendor}=="0x109e", SYMLINK+="tvtuner"
EOF
В результате устройства /dev/video0
и
/dev/video1
по-прежнему случайным
образом ссылаются на TV тюнер и веб-камеру (и, следовательно,
никогда не должны использоваться напрямую), но есть символические
ссылки /dev/tvtuner и /dev/webcam, которые всегда указывают на
правильное устройство.