個人博客:點擊這里進入
一.問題描述
公司有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/sysconfig
cp grub /home/grub.bak
sed -i "s/ net.ifnames=0/ /g" grub
sed -i "s/ biosdevname=0/ /g" grub
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
cd /boot/efi/EFI/redhat/
cp grub.cfg /home/grub.cfg.bak
sed -i "s/ net.ifnames=0/ /g" grub.cfg
sed -i "s/ biosdevname=0/ /g" grub.cfg
sleep 5
sync
sync
sync
reboot
#! /bin/bash
# 中標麒麟還原腳本
cd /etc/sysconfig/network-scripts/
mv ifcfg- bak/
mv ifcfg-eth* bak/
mv ifcfg-bond0 bak/
cd /etc/sysconfig
cp grub /home/grub.bak
sed -i "s/net.ifnames=0/ /g" grub
sed -i "s/biosdevname=0/ /g" grub
grub2-mkconfig -o /boot/efi/EFI/neokylin/grub.cfg
cd /boot/efi/EFI/neokylin/
cp grub.cfg /home/grub.cfg.bak
sed -i "s/ net.ifnames=0/ /g" grub.cfg
sed -i "s/ biosdevname=0/ /g" grub.cfg
sleep 5
sync
sync
sync
reboot