3

Я изо всех сил пытался заставить это работать, не обращаясь за помощью. Я не могу понять это. У меня есть машина, которая имеет 6 портов Ethernet. Я хочу, чтобы они были последовательно названы от eth0 до eth5, как это было в CentOS 6.5.

В CentOS 6.5 мы использовали следующие правила udev с использованием адреса PCI, чтобы точно указать, какие имена присваиваются каждому интерфейсу:

    ACTION=="add", SUBSYSTEM=="net", IMPORT{program}="/lib/udev/rename_device"                                           
KERNEL=="eth?", ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:00:19.0", NAME="eth0"                         
KERNEL=="eth?", ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:08:00.0", NAME="eth1"                         
KERNEL=="eth?", ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:07:00.0", NAME="eth5"                         
KERNEL=="eth?", ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:06:00.0", NAME="eth4"                         
KERNEL=="eth?", ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:05:00.0", NAME="eth3"                         
KERNEL=="eth?", ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:04:00.0", NAME="eth2"                         
SUBSYSTEM=="net", RUN+="/etc/sysconfig/network-scripts/net.hotplug"

Сейчас я использую CentOS 7.1 с ядром версии 3.10.0-229.20.1.el7.x86_64. Systemd теперь работает на этой машине. Systemd/udev использует новый постоянный и предсказуемый метод именования для сетевых устройств.

Я перепробовал все предложения, представленные на этом сайте: http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/ Это официальная документация для новой схемы именования устройств systemd/udev.

Внизу этой страницы перечислены 3 способа отключения новой схемы именования systemd/udev:

  1. Вы отключаете назначение фиксированных имен, так что непредсказуемые имена ядра используются снова. Для этого просто замаскируйте файл правил udev для политики по умолчанию: ln -s /dev /null /etc/udev/rules.d/80-net-setup-link.rules
  2. Вы создаете свою собственную схему именования вручную, например, называя свои интерфейсы "internet0", "dmz0" или "lan0". Для этого создайте свои собственные файлы .link в /etc /systemd /network /, которые выбирают явное имя или лучшую схему именования для одного, нескольких или всех ваших интерфейсов. Смотрите systemd.link(5) для получения дополнительной информации.
  3. Вы передаете net.ifnames = 0 в командной строке ядра

Я перепробовал все три метода и до сих пор не могу заставить его работать правильно.

Когда я пробую вариант 1, я все еще получаю имена интерфейса enp0s25 ... enp4.

Когда я пробую вариант 2, я также получаю новые имена интерфейсов.

Вариант 3 приближает меня, но все еще не достаточно близко. Когда я пробую третий вариант, добавив net.ifnames = 0 к команде ядра при загрузке, я получаю свой eth0 через интерфейсы eth5. Это хорошо, но они автоматически называются ядром и игнорируют мои правила udev; Файл 60-net.rules или файл 70-persistent-net.rules (есть противоречивая информация о том, как должен называться этот файл), файлы находятся в /etc/udev/rules.d.

Мои файлы 60-net.rules и мои 70-persistent-net.rules показаны одинаково:

-bash-4.2# cat 70-persistent-net.rules                                                                               
ACTION=="add", SUBSYSTEM=="net", IMPORT{program}="/lib/udev/rename_device"                                           
ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:00:19.0", NAME="eth0"                                         
ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:04:00.0", NAME="eth2"                                         
ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:05:00.0", NAME="eth3"                                         
ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:06:00.0", NAME="eth4"                                         
ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:07:00.0", NAME="eth5"                                         
ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:08:00.0", NAME="eth1" 

Вот некоторые результаты, показывающие, как моя машина собрана:

lspci | grep Ethernet                                                                                  
00:19.0 Ethernet controller: Intel Corporation 82567LM Gigabit Network Connection (rev 03)                           
04:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection                                     
05:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection                                     
06:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection                                     
07:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection                                     
08:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection

-bash-4.2# dmesg | grep eth                                                                                          
[    6.978275] e1000e 0000:00:19.0 eth0: (PCI Express:2.5GT/s:Width x1) 00:01:05:0f:2a:a0                            
[    6.986168] e1000e 0000:00:19.0 eth0: Intel(R) PRO/1000 Network Connection                                        
[    6.993044] e1000e 0000:00:19.0 eth0: MAC: 7, PHY: 8, PBA No: FFFFFF-0FF                                          
[    7.127337] e1000e 0000:04:00.0  ready                                                                            
[  478.016884] e1000e: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx                                
[  478.024566] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready                                               
[  660.262275] e1000e: eth0 NIC Link is Down                                                                         
[  660.419098] e1000e: eth1 NIC Link is Down                                                                         
[  666.229161] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready                                                    
[  666.404529] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready                                                    
[  668.474872] e1000e: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx                                
[  668.482553] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready                                               
[  738.547269] e1000e: eth0 NIC Link is Down                                                                         
[  738.704105] e1000e: eth1 NIC Link is Down                                                                         
[  749.018153] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready                                                    
[  749.195650] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready                                                    
[  751.264876] e1000e: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx                                
[  751.272556] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready                                               
[ 1003.295095] e1000e: eth1 NIC Link is Down                                                                         
[ 1010.842662] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready                                                    
[ 1555.995276] e1000e: eth0 NIC Link is Down                                                                         
[ 1556.153100] e1000e: eth1 NIC Link is Down                                                                         
[ 1562.076158] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready                                                    
[ 1562.267653] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready                                                    
[ 1564.817867] e1000e: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx                                
[ 1564.825549] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready                                               
[ 2349.926276] e1000e: eth0 NIC Link is Down                                                                         
[ 2350.083101] e1000e: eth1 NIC Link is Down                                                                         
[ 2356.570139] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready                                                    
[ 2356.754645] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready                                                    
[ 2358.743867] e1000e: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx                                
[ 2358.751548] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready                                               
[ 2535.460274] e1000e: eth0 NIC Link is Down                                                                         
[ 2535.617098] e1000e: eth1 NIC Link is Down                                                                         
[ 2541.570159] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready                                                    
[ 2541.756655] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready                                                    
[ 2544.019877] e1000e: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx                                
[ 2544.027562] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready   

В качестве примера вы можете видеть из моих пользовательских правил udev, что я хочу, чтобы eth1 был специально назначен интерфейсу по адресу PCI 0000:08:00.0. Но здесь вы можете видеть, что он на самом деле назначается интерфейсу в 0000:04:00.0 с таким выводом:

-bash-4.2# ethtool -i eth1                                                                                           
driver: e1000e                                                                                                       
version: 3.2.4.2-NAPI                                                                                                
firmware-version: 1.6-0                                                                                              
bus-info: 0000:04:00.0                                                                                               
supports-statistics: yes                                                                                             
supports-test: yes                                                                                                   
supports-eeprom-access: yes                                                                                          
supports-register-dump: yes                                                                                          
supports-priv-flags: no

Вот список моего каталога /etc/udev/rules.d:

-bash-4.2# ls -l                                                                                                     
total 12                                                                                                             
-rw-r----- 1 root root 633 May 10 00:29 60-net.rules                                                                 
-rw-r--r-- 1 root root 537 Dec 21  2015 70-persistent-net.rules                                                      
lrwxrwxrwx 1 root root   9 May 10 00:44 80-net-setup-link.rules -> /dev/null                                         
-rw-r--r-- 1 root root 701 Dec 21  2015 net.rules.old

Как вы можете видеть, я также создал символическую ссылку на /dev /null для отключения схемы именования systemd /udev. Но это, похоже, ничего не делает для меня.

Я также попытался отредактировать файл 60-net.rules, найденный в /usr/lib/udev/rules.d, но это тоже ничего не дает.

В /etc /sysconfig /network-scripts у меня были ifcfg-eth0 и ifcfg-eth1, но я переименовал их в ifcfg-ethx и ifcfg-ethx1, чтобы они также не мешали.

Каждый раз, когда я делаю изменения в любом из файлов, я выполняю следующие команды, чтобы применить изменения:

udevadm control --reload-rules
modprobe e1000e
systemctl stop network
systemctl start network

Это не похоже на работу или применение каких-либо изменений, которые я делаю.

Я перепробовал все, что мог, и просто не могу этого получить. Я в отчаянии в этот момент. Любые предложения будут огромными.

Вот дополнительная информация:

-bash-4.2# udevadm info /sys/class/net/eth1                                                                          
P: /devices/pci0000:00/0000:00:1c.3/0000:02:00.0/0000:03:01.0/0000:04:00.0/net/eth1                                  
E: DEVPATH=/devices/pci0000:00/0000:00:1c.3/0000:02:00.0/0000:03:01.0/0000:04:00.0/net/eth1                          
E: ID_BUS=pci                                                                                                        
E: ID_MODEL_FROM_DATABASE=82574L Gigabit Network Connection                                                          
E: ID_MODEL_ID=0x10d3                                                                                                
E: ID_NET_NAME_MAC=enx003059081853                                                                                   
E: ID_NET_NAME_PATH=enp4s0                                                                                           
E: ID_OUI_FROM_DATABASE=KONTRON COMPACT COMPUTERS AG                                                                 
E: ID_PCI_CLASS_FROM_DATABASE=Network controller                                                                     
E: ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller                                                                 
E: ID_VENDOR_FROM_DATABASE=Intel Corporation                                                                         
E: ID_VENDOR_ID=0x8086                                                                                               
E: IFINDEX=5                                                                                                         
E: INTERFACE=eth1                                                                                                    
E: SUBSYSTEM=net                                                                                                     
E: SYSTEMD_ALIAS=/sys/subsystem/net/devices/eth1                                                                     
E: TAGS=:systemd:                                                                                                    
E: USEC_INITIALIZED=27130                                                                                            
E: net.ifnames=0

В этих выходных данных видно, что eth1 по-прежнему назначается интерфейсу, расположенному по адресу PCI 0000:04:00.0, и файлы .link также не используются, так как не показано свойство ID_NET_LINK_FILE.

Вот пример того, как мой файл 10-eth1.link выглядит в /etc /systemd /network.

-bash-4.2# cat 10-eth1.link                                                                                          
[Match]                                                                                                              
OriginalName=enp4s0                                                                                                  
Path=pci-0000:08:00.0-*                                                                                              
Driver=e1000e                                                                                                        

[Link]                                                                                                               
Name=eth1           

1 ответ1

1

Я не эксперт здесь, но, возможно, некоторая информация лучше, чем ничего.

Насколько я понимаю, это невозможно, используя стандартную инфраструктуру udev. Документация Red Hat по адресу https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/networking_guide/sec-trou Исправление_network_device_naming, кажется, согласна:

Использование имен ethX работает правильно для следующих сценариев:

  • Система имеет только один сетевой интерфейс.
  • При использовании для сетевых карт virtio в гостях на виртуальной машине Red Hat Enterprise Linux 7. [...]

В основном вот что происходит, когда ваша система загружается:

  1. Ядро назначает имена интерфейсов eth0 - eth N.
  2. Позднее правила udev используются для переименования этих интерфейсов из eth X в нужные имена.

Когда правила в шаге 2 пытаются переименовать в eth X имена, где X <= N, вы, вероятно, получите ошибки из-за конфликтов имен. Вот ошибка конфликта имен, которую я получил в другой ситуации, когда BIOS, кажется, указывает, что два из моих интерфейсов должны иметь одинаковое имя:

systemd-udevd: could not rename interface '6' from 'eth0' to 'enp4s0': File exists

Я вполне уверен, что вы можете называть свои интерфейсы как угодно, кроме eth0 через eth N. Например, если у вас есть инструменты, которые настаивают на префиксах "eth" в именах интерфейсов, если у вас нет безумно большого количества интерфейсов, "eth100", "eth101" и т.д. Должны быть безопасными.

Возможно, в качестве обходного пути можно было бы сделать так, чтобы udev переименовал все интерфейсы в имена, подобные "other_eth0", а затем имел бы службу, которая запаздывает при запуске системы, которая переименовывает все интерфейсы с префиксами "other_", чтобы удалить эти префиксы, хотя и не с моей Я понятия не имею, как сделать переименование интерфейса вне правил udev.

Я удивлен, что вы успешно применили эти правила в CentOS 6, так как у меня были похожие проблемы в CentOS 6, где интерфейсам не могли быть назначены их правильные имена, и им были бы присвоены имена, такие как "rename2" или что-то в этом роде. Я использовал решение "eth100", "eth101" и т.д. На CentOS 6.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .