可预测的网络接口名称破坏了虚拟机迁移


9

/etc/networking/interfaces使用“可预测的网络接口名称”时如何重置?

低于15.10的Ubuntu版本使用以下网络适配器名称:

  • eth0
  • eth1
  • eth2

更换网卡或将虚拟机移至新的虚拟机管理程序,将导致Linux增加接口号。删除/etc/udev/rules.d/70-peristent-net.rules将使Linux重用eth0

Ubuntu 15.10及更高版本使用“ 可预测的网络接口名称 ”。网络适​​配器名称是从mac地址派生的。

  • ens3
  • ens32
  • ens192

迁移虚拟机时,由于/etc/network/interfaces仍引用旧的不存在的网络适配器,因此网络无法启动。

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto ens32
iface ens32 inet dhcp
pre-up sleep 2

重置/ etc / network / interfaces文件的最佳方法是什么?

我需要关闭虚拟机并迁移到新的虚拟机监控程序之前执行此操作因为我正在使用打包程序根据Chef / Bento黄金映像创建自动化的黄金映像。

我发现删除/ etc / network / interfaces无效,因为迁移后该文件在下次启动时不会自动重新生成。

我尝试编辑grub文件以恢复为'eth0'的命名约定。虽然/ etc / network / interfaces确实引用了旧名称(eth0),但vm不会获得IP,并且任何重新引导都会导致vm使用新的命名约定。另外,我发现systemd将始终优先,除非我可以保证biosdevname=0 永久保留在grub config中。不确定如何永久应用

GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=0 bios.devname=0"

如果可能的话,我宁愿不使用cloud init也不使用任何启动后脚本,因为我宁愿保持黄金图像尽可能干净。

当然,这是云提供商(Azure,AWS,RackSpace,Openstack)在导入vm时已经解决的问题。我不可能是第一个使用可预测的网络接口名称尝试迁移虚拟机的人。

在关闭和迁移虚拟机之前,我尝试过运行这些命令

apt-get remove biosdevname -y;
ln -s /dev/null /etc/systemd/network/99-default.link;

我发现当我将VM迁移,即/etc/network/interfacesip address仍然会参考ens32


您是否尝试过从姐妹网站Askubuntu解决方案?askubuntu.com/a/785442/467355-基本上手动创建udev规则,并可能使用一次启动脚本在克隆之后将新的mac插入其中(或在每个克隆之后重新创建)
Dani_l

是的,我确实看到了。这些是通用的黄金映像,任何人都可以使用,所以我不知道mac地址是否提前。
spuder

这就是“使用一次性启动脚本在克隆后将新的mac插入其中(或在每个克隆之后重新创建新的mac)”的全部要点-您将新的启动脚本插入到在启动查询时插入并插入的黄金映像中正确的mac到udev规则。
Dani_l

Answers:


4

当然,这是云提供商(Azure,AWS,RackSpace,Openstack)在导入vm时已经解决的问题。

我认为OpenStack使用cloud-init,ConfigDrive格式,并提供与VM硬件匹配的网络配置。资料来源:

如果排除首次启动脚本,则有一个明显的答案。

以前,实际上可以保证配备有单个以太网卡的主机仅具有单个“ eth0”接口。有了这个新方案,管理员现在必须首先检查本地接口名称是什么,然后才能在该接口上调用命令,以前,他以前很有可能“ eth0”是正确的名称。

我不喜欢这个,如何禁用呢?

您基本上有三个选择:

  1. 您禁用固定名称的分配,以便再次使用不可预测的内核名称。为此,只需将udev的.link文件屏蔽为默认策略:ln -s / dev / null /etc/systemd/network/99-default.link

https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/

切换回旧的持久性接口名称不是记录的选项之一。

另一种选择是默认情况下启用网络接口的设置,而不管其确切名称是什么。我认为NetworkManager默认支持此功能。 也可以告诉systemd-networked这样做

