我几乎经常使用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
注意:我通过允许创建一个文件,然后编辑它以获得正确的设备名称,暂时解决了这个问题。最终,我想摆脱该文件。
你需要区分三件事:
您可以选择使用其中一种解决方案,但不能同时使用 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
,例如:并运行
在 14.04 或 14.10 中,没有 systemd,删除 70-persitent-net.rules 应该就足够了,如下面的注释中所述。
生物开发名称
biosdevname是戴尔尝试解决与 systemd 中的可预测接口名称类似的问题。它是ubuntu 服务器上的默认设置。你可以通过安装包来拥有它
biosdevname
笔记
您可以在 grub 配置中使用内核命令行禁用它:
并运行
或者干脆卸载软件包。
开发规则
这是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
并避免在您需要运行的每次启动时重新生成它之后,如果您使用systemd,则需要选择加入可预测的接口名称,如上所述。
在 Ubuntu Server 16.04LTS 中,我所做的只是运行:
然后使用创建文件
并添加以下内容
:wq
保存文件然后重新启动并调整您的
/etc/network/interfaces
文件..然后再次重新启动希望这对某人有帮助