Пользователи дистрибутивов Debian (а может и других дистрибутивов тоже) наверняка замечали особенность, когда именование адаптеров меняется в зависимости от их установки/удаления из аппаратной конфигурации. Например, в машине было 2 сетевых адаптера eth0 и eth1. Пользователь решил заменить адаптер eth1: отключил старый и воткнул в слот новый адаптер. В итоге этот новый адаптер стал eth2, а не eth1 как было с предыдущим адаптером. Почему так происходит?
Именованием адаптеров и других устройств ранее занималось ядро и последовательно опрашивая все шины и слоты, давало имена устройствам. Так если, в слоте pci0, адаптер всегда будет иметь номер ниже, чем в pci1. Эта привязка работала жёстко. Сейчас процессом привязки занимается система udev. Алгоритм таков: ядро обнаруживает устройство, udev применяет к нему параметры работы и разрешения. Эти параметры udev выставляет на основе своих конфигурационных файлов или автоматом, на основе предопределённых параметров в централизованной базе данных устройств.
Конкрентно к сетевым адаптерам, udev производит именование на основе информации в файле /etc/udev/rules.d/70-persistent-net.rules Алгоритм примерно таков:
- Включение машины.
- Опрос pci0. MAC-адрес карты есть в конфиге?
- Если "Да" - применить указанное в конфиге имя.
- Если "Нет" - присвоить первое свободное имя и занести эту конфигурацию в файл.
- Опрос следующего слота и аналогичная проверка.
Одна из необходимостей изменения именования - для себя, - так если определить "где какой адаптер"; вторая причина, более важная, - привязка конкретного имени к конкретному адаптеру, если к самому имени привязаны различные сетевые службы.
Рассмотрим как это работает на реальном примере.
Пример
Дано: в машине физически заменён сетевой адаптер, но его имя стало вместо eth1 - eth2
Надо: изменить имя заменённого адаптера обратно на eth1
Решение:
Способ 1
Если очерёдность первоначального именования совпадает с физическим расположением карт на материнской плате, так если в слоте pci0 установлен адаптер eth0 , в pci1 - eth1 и так далее, то можно поступить следующим образом:
- Загружается машина с заменённым адаптером.
- Файловым менеджером или другим способом удаляем файл /etc/udev/rules.d/70-persistent-net.rules
- Перезагружаем машину.
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 уполномочен производить именование.