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


12

几乎一直以来,我都使用Ubuntu内核PPA中内核,或者使用Ubuntu内核配置自己编译的内核。

问题是当我使用标准内核时,它似乎默认使用可预测的网络接口名称(即“ 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。而且/etc/udev/rules.d/70-persistent-net.rules,无论的设置如何,我都永远无法使库存内核生成文件(即使那不是我想要的)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创建文件,然后编辑它以获取正确的设备名称,我暂时解决了此问题。最终,我想摆脱该文件。

Answers:


34

您需要区分三件事:

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

您可以选择使用其中一种解决方案,但不能同时使用2或3。(实际上,您可以优先使用一个,而将另一个屏蔽)

ubuntu dev邮件列表上的帖子很好地介绍了当前情况

可预测的接口名称

可预测的接口名称udevd的东西,因为v197是在/lib/udev/rules.d/80-net-setup-link.rules

systemd默认使用新的可预测接口名称。但是,除非在上游使用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是解决与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
感谢您的回答。我的计算机是服务器版本,而不是台式机版本。我将对您的答案进行修改以解决差异(默认情况下已安装了biosdevname,因此需要通过grub专门将其禁用)。我认为的错误是,我期望使用net.ifnames=1和提供不同的接口名称biosdevname=0,如您提供的链接中所述,但是我得到了旧的eth0和eth1。无论如何,/etc/udev/rules.d/70-persistent-net.rules在我编辑/etc/network/interfaces以反映适当的接口名称之后,它现在适用于任何内核(不带)。
道格·史密斯

我在ubuntu 15.10桌面上,我认为 udev 不再是默认设置。我的网络设备被命名为wlp4s0enp0s31f6,并且文件/etc/udev/rules.d/70-persistent-net.rules/lib/udev/rules.d/75-persistent-net-generator.rules不存在。
乔纳森·哈特利

在Ubuntu 16.04(特别是systemd 220-7)中,75-persistent-net-generator.rules不推荐使用该文件,而推荐使用net.ifnames
200_success

4
  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文件..然后再次重新启动

希望这可以帮助某人

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.