将可预测的网络接口名称与备用内核一起使用

几乎不断地,我使用Ubuntu内核PPA中的内核 ,或者我自己编译的内核,使用Ubuntu内核配置。

问题是当我使用stock内核时,它似乎默认使用可预测的网络接口名称(即“p4p1”),但是当我使用任何备用内核时,它似乎默认使用旧方法(即“eth0”)。

虽然与这个问题不太相关,但我的测试计算机上出现了硬盘故障,我正在安装新的Ubuntu Server 14.04.2。

我无法确定内核之间的区别。 我怀疑是内核配置参数,但一直无法识别哪一个。

我的问题:如何使可预测的网络接口名称在所有内核中一致地工作?

附加说明:在某处我看到禁用可预测的网络接口名称以将其添加到grub:

GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=0 biosdevname=0" 

所以,我认为相反可能会有所帮助:

 GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=1 biosdevname=1" 

但它没有任何区别。 实际上,无论设置如何,我都无法让非库存内核使用biosdevname。 而且我无法获得stock内核来生成/etc/udev/rules.d/70-persistent-net.rules文件(即使,这不是我想要的),无论net.ifnames的设置net.ifnames 。 如果我有net.ifnames=1 ,那么至少非库存内核不会生成错误的/etc/udev/rules.d/70-persistent-net.rules文件。

摘自/var/log/udev
库存内核:

 KERNEL[9.216730] add /devices/pci0000:00/0000:00:1c.4/0000:03:00.0/net/p4p1 (net) ACTION=add DEVPATH=/devices/pci0000:00/0000:00:1c.4/0000:03:00.0/net/p4p1 IFINDEX=2 INTERFACE=p4p1 SEQNUM=1945 SUBSYSTEM=net ... UDEV [9.241073] add /devices/pci0000:00/0000:00:1c.4/0000:03:00.0/net/p4p1 (net) ACTION=add DEVPATH=/devices/pci0000:00/0000:00:1c.4/0000:03:00.0/net/p4p1 ID_BUS=pci ID_MODEL_FROM_DATABASE=P8P67 and other motherboards ID_MODEL_ID=0x8168 ID_NET_NAME_MAC=enxf46d04652d8e ID_NET_NAME_PATH=enp3s0 ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC. ID_PCI_CLASS_FROM_DATABASE=Network controller ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller ID_VENDOR_FROM_DATABASE=Realtek Semiconductor Co., Ltd. ID_VENDOR_ID=0x10ec IFINDEX=2 INTERFACE=p4p1 

来自Ubuntu PPA内核4.1RC5:

 KERNEL[10.772566] add /devices/pci0000:00/0000:00:1c.4/0000:03:00.0/net/eth0 (net) ACTION=add DEVPATH=/devices/pci0000:00/0000:00:1c.4/0000:03:00.0/net/eth0 IFINDEX=2 INTERFACE=eth0 SEQNUM=1962 SUBSYSTEM=net ... UDEV [11.185866] add /devices/pci0000:00/0000:00:1c.4/0000:03:00.0/net/eth0 (net) ACTION=add DEVPATH=/devices/pci0000:00/0000:00:1c.4/0000:03:00.0/net/eth0 ID_BUS=pci ID_MODEL_FROM_DATABASE=P8P67 and other motherboards ID_MODEL_ID=0x8168 ID_NET_NAME_MAC=enxf46d04652d8e ID_NET_NAME_PATH=enp3s0 ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC. ID_PCI_CLASS_FROM_DATABASE=Network controller ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller ID_VENDOR_FROM_DATABASE=Realtek Semiconductor Co., Ltd. ID_VENDOR_ID=0x10ec IFINDEX=2 INTERFACE=eth0 SEQNUM=1962 SUBSYSTEM=net USEC_INITIALIZED=3227 

注意:我暂时通过允许创建/etc/udev/rules.d/70-persistent-net.rules文件,然后编辑它以获取正确的设备名称来解决此问题。 最终,我想摆脱文件。

你需要区分三件事:

  • 可预测的接口名称
  • biosdevname
  • 70-persistent.rules udev规则

您可以选择使用其中一种解决方案,但不要同时使用2或3。 (事实上​​,你可以但是一个会优先并掩盖其他人)

对当前情况的一个很好的介绍是ubuntu dev邮件列表上的post

可预测的接口名称

自从/lib/udev/rules.d/80-net-setup-link.rules中生成/lib/udev/rules.d/80-net-setup-link.rules以来, 可预测的接口名称是一个udevd的东西

systemd默认使用新的可预测接口名称。 但是 ,除非上游系统,在Ubuntu中,您必须使用net.ifnames=1选择加入

您正在运行的内核版本无关紧要 。 但您需要使用内核命令行通过更改grub配置/etc/default/grub来配置它,如:

 GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=1" 

并运行

 sudo update-grub 

在14.04或14.10中,如果没有systemd,它应该足以删除70-persitent-net.rules,如下面的注释中所述。

Biosdevname

biosdevname是dell尝试解决类似问题而不是systemd中可预测的接口名称。 它是ubuntu服务器上的默认设置。 您可以通过安装包biosdevname来拥有它

 sudo apt-get install biosdevname 

注意

您可以在grub config中使用内核命令行来禁用它:

 GRUB_CMDLINE_LINUX_DEFAULT="biosdevname=0" 

并运行

 sudo update-grub 

或者只是卸载包。

 sudo apt-get purge biosdevname sudo update-initramfs -u 

udev规则

这是Ubuntu桌面上的默认设置。 udev规则/lib/udev/rules.d/75-persistent-net-generator.rules在第一次启动时创建一个自定义规则/etc/udev/rules.d/70-persistent-net.rules其中包含您的MAC地址接口获取接口的持久名称。

注意

如果您已经在使用udev规则,则需要删除/etc/udev/rules.d/70-persistent-net.rules并避免在每次启动时重新生成需要运行的规则

 sudo ln -s /dev/null /etc/udev/rules.d/75-persistent-net-generator.rules 

之后,如果您使用systemd ,那么您需要选择加入可预测的接口名称,如上所述。

  1. 在Ubuntu Server 16.04LTS中,我所做的就是运行:

     ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules 
  2. 然后使用创建文件

     sudo vi /etc/systemd/network/10-internet.link 

    并添加以下内容

     [Match] Path=pci-0000:(your device mac address) [Link] Name=eth0 (or whatever you want to name it) 

    :wq保存文件

  3. 然后重新启动并调整/etc/network/interfaces文件..然后重新启动

希望这有助于某人