银河麒麟高级服务器操作系统V10SP2(X86)cloud-init组件导致eth0网卡重命名失败问题处理
前言:在grub中添加biosdevname=0 net.ifnames=0,将网卡ensxxx或者enpxxx等网卡重命名为eth0,重启系统之后不生效问题。以下抒写的文档是用银河麒麟V10 SP2 X86架构进行分析处理。该问题不是出现在某个系统版本上,只要安装了cloud-init都会出现。
一 基本信息
1.1 系统版本
############## Kylin Linux Version #################
Release:
Kylin Linux Advanced Server release V10 (Sword)
Kernel:
4.19.90-25.31.v2101.ky10.x86_64
Build:
Kylin Linux Advanced Server
release V10 (SP2) /(Sword)-x86_64-Build09/20210524
#################################################
1.2 cloud-init版本
rpm -qa | grep cloud-init
cloud-init-19.4-6.p05.ky10.noarch
二 排查过程
2.1 排查messages日志和dmesg日志
(1)dmesg | grep eth0
[ 5.92788] virtio_net virtio0 enp1s0: renamed form eth0
#dmesg中发现网卡名已经将enp1s0改成了eth0了
(2) cat /var/log/messages | grep eth0
systend-udevd[346]: eth0: Network interface 2 is renamed fron 'eth0’ to 'enp1s0'
kernel: [3.651584] virtio_net virtio0 enp1s0: renaned from etho
systemd-udevd[332]: eth0: Network interface 2 is renaned fron 'etho’ to 'enp1s0'
kernel: [4.254616] virtio_net virtio0 enp1s0: renamed from eth0
systemd-udevd[318]: eth0: Network interface 2 is renamed from 'etho’ to 'enp1s0'
kernel: [2.446198] virtio_net virtio0 enp1s0: renaned fron eth0
systend-udevd[301]: eth0: Network interface 2 is renamed from 'eth0’ to 'enp1s0'
kernel: [5.927988] virtio_net virtio0 enp1s0: renaned from eth0
systend-udevd[5931: eth0: Network interface 2 is renamed from 'eth0' to "enp1s0'
#messages中systemd-udevd发现网卡名又将eth0改为enp1s0了
2.2 查看udev规则
在做了诸多场景的问题复现之后,发现了是系统中有udev规则导致的,udev规则文件是自行生成的,而不是手动创建的。
具体文件路径:
/etc/udev/rules.d/70-persistent-net.rules
2.3 查看cloud-init组件中涉及的udev文件
[root@localhost ~]# grep -nr "70-persistent-net.rules" /usr/
匹配到二进制文件 /usr/lib/python3.7/site-packages/cloudinit/net/__pycache__/eni.cpython-37.opt-1.pyc
匹配到二进制文件 /usr/lib/python3.7/site-packages/cloudinit/net/__pycache__/eni.cpython-37.pyc
匹配到二进制文件 /usr/lib/python3.7/site-packages/cloudinit/net/__pycache__/sysconfig.cpython-37.opt-1.pyc
匹配到二进制文件 /usr/lib/python3.7/site-packages/cloudinit/net/__pycache__/sysconfig.cpython-37.pyc
/usr/lib/python3.7/site-packages/cloudinit/net/eni.py:347: 'netrules_path', 'etc/udev/rules.d/70-persistent-net.rules')
/usr/lib/python3.7/site-packages/cloudinit/net/sysconfig.py:312: 'netrules_path', 'etc/udev/rules.d/70-persistent-net.rules')
/usr/lib/dracut/modules.d/95udev-rules/module-setup.sh:59: [[ $hostonly ]] && inst_rules 70-persistent-net.rules
下面是查到涉及70-persistent-net.rules的文件
/usr/lib/python3.7/site-packages/cloudinit/net/eni.py
/usr/lib/python3.7/site-packages/cloudinit/net/sysconfig.py
2.4 解决方法
(1)grub引导中添加biosdevname=0 net.ifnames=0参数
/etc/default/grub GRUB_COMLINE_LINUX尾行添加biosdevname=0 net.ifnames=0
(2)更新grub.cfg文件
[ -d /sys/firmware/efi ] && echo UEFI || echo BIOS
BIOS
#如果输出是UEFI则表示是UEFI启动
#如果输出是BIOS则表示是传统的Legacy BIOS启动
传统的Legacy BIOS启动文件路径:
/boot/grub2/grub.cfg
UEFI启动文件路径:
/boot/efi/EFI/kylin/grub.cfg
UEFI引导执行:grub2-mkconfig -o /boot/efi/EFI/kylin/grub.cfg
Legacy启动执行:grub2-mkconfig -o /boot/grub2/grub.cfg
下面是修改之后的grub文件和执行grub2-mkconfig命令的输出:
(3)关闭cloud-init的网络接管
/etc/cloud/cloud.cfg配置文件尾行添加:
network:
config: disabled
#有缩进问题,写的时候要注意下
下面是修改完成之后的示例:
(4)删除70-persistent-net.rules
rm -f /etc/udev/rules.d/70-persistent-net.rules
(5)检查initramfs-xxx.img文件中有没有70-persistent-net.rules
initramfs 是 “initial ram file system”(初始RAM文件系统)的缩写。它是一个临时的文件系统,通常在引导过程中被加载到内存中,以帮助系统初始化硬件、加载必要的驱动程序和其他必要的功能,以便系统能够继续加载真正的根文件系统。
这个文件在/boot下 xxx代表的是具体的内核版本,例如完整的文件名称为:initramfs-4.19.90-25.31.v2101.ky10.aarch64.img
lsinitrd /boot/initramfs-$(uname -r).img | grep rules.d | grep 70-persistent-net.rules
如果执行lsinitrd可以筛选到,需要更新initramfs-xxx.img,更新之前确保/etc/udev/rules.d/70-persistent-net.rules文件被删除
更新命令如下:
dracut -f
(6)删除网卡配置文件
ifcfg-ens3(配置文件名称根据实际情况修改,ens3只是示例)
rm -f /etc/sysconfig/network-scripts/ifcfg-ens3
(7)重启测试
reboot