spu*_*der 10 network-interface systemd-networkd
/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
Run Code Online (Sandbox Code Playgroud)
重置 /etc/network/interfaces 文件的最佳方法是什么?
我需要在关闭虚拟机并迁移到新的虚拟机管理程序之前执行此操作,因为我正在使用打包程序基于厨师/便当黄金映像制作自动黄金映像。
我发现删除 /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"
Run Code Online (Sandbox Code Playgroud)
如果可能,我宁愿不使用 cloud init 或使用任何启动后脚本,因为我宁愿保持黄金映像尽可能干净。
当然,这是云提供商(Azure、AWS、RackSpace、Openstack)在导入虚拟机时已经解决的问题。我不可能是第一个尝试使用可预测的网络接口名称迁移虚拟机的人。
在关闭和迁移虚拟机之前,我曾尝试运行这些命令
apt-get remove biosdevname -y;
ln -s /dev/null /etc/systemd/network/99-default.link;
Run Code Online (Sandbox Code Playgroud)
我发现当我将VM迁移,即/etc/network/interfaces
并ip address
仍然会参考ens32
我放弃了尝试干净地做到这一点,并想出了以下技巧。通过在关闭虚拟机并迁移之前运行以下脚本,虚拟机在开机时将使用 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;
Run Code Online (Sandbox Code Playgroud)
严格来说,apt-get remove biosdevname
这不是必需的,因为 ubuntu 16.04 上默认不安装该软件包。另外,由于未安装biosdevname,因此不需要添加bios.devname=0
。GRUB_CMDLINE_LINUX_DEFAULT
如果将来安装了biosdevname,它确实可以防止网络中断。