在备用内核中使用可预测的网络接口名称

Dou*_*ies 14 kernel networking udev 14.04

我几乎经常使用来自Ubuntu 内核 PPA内核,或者我自己编译的内核,使用 Ubuntu 内核配置。

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

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

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

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

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

GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=0 biosdevname=0"
Run Code Online (Sandbox Code Playgroud)

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

GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=1 biosdevname=1"
Run Code Online (Sandbox Code Playgroud)

但它没有任何区别。实际上,无论设置如何,我都无法让非库存内核使用 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
Run Code Online (Sandbox Code Playgroud)

从 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
Run Code Online (Sandbox Code Playgroud)

注意:我允许/etc/udev/rules.d/70-persistent-net.rules创建一个文件,然后编辑它以获得正确的设备名称,从而暂时解决了这个问题。最后,我想摆脱这个文件。

sol*_*iCe 38

你需要区分三件事:

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

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

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

可预测的接口名称

自 v197 生成以来,可预测的接口名称udevd 的东西/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"
Run Code Online (Sandbox Code Playgroud)

并运行

sudo update-grub
Run Code Online (Sandbox Code Playgroud)

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

生物名称

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

sudo apt-get install biosdevname
Run Code Online (Sandbox Code Playgroud)

笔记

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

GRUB_CMDLINE_LINUX_DEFAULT="biosdevname=0"
Run Code Online (Sandbox Code Playgroud)

并运行

sudo update-grub
Run Code Online (Sandbox Code Playgroud)

或者干脆卸载这个包。

sudo apt-get purge biosdevname
sudo update-initramfs -u
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

    ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后使用创建文件

    sudo vi /etc/systemd/network/10-internet.link
    
    Run Code Online (Sandbox Code Playgroud)

    并添加以下内容

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

    :wq 保存文件

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

希望这有助于某人