О переименовании устройств Ethernet

17.04.2013
Влад Горелецкий, компиляция из разных источников

Источники:
http://www.novell.com/support/kb/doc.php?id=3012993
http://linux-tips.org/article/73/persistent-device-naming-with-udev
https://www.myricom.com/software/dbl/543-how-do-i-rename-renumber-the-db...

Общий случай
Возьмем довольно не редкую ситуацию: вы добавили в сервер новую сетевую карту и у существующих карт поменялись имена. Или: вы клонировали виртуальную машину и вновь запущенный клон видит eth1 и не видит eth0. Или: архитектура сети и маршрутизации предполагает, что ethX должен называться как eth0. Или: вы хотите, чтобы wlan0 определялась как eth0.

Все заявленные потребности могут быть реализованы путем переименования устройств в конфигурационных файлах udev.

Сначала нам потребуется определить аппаратный адрес устройства (сетевой карты), например:


ifconfig eth0 | grep HWaddr

Примерный вывод будет такой:


eth0 Link encap:Ethernet HWaddr 00:1A:4B:B7:31:13

Откроем для редактирования файл /etc/udev/rules.d/30-net_persistent_names.rules. Для систем типа SLES 10 информация, определяющая конфигурацию устройства, как его понимает ядро, и прочие параметры будут содержаться в строках, среди которых нужно найти строку с нашим MAC-адресом:


SUBSYSTEM=="net", ACTION=="add", SYSFS{address}=="00:1a:4b:b7:31:13", IMPORT="/lib/udev/rename_netiface %k eth0"

Видим, что в такой строке MAC-адресу сопоставлено имя устройства, в данном случае eth0. Заменим его на требуемое, например, eth5:


SUBSYSTEM=="net", ACTION=="add", SYSFS{address}=="00:1a:4b:b7:31:13", IMPORT="/lib/udev/rename_netiface %k eth5"

Сохраним файл и перегрузим машину для тестирования изменений.

Усложним ситуацию
Допустим, вам нужно создать корневую файловую систему, которая будет клонирована на тысячу машин. В аппаратной части системы имеется несколько сетевых интерфейсов на одинаковом чипе, которые используют одинаковый драйвер (модуль ядра). Следует представлять, что без изменения конфигурации на некоторых клонированных машинах появятся интерфейсы eth1, eth2, на других - eth3, eth7 и так далее. Для сохранения постоянной последовательности имен придется создать свои правила для udev с учетом того обстоятельства, что на всех машинах все MAC-адреса сетевых карт будут разные. Для решения задачи используем некоторые параметры, которые можно увидеть в выводе udevinfo:


udevinfo -a -p /sys/class/net/eth1
    KERNEL=="eth1"
    SUBSYSTEM=="net"
    DRIVER==""
    ATTR{addr_len}=="6"
    ATTR{iflink}=="3"
    ATTR{ifindex}=="3"
    ATTR{features}=="0x0"
    ATTR{type}=="1"
    ATTR{link_mode}=="1"
    ATTR{address}=="00:15:00:4a:67:b6"
   ...

Как видим, легко было бы сопоставить MAC-адрес имени, но по указанным причинам нам это не подходит. Обратим внимание на ту часть вывода, которая касается "родительского устройства":


  looking at parent device '/devices/pci0000:00/0000:00:1c.0':
    KERNELS=="0000:00:1c.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="e100"

Мы увидим, что, несмотря на одинаковый драйвер e100, все устройства имеют разные идентификаторы на шине pci (поле KERNELS). Таким образом, нам доступен следующий подход: можно создать правила, которые будут указывать на первый ID шины, использующий драйвер e100, вешать имя eth2, на второй - eth3 и так далее. А третий ID, скажем, будет сопоставлен имени устройства vlan0. Номера, естественно, взяты для примера.

Вид таких правил будет следующий:


KERNELS=="0000:00:1c.0", SUBSYSTEMS=="pci",  DRIVERS=="e100", NAME="eth2"
KERNELS=="0000:00:1d.0", SUBSYSTEMS=="pci",  DRIVERS=="e100", NAME="eth3"
KERNELS=="0000:00:0f.0", SUBSYSTEMS=="pci",  DRIVERS=="e100", NAME="vlan0"

Можем сохранить эти правила в файле /etc/udev/rules.d/z99custom.rules. Протестируем новые правила с помощью udevinfo:


udevinfo -a -p /sys/class/net/eth1

Чтобы это работало, не забудьте удалить уже существующие правила, касающиеся персистентных имен устройств из директории /etc/udev/rules.d во избежание конфликтов.

Совсем простой подход
Red Hat-подобные системы позволяют выполнить переименование устройств непосредственно из конфигурационных файлов сетевых интерфейсов. Важно: для того, чтобы это работало, существующие правила из каталога /etc/udev/rules.d/ должны быть удалены.

Пример. Допустим, инсталлятор создал в каталоге /etc/sysconfig/network-scripts следующие файлы: ifcfg-eth0 и ifcfg-eth1. Содержимое должно быть похоже на такое (CentOS 6.4), файл ifcfg-eth1:


DEVICE="eth1"
BOOTPROTO="dhcp"
HWADDR="00:1B:21:43:13:7B"
ONBOOT="yes"
TYPE="Ethernet"
UUID="405115bc-782e-4a84-8b26-bbe23b2d345d"

Чтобы устройство всегда определялось как eth5, нужно: 1) переименовать файл в ifcfg-eth5, 2) переименовать устройство в поле DEVICE, заменив его на eth5. Файл с новым именем ifcfg-eth5 будет отличаться только этим полем (если вы не изменили другие нужные вам настройки):


DEVICE="eth5"
BOOTPROTO="dhcp"
HWADDR="00:1B:21:43:13:7B"
ONBOOT="yes"
TYPE="Ethernet"
UUID="405115bc-782e-4a84-8b26-bbe23b2d345d"

Сохраним файл и перегрузим машину, чтобы сбросить старые правила udev. Протестируем изменения с помощью ifconfig -a . Этот подход работает в случаях, когда имеется, например, сервер с восемью сетевыми интерфейсами, и желательно, чтобы порядок портов на корпусе соотвествовал их именам. Тогда определяем MAC-адреса всех портов с помощью ifconfig -a, затем определяем их положение на корпусе с помощью команды ethtool -p (см. http://lexpr.ru/ethtool), затем переименовываем файлы ifcfg-* и девайсы в них нужным образом.

На этом введение в имена сетевых устройств под управлением udev можно завершить.



Назад в тематический каталог