Пользователи дистрибутивов Debian (а может и других дистрибутивов тоже) наверняка замечали особенность, когда именование адаптеров меняется в зависимости от их установки/удаления из аппаратной конфигурации. Например, в машине было 2 сетевых адаптера eth0 и eth1. Пользователь решил заменить адаптер eth1: отключил старый и воткнул в слот новый адаптер. В итоге этот новый адаптер стал eth2, а не eth1 как было с предыдущим адаптером. Почему так происходит?

Именованием адаптеров и других устройств ранее занималось ядро и последовательно опрашивая все шины и слоты, давало имена устройствам. Так если, в слоте pci0, адаптер всегда будет иметь номер ниже, чем в pci1. Эта привязка работала жёстко. Сейчас процессом привязки занимается система udev. Алгоритм таков: ядро обнаруживает устройство, udev применяет к нему параметры работы и разрешения. Эти параметры udev выставляет на основе своих конфигурационных файлов или автоматом, на основе предопределённых параметров в централизованной базе данных устройств.

Конкрентно к сетевым адаптерам, udev производит именование на основе информации в файле /etc/udev/rules.d/70-persistent-net.rules Алгоритм примерно таков:

  1. Включение машины.
  2. Опрос pci0. MAC-адрес карты есть в конфиге?
    1. Если "Да" - применить указанное в конфиге имя.
    2. Если "Нет" - присвоить первое свободное имя и занести эту конфигурацию в файл.
  3. Опрос следующего слота и аналогичная проверка.

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

Рассмотрим как это работает на реальном примере.

Пример

Дано: в машине физически заменён сетевой адаптер, но его имя стало вместо eth1 - eth2
Надо: изменить имя заменённого адаптера обратно на eth1
Решение:

Способ 1

Если очерёдность первоначального именования совпадает с физическим расположением карт на материнской плате, так если в слоте pci0 установлен адаптер eth0 , в pci1 - eth1 и так далее, то можно поступить следующим образом:

  1. Загружается машина с заменённым адаптером.
  2. Файловым менеджером или другим способом удаляем файл /etc/udev/rules.d/70-persistent-net.rules
  3. Перезагружаем машину.

udev, последовательным опросом, проименует адаптеры по порядку следования и создаст файл с правильными правилами.

Способ 2

Если очерёдность первоначального именования не совпадает с физическим расположением, нужно модифицировать сам конфигурационный файл и привязать мак-адрес адаптера к его имени.
1. Загружается машина с заменённым адаптером.
2. Выполняется поиск всех мак-адресов адаптеров:

 $ dmesg |grep eth 

Вывод команды:

[    1.234142] skge eth0: addr 00:1e:58:99:f1:9a
[    1.311654] eth1: RealTek RTL8139 at 0xde00, 00:e0:4c:00:3a:4c, IRQ 22
[   10.306774] skge eth0: enabling interface
[   10.310269] ADDRCONF(NETDEV_UP): eth0: link is not ready
[   10.310322] skge eth0: disabling interface
[   10.312125] skge eth0: enabling interface
[   10.558136] eth1: link up, 100Mbps, full-duplex, lpa 0x45E1

Видно что ядро увидело 2 адаптера с мак-адресами 00:1e:58:99:f1:9a и 00:e0:4c:00:3a:4c. Дополнительно можно удостовериться где какой адаптер, вскрыв корпус машины и визуально рассмотреть мак-адреса на наклейках. Ещё один вариант - применить команду:

 $ lspci 

- она выведет список всех устройств на шине.

3. Открываем в редакторе файл /etc/udev/rules.d/70-persistent-net.rules и находим строки, где указаны эти мак-адреса.

# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# PCI device 0x1186:0x4b01 (skge)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:1e:58:99:f1:9a", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x10ec:0x8168 (r8169)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="90:fb:a6:6b:e1:52", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

# PCI device 0x10ec:0x8139 (8139too)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:e0:4c:00:3a:4c", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2"

4. Анализируем строки и видим, что последняя запись с маком "00:e0:4c:00:3a:4c" имеет имя NAME="eth2". Для того, чтобы адаптер с этим мак-адресом именовался как eth1, нужно убрать старое правило для этого имени и вместо eth2 поставить eth1. Примерно так:

# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# PCI device 0x1186:0x4b01 (skge)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:1e:58:99:f1:9a", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x10ec:0x8139 (8139too)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:e0:4c:00:3a:4c", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

Очень важно, чтобы в конфиге не было правил, с одинаковыми параметрами привязки (имена, мак-адреса). udev конечно же это обработает, но может быть и так, что имена поменяются местами ;-).

5. Перезагружаем машину и командой ifconfig проверяем правильность привязки имени к нужному интерфейсу. На этом процесс завершён. Если именование прошло не так как нужно - проверьте правильность реального мак-адреса адаптера и указанного в правиле udev.

Этим методом можно изменять именование в любых дистрибутивах Linuх, где udev уполномочен производить именование.

Смотрите также

Печать/экспорт