我有两个server
系统,一个运行Debian Stretch
,另一个运行Ubuntu 17.10
,它们都有两个网络适配器,配置方式如下(/etc/network/interfaces
):
auto lo
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet static
address 192.168.2.x
netmask 255.255.255.0
network 192.168.2.0
broadcast 192.168.2.255
gateway 192.168.2.1
dns-nameservers 8.8.8.8
allow-hotplug eth1
iface eth1 inet dhcp
此外,两个系统上的初始 RAM 磁盘具有相同的 IP 地址(是的,我使用“老式”接口名称),配置为(/etc/default/grub
):
GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=0 biosdevname=0"
GRUB_CMDLINE_LINUX="ip=192.168.2.x::192.168.2.1:255.255.255.0:whatever:eth0:off"
在这两个系统上,第一个适配器始终连接到本地网络,而第二个适配器几乎从不连接任何东西,但偶尔用于测试网络设备。
有时(1/10 次)会发生的情况是,重新启动后,适配器名称会交换位置,并且突然eth1
拥有重新启动之前MAC
的地址eth0
和获取DHCP
的地址。 这也发生在初始 RAM 磁盘中。
现在,Debian Jesse
两者Ubuntu 16.04 LTS
都/etc/udev/rules.d/70-persistent-net.rules
清楚地说明了哪个MAC
属于哪个接口名称。我的系统上不存在此文件,我从未从这两个系统中删除过任何软件包或删除过该文件。我尝试使用以下命令重新创建该文件:
udevadm trigger --type=devices --action=change
udevadm trigger --subsystem-match=net --action=add
udevadm control --reload-rules
重启后,文件不存在,适配器有时仍会换位置。任何关于如何解决这个烦人问题的提示或想法都将不胜感激。
答案1
网络接口在启动时被探测,并且这种探测的结果不可预测。接口名称按找到的顺序分配,但不幸的是,这不是确定性的。这正是“老式”接口名称的问题,可预测的网络接口名称正在尝试解决。
您还可以“手动”创建 udev 规则文件,将 MAC 地址映射到接口名称,例如:
/etc/udev/rules.d/70-network.rules
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="net1"
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="ff:ee:dd:cc:bb:aa", NAME="net0"
请注意,交换的不是 MAC 地址,而是接口名称。MAC 地址(通常)固定在硬件上。您的情况是,名称为“eth0”的物理接口有时会被命名为“eth1”,这意味着您的静态网络配置应用于错误的端口。