Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

RedHat Linux 網卡邏輯名稱互換 Shell 腳本:eth0 ↔ eth1 自動化重命名

編輯:Linux 教學

腳本用途

當伺服器新增/移除網卡、主機板插槽變更或虛擬機遷移導致核心偵測順序改變,原本 eth0、eth1 邏輯名稱可能與物理介面對應錯亂。本腳本自動化完成:網路介面下線、配置檔重命名、modprobe.conf 別名交換、服務重啟,實現邏輯名稱精準互換。

完整腳本內容

#!/bin/bash
# change_net.sh - 互換兩張網卡的邏輯名稱
# 用法: change_net.sh <第一張網卡編號> <第二張網卡編號>
# 例: change_net.sh 0 1  # 將 eth0 改為 eth1,eth1 改為 eth0
# 作者: Jarson (at) gmail.com
# 建立日期: 2010/08/18

set -euo pipefail

if [[ $# -ne 2 ]]; then
    echo "用法: $0 <第一張網卡編號> <第二張網卡編號>"
    exit 1
fi

NIC1=$1
NIC2=$2

echo "=== 開始互換 eth${NIC1} 與 eth${NIC2} ==="

# 1. 關閉網路介面
echo "關閉介面..."
ifdown eth${NIC1} 2>/dev/null || true
ifdown eth${NIC2} 2>/dev/null || true

# 2. 進入網路腳本目錄
cd /etc/sysconfig/network-scripts || { echo "目錄不存在"; exit 1; }

# 3. 修改配置檔內部 DEVICE 參數
sed -i -e "s/eth${NIC1}/eth${NIC2}/" ifcfg-eth${NIC1}
sed -i -e "s/eth${NIC2}/eth${NIC1}/" ifcfg-eth${NIC2}

# 4. 重命名配置檔案(利用暫存檔避免覆蓋)
mv ifcfg-eth${NIC1} ifcfg-eth${NIC2}.tmp
mv ifcfg-eth${NIC2} ifcfg-eth${NIC1}
mv ifcfg-eth${NIC2}.tmp ifcfg-eth${NIC2}

# 5. 更新 modprobe.conf 別名(驅動模組綁定)
DRIVER1=$(grep "alias eth${NIC1}" /etc/modprobe.conf | awk '{print $3}')
DRIVER2=$(grep "alias eth${NIC2}" /etc/modprobe.conf | awk '{print $3}')

if [[ -n "$DRIVER1" && -n "$DRIVER2" && "$DRIVER1" != "$DRIVER2" ]]; then
    echo "更新驅動別名: eth${NIC1}→$DRIVER2, eth${NIC2}→$DRIVER1"
    sed -e "/alias eth${NIC1}/d" -e "/alias eth${NIC2}/d" /etc/modprobe.conf > /etc/modprobe.conf.tmp
    echo "alias eth${NIC1} ${DRIVER2}" >> /etc/modprobe.conf.tmp
    echo "alias eth${NIC2} ${DRIVER1}" >> /etc/modprobe.conf.tmp
    mv /etc/modprobe.conf.tmp /etc/modprobe.conf
elif [[ "$DRIVER1" == "$DRIVER2" ]]; then
    echo "兩介面使用相同驅動,無需修改 modprobe.conf"
else
    echo "警告: 未找到完整別名定義,請手動檢查 /etc/modprobe.conf"
fi

# 6. 重新載入驅動模組(可選,視情況執行)
# modprobe -r ${DRIVER1} ${DRIVER2}
# modprobe ${DRIVER1}
# modprobe ${DRIVER2}

echo "=== 互換完成,請執行 'service network restart' 或重啟主機生效 ==="

部署與使用

# 1. 複製腳本
cp change_net.sh /usr/local/sbin/
chmod +x /usr/local/sbin/change_net.sh

# 2. 執行互換 eth0 ↔ eth1
change_net.sh 0 1

# 3. 重啟網路服務驗證
service network restart
ip link show

適用版本與注意事項

  • 適用: RHEL 5/6、CentOS 5/6、Fedora 舊版等採用 /etc/modprobe.conf 且網卡命名為 ethX 的系統
  • 不適用: RHEL 7+/CentOS 7+(預設 enpXsY 可預測命名)、使用 systemd-networkd 或 NetworkManager 管理介面的環境
  • 虛擬機場景: VMware/Hyper-V 增加網卡後常觸發順序變更,腳本極其適用
  • 備份: 執行前建議 cp -r /etc/sysconfig/network-scripts /root/backup/

現代替代方案(RHEL 7+)

新版系統建議使用 udev 規則綁定 MAC 位址:

# /etc/udev/rules.d/70-persistent-net.rules
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:xx:xx:xx", NAME="eth0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:yy:yy:yy", NAME="eth1"

或透過 nmcli con mod eth0 connection.interface-name eth1 等 NetworkManager 指令管理。

Copyright © Windows教程網 All Rights Reserved