将可预测的网络接口名称与备用内核一起使用
几乎不断地,我使用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 ,那么您需要选择加入可预测的接口名称,如上所述。
-
在Ubuntu Server 16.04LTS中,我所做的就是运行:
ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules
-
然后使用创建文件
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
保存文件 -
然后重新启动并调整
/etc/network/interfaces
文件..然后重新启动
希望这有助于某人