只要一台虚拟机具有多个网络设备,它们可能仍需要进行特定的配置...

在VM之外,NetworkManager风格的方法有一个明显的优势:PC可能具有多个网络接口,也许是不同类型的网络接口,只有其中一个被连接。例如,可以在某些高级主板上,或者在第一个网络接口未按预期工作并且在某个时间点安装了第二个接口的系统上看到此情况。


很棒的建议。我发现这ln -s /dev/null /etc/systemd/network/99-default.link没什么关系。我的虚拟机仍使用新的命名约定。
spuder

3

我放弃尝试干净地进行此操作,并提出了以下建议。通过在关闭虚拟机并迁移之前运行以下脚本,在打开电源时,虚拟机将使用eth0作为网络适配器。

ln -s /dev/null /etc/systemd/network/99-default.link;
echo '# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet dhcp
pre-up sleep 2' > /etc/network/interfaces

sed -i.bak 's/GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=0 bios.devname=0 quiet"/' /etc/default/grub
update-grub
apt-get remove biosdevname -y || true;

严格来说,apt-get remove biosdevname这不是必需的,因为默认情况下该软件包未在ubuntu 16.04上安装。此外,增加bios.devname=0GRUB_CMDLINE_LINUX_DEFAULT是不需要的,因为没有安装biosdevname。如果将来再安装biosdevname,它的确可以防止网络中断。


为什么要设置链接传递内核参数?文档指出一个就足够了。进度检查表明确实如此。
0xC0000022L

2

您是否需要可预测的网络接口名称?

我的解决方案是卸载biosdevname,并且可靠地导致总是拥有名为eth0,eth1等的网络接口。我没有找到安装可预测的网络接口名称或biosdevname的充分理由。

/etc/udev/rules.d/70-persistent-net.rules那里,您可以修改将哪些硬件mac地址命名为eth0,eth1等。我通常会删除此文件的内容,将其另存为空白文件,然后重新启动,然后我的表盘整齐,并显示正确的网络适配器...

# This file was automatically generated by the /lib/udev/write_net_rules
# program,run by the persistent-net-generator.rules rules file.
#
# This file was automatically generated by the /lib/udev/write_net_rules
# program,run by the persistent-net-generator.rules rules file.
#
# You can modify it,as long as you keep each rule on a single
# line,and change only the value of the NAME= key.
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

^^其中xx:xx:xx:xx:xx:xx:xx是网络适配器的唯一mac地址。

我知道您提到删除此文件不是解决方案,但我发布了上面的示例,因为至少在Suse中是/lib/udev/write_net_rules创建此文件的。因此,请查看对该文件的回溯是否有帮助,如果该文件适用于您的发行版,则可以对其进行修改以解决您的问题。

请注意,这是我从Suse版本11中知道的,这是systemd之前的旧Init方式。不知道对于systemd下的最新版本的linux,这是否已更改。


biosdevname是由udev “内置” net_id所取代freedesktop.org/wiki/Software/systemd/...
sourcejedi

0

尝试将Ubuntu 14.04主机升级到16.04。biosdevname包未安装成使出"biosdevname=0 net.ifnames=0"/etc/default.grub由OP题。

我运行此脚本,如果输出看起来不错,则将输出重定向到/etc/udev/rules.d/70-persistent-net.rules以构建新的udev规则,以防内核决定以其他顺序枚举以太网端口。

#!/bin/bash
count=0

# build array of network devices starting with eth? from /proc
for dev in `cat /proc/net/dev | egrep 'eth.*:' | awk '{print $1};' | cut -d':' -f1 | sort`; do
   edev[$count]="$dev"
   let count="$count+1"
done

# use array to find mac address
for d in ${edev[@]}; do
   mac=`ip addr show "$d" | grep ether | awk '{print $2};'`
   if [ -n "$mac" ]; then
      echo "# mac for $d is $mac"
   fi 

   printf 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="%s", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="%s"\n' $mac $d
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.