一.问题描述

公司有100-150台服务器安装RHEL7.4&中标麒麟7.4系统,为方便编辑配置网卡,使用脚本方式配置为biosname=0,ifname=0,目的是为将en1o2p此类长字符网卡名称规范为传统的eth*,使用传统的网卡识别方式,但安装完成后配置IP,BOND双网卡存在网络漂移现象,现象即重启网卡后所有网口均发生变化导致网络不通

二.原理说明

  • 在/usr/lib/udev/rules.d/60-net.rules中有一条规则指示udev助手实用程序/lib/udev/rename_device查看所有的/etc/sysconfig/network-scripts/ifcfg后缀文件。如果它发现一个带有HWADDR条目的ifcfg文件与一个接口的MAC地址匹配,它将该接口重命名为DEVICE指令在ifcfg文件中给出的名称。
  • 在/usr/lib/udev/rules.d/71-biosdevname.rules中指示biosdevname根据其命名策略重命名接口, 前提是在前面的步骤中没有重命名接口,安装了biosdevname,并且在引导命令行上没有将biosdevname =0作为内核命令给出。
  • 在/lib/udev/rules.d/75-net-description.rules中的规则指示udev通过检查网络接口设备来填充 内部udev设备属性值id_net_name_board、ID_NET_NAME_SLOT、ID_NET_NAME_PATH、ID_NET_NAME_MAC 。注意,有些设备属性可能是未定义的。
  • 在/usr/lib/udev/rules.d/80-net-name-slot.rules中有一条规则指示udev重命名接口(前提是在 第1步或第2步中没有重命名接口)和内核参数net。根据以下优先级:id_net_name_board、ID_NET_NAME _SLOT、ID_NET_NAME_PATH,没有指定ifnames=0。如果其中一个未设置,则它将进入列表中的下一个。 如果没有设置这些参数,则不会重命名接口。
    步骤2实际执行的是biosdevname的policy 步骤3和4实际执行的是Scheme1、2、3

三.处理步骤

由于在实际场景中,使用的是biosdevname=0 ifname=0的配置,实际影响的文件为在/usr/lib/udev/rules.d/60-net.rules文件,随即在该配置文件中使用了以下设置:

在使用此设置后,RHEL7.4系统问题彻底解决,经过近20次左右的测试,网口不会漂移。但是在中标麒麟7.4系统中,使用次配置后在网口状态不变的情况下不会发生任何漂移,但是如果随机拔掉其中一个网口,所有的网口会全部变化
随后用udevadm test命令进行测试,此命令可以根据网卡名回溯是哪条策略生效,从输出结果看RHEL7.4&中标麒麟7.4系统全部显示60-rules规则已经生效,但是在中标麒麟中仍然存在漂移问题。 经过文档查询,和进一步替换测试,基本可确定此问题为系统差异导致

四.解决方案

在使用systemd的命名规则时候,网卡名类似en1o2p3,此种命令可以准确的指出网卡来自主板上的哪一个pci槽位哪一条总线,以及具体的口。Systemd的命名方式虽然可读性差,但是本身就是为了解决此问题而做出的改变,建议同一为systemd方式使用长格式网卡名。
还原脚本如下:

#! /bin/bash#  redhat还原脚本cd /etc/sysconfig/network-scripts/mv ifcfg- bak/mv ifcfg-eth* bak/mv ifcfg-bond0 bak/cd /etc/sysconfigcp grub  /home/grub.baksed -i "s/ net.ifnames=0/ /g" grubsed -i "s/ biosdevname=0/ /g" grubgrub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfgcd /boot/efi/EFI/redhat/cp grub.cfg /home/grub.cfg.baksed -i "s/ net.ifnames=0/ /g" grub.cfgsed -i "s/ biosdevname=0/ /g" grub.cfgsleep 5syncsyncsyncreboot
#! /bin/bash# 中标麒麟还原脚本cd /etc/sysconfig/network-scripts/mv ifcfg- bak/mv ifcfg-eth* bak/mv ifcfg-bond0 bak/cd /etc/sysconfigcp grub  /home/grub.baksed -i "s/net.ifnames=0/ /g" grubsed -i "s/biosdevname=0/ /g" grubgrub2-mkconfig -o /boot/efi/EFI/neokylin/grub.cfgcd /boot/efi/EFI/neokylin/cp grub.cfg /home/grub.cfg.baksed -i "s/ net.ifnames=0/ /g" grub.cfgsed -i "s/ biosdevname=0/ /g" grub.cfgsleep 5syncsyncsyncreboot

转载请标明出处:
1.博客中标注原创的文章,版权归原作者 heardic 所有;
2.未经原作者允许不得转载本文内容,否则将视为侵权;
3.转载或者引用本文内容请注明来源及原作者;
4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。

©著作权归作者所有:来自51CTO博客作者heardic的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. [Linux] 总结各系统 双网卡绑定
  2. 获取网卡名称 linux c
  3. 查看Linux服务器网卡流量小脚本shell和Python各一例
  4. linux网卡实现高可用:team链路聚合
  5. linux 判定那块网卡为eth0
  6. 多队列网卡CPU中断均衡
  7. Linux基础之无线网卡配置连接测试相关操作
  8. 如何为UDP组播设置一个套接字,并提供两个网卡?
  9. vmware克隆Centos6.4虚拟机网卡无法启动问题

随机推荐

  1. 学习Android从0开始之背景篇-Android系统
  2. 【百度网盘】老罗android开发视频教程[压
  3. Android SDK安装时出错“android Failed
  4. android源码学习之animation1
  5. EditText使用属性详解
  6. Android相对布局RelativeLayout各属性介
  7. .Net 转战 Android 4.4 日常笔记目录
  8. Android:控件样式触发
  9. Android中的六大布局
  10. Android中TextView中加图片,超链接,部分字