linux系統操作系統網卡漂移解決方案及問題原因


個人博客:點擊這里進入

一.問題描述

公司有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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM