Я изо всех сил пытался заставить это работать, не обращаясь за помощью. Я не могу понять это. У меня есть машина, которая имеет 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:
- Вы отключаете назначение фиксированных имен, так что непредсказуемые имена ядра используются снова. Для этого просто замаскируйте файл правил udev для политики по умолчанию: ln -s /dev /null /etc/udev/rules.d/80-net-setup-link.rules
- Вы создаете свою собственную схему именования вручную, например, называя свои интерфейсы "internet0", "dmz0" или "lan0". Для этого создайте свои собственные файлы .link в /etc /systemd /network /, которые выбирают явное имя или лучшую схему именования для одного, нескольких или всех ваших интерфейсов. Смотрите systemd.link(5) для получения дополнительной информации.
- Вы передаете 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