可预测的接口名称

可预测的接口名称

我几乎总是使用来自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
stock kernel:

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创建一个文件,然后编辑它以获取正确的设备名称。最终,我想删除该文件。

答案1

您需要区分三件事:

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

您可以选择使用以下解决方案之一但您不能同时使用 2 或 3。(事实上,您可以同时使用 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 就足够了,如下面的注释中所述。

Bios 设备名称

bios 设备名称这是戴尔试图解决与 systemd 中可预测接口名称类似的问题。它是Ubuntu 服务器。您可以通过安装包来获得它biosdevname

sudo apt-get install biosdevname

笔记

您可以使用 grub 配置中的内核命令行来禁用它:

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,那么您需要选择可预测的接口名称,如上所述。

答案2

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

希望这对某人有帮助

相关内容