測試環境為 RHEL5 x86_64
有時要設定網卡 IP 時常常會搞不清楚哪個是哪張卡.下面可以看的出來嗎??是我就不行了.
再加上之前遇到一個問題就是網絡介面卡的順序,不知道系統是怎麼偵測的,常常在開關機後順序大亂,寫信詢問 RedHat 他們建議我們可以使用 udev (關於 udev 請參考 https://benjr.tw/10632 ).來為每個裝置個別命名.其實概念很簡單先找出目前的網路卡順序.
[root@benjr ~]# cat /etc/moprobe.conf alias eth0 tg3 alias eth1 e1000e alias eth2 e1000e
目前我的網卡分別是 Broadcom – eth0 , Intel – eth1/eth2 3(eth0/eth1/eth2)個阜.接下來看一下 eth0 在 udev 儲存了哪些資訊.可以使用指令 “udevinfo” (新指令為 #udevadm info -a -p /sys/class/net/eth0 )查看.
[root@benjr ~]# udevinfo -ap /sys/class/net/eth0 Udevinfo starts with the device specified by the devpath and then walks up the chain of parent devices. It prints for every device found, all possible attributes in the udev rules key format. A rule to match, can be composed by the attributes of the device and the attributes from one single parent device. looking at device '/class/net/eth0': KERNEL=="eth0" SUBSYSTEM=="net" SYSFS{weight}=="64" SYSFS{tx_queue_len}=="1000" SYSFS{flags}=="0×1003" SYSFS{mtu}=="1500" SYSFS{operstate}=="up" SYSFS{dormant}=="0" SYSFS{carrier}=="1" SYSFS{broadcast}=="ff:ff:ff:ff:ff:ff" SYSFS{address}=="00:1a:64:22:04:83" SYSFS{link_mode}=="0" SYSFS{type}=="1" SYSFS{features}=="0x1101a9" SYSFS{ifindex}=="4" SYSFS{iflink}=="4" SYSFS{addr_len}=="6" looking at parent device '/devices/pci0000:00/0000:00:1c.1/0000:03:00.0': ID=="0000:03:00.0" BUS=="pci" DRIVER=="tg3" SYSFS{broken_parity_status}=="0" SYSFS{enable}=="1" SYSFS{modalias}=="pci:v000014E4d0000165Asv00001014sd00000378bc02sc00i00" SYSFS{local_cpus}=="00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000" SYSFS{irq}=="58" SYSFS{class}=="0×020000" SYSFS{subsystem_device}=="0×0378" SYSFS{subsystem_vendor}=="0×1014" SYSFS{device}=="0x165a" SYSFS{vendor}=="0x14e4" looking at parent device '/devices/pci0000:00/0000:00:1c.1': ID=="0000:00:1c.1" BUS=="pci" DRIVER=="pcieport-driver" SYSFS{broken_parity_status}=="0" SYSFS{enable}=="1" SYSFS{modalias}=="pci:v00008086d0000294Asv00000000sd00000000bc06sc04i00" SYSFS{local_cpus}=="00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000" SYSFS{irq}=="209" SYSFS{class}=="0×060400" SYSFS{subsystem_device}=="0×0000" SYSFS{subsystem_vendor}=="0×0000" SYSFS{device}=="0x294a" SYSFS{vendor}=="0×8086" looking at parent device '/devices/pci0000:00': ID=="pci0000:00" BUS=="" DRIVER==""
udev 可以依據裝置特性來個別命名,也就是說剛剛的 eth0 MAC 為 “00:1a:64:22:04:83” 我們就可以依據這個裝置所提供的資訊來個別命名我們網路卡.udev 的設定檔存放在 /etc/udev/rules.d/ 系統已經有一個是專門為網路卡預設的檔案 “60-net.rules”
[root@benjr ~]# cd /etc/udev/rules.d/
60-net.rules 是系統預設的 rule
[root@benjr rules.d]# ll total 248 -rw-r–r– 1 root root 515 Sep 12 17:34 05-udev-early.rules -rw-r–r– 1 root root 920 Dec 11 06:03 40-multipath.rules -rw-r–r– 1 root root 15647 Sep 12 17:34 50-udev.rules -rw-r–r– 1 root root 163 Dec 4 05:32 51-dlm.rules -rw-r–r– 1 root root 471 Sep 12 17:34 51-hotplug.rules -rw-r–r– 1 root root 58016 Oct 13 2006 60-libsane.rules -rw-r–r– 1 root root 143 Nov 13 23:48 60-net.rules -rw-r–r– 1 root root 1088 Jul 18 2006 60-pcmcia.rules -rw-r–r– 1 root root 452 Nov 26 07:15 60-raw.rules -rw-r–r– 1 root root 8209 Sep 22 22:39 60-wacom.rules -rw-r–r– 1 root root 129 Sep 10 00:11 61-uinput-stddev.rules -rw-r–r– 1 root root 214 Sep 10 00:11 61-uinput-wacom.rules -rw-r–r– 1 root root 1823 Sep 19 06:20 85-pcscd_ccid.rules -rw-r–r– 1 root root 114 Aug 29 2008 90-alsa.rules -rw-r–r– 1 root root 61 Sep 12 17:34 90-dm.rules -rw-r–r– 1 root root 82 Oct 10 21:20 90-hal.rules -rw-r–r– 1 root root 331 Oct 15 00:08 90-ib.rules -rw-r–r– 1 root root 107 Sep 12 17:34 95-pam-console.rules -rw-r–r– 1 root root 292 Dec 10 03:27 98-kexec.rules -rw-r–r– 1 root root 2319 Jul 9 2008 bluetooth.rules -rw-r–r– 1 root root 590 Dec 19 02:16 xen-backend.rules
好的我們現在就依 “udevinfo” 所提供的資訊進行裝置名稱改變,我會依據系統的 driver 和 PCI Bus 順序來為我的網卡命名.還記得 eth0 的資訊嗎?
ID==”0000:03:00.0″
DRIVER==”tg3″
其他 eth1 /eth2 都是使用同樣的方法 “udevinfo” 查出 ID 和 Driver,如果沒有安裝 #udevinfo 時,我們想知道 device ID 其實透過 #lspci -tn 就可以得知, 詳細 #lspci 請自行參考 https://benjr.tw/10851
[root@benjr rules.d]# vi 60-net.rules ACTION=="add", SUBSYSTEM=="net", IMPORT{program}="/lib/udev/rename_device" SUBSYSTEM=="net", RUN+="/etc/sysconfig/network-scripts/net.hotplug" DRIVER=="tg3", ID=="0000:03:00.0", NAME="BCM1" DRIVER=="e1000e", ID=="0000:09:00.0", NAME="INTEL0" DRIVER=="e1000e", ID=="0000:09:00.1", NAME="INTEL1"
重新將模組移除和載入.
[root@benjr rules.d]# rmmod tg3 [root@benjr rules.d]# rmmod e1000e [root@benjr rules.d]# modprobe tg3 [root@benjr rules.d]# modprobe e1000e [root@benjr rules.d]# ifconfig -a|grep -i HWaddr BCM1 Link encap:Ethernet HWaddr 00:1A:64:22:04:83 INTEL0 Link encap:Ethernet HWaddr 00:15:17:78:5D:D6 INTEL1 Link encap:Ethernet HWaddr 00:15:17:78:5D:D7 virbr0 Link encap:Ethernet HWaddr 00:00:00:00:00:00
你會發現名稱都依據你的需求改變了. 當然方式是千千萬萬種你也可以依據 MAC Address 的方式作依據.
#KERNEL=="eth*", SYSFS{address}=="00:1a:64:22:04:83", NAME="BCM1"
不過工作還沒完成在 /etc/sysconfig/network-scripts/ 目錄下還是有之前儲存下來的裝置名稱,可以用手動方式移除修改或是用 #system-config-network 來修改!!
如果使用 RHEL 時遇到相關問題可以在 http://kbase.redhat.com/faq/en 先做搜尋.
新的兩種裝置命名規則 Biosdevname & net.ifnames ,請參考 – https://benjr.tw/93340
4 thoughts on “Linux – udev 網絡介面卡的順序”