9.4. Управление устройствами

9.4.1. Сетевые устройства

Udev по умолчанию присваивает имена сетевым устройствам в соответствии с данными прошивки, BIOS'а или физическими характеристиками, такими как шина, слот или MAC-адрес. Целью такого соглашения об именовании является обеспечение того, чтобы сетевые устройства именовались последовательно, а не основывались на времени обнаружения сетевой карты. Например, в более старых версиях Linux—на компьютере с двумя сетевыми картами производства Intel и Realtek, сетевая карта производства Intel могла стать eth0, а карта Realtek — eth1. Иногда после перезагрузки карты именовались наоборот.

В новой схеме именования, типичными именами сетевых устройств являются enp5s0 или wlp3s0. Если такие имена для вас нежелательны, то может быть реализована традиционная схема именования или своя собственная.

9.4.1.1. Отключение постоянного присвоения имен в параметрах загрузки ядра

Традиционная схема именования - eth0, eth1, и так далее, может быть включена путем добавления параметра net.ifnames=0 в командную строку ядра. Это решение подходит для систем, которые имеют только одно сетевое устройство каждого типа. Часто в ноутбуках несколько сетевых устройств с именами eth0 и wlan0; в таких ноутбуках также может использоваться этот метод. Командная строка указывается в файле конфигурации GRUB. Подробности смотрите на странице Раздел 10.4.4, «Создание файла конфигурации GRUB».

9.4.1.2. Создание пользовательских правил Udev

Схему именования можно настроить, создав пользовательские правила 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

9.4.2. Символические ссылки CD-ROM

Некоторое программное обеспечение, которое вы, возможно, захотите установить позже (например, различные медиаплееры) ожидают, что устройства /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.4.3. Работа с дубликатами устройств

Как поясняется в Раздел 9.3, «Взаимодействие с устройствами и модулями», порядок отображения устройства с одинаковой функциональностью в /dev является, как правило, случайным. Например, если у вас есть веб камера и TV тюнер, иногда /dev/video0 ссылается на камеру, а /dev/video1 ссылается на TV тюнер, а иногда, например, после перезагрузки системы, порядок поменяется на противоположный. Для всех классов оборудования, за исключением звуковых и сетевых карт, это можно исправить, написав правила udev для создания постоянных символических ссылок. Случай с сетевыми картами описан отдельно в Раздел 9.5, «Настройка сети», инструкции по настройке звуковых карт можно найти в BLFS.

Для каждого из ваших устройств, которые могут иметь такую проблему (даже если проблема не существует в текущем дистрибутиве Linux ), найдите соответствующий каталог в /sys/class или /sys/block. Для видеоустройств это может быть /sys/class/video4linux/videoX. Определите атрибуты, которые однозначно идентифицируют устройство (обычно это идентификаторы поставщика и продукта и/или серийные номера):

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, которые всегда указывают на правильное устройство.