3,052 瀏覽數

Linux – udev 網絡介面卡的順序

有時要設定網卡 IP 時常常會搞不清楚哪個是哪張卡.下面可以看的出來嗎??是我就不行了.
udev00
再加上之前遇到一個問題就是網絡介面卡的順序,不知道系統是怎麼偵測的,常常在開關機後順序大亂,寫信詢問 RedHat 他們建議我們可以使用 udev.來為每個裝置個別命名.其實概念很簡單先找出目前的網路卡順序.

[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" 查看.

[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 請自行參考 http://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 來修改!!
udev01
如果使用 RHEL 時遇到相關問題可以在 http://kbase.redhat.com/faq/en 先做搜尋.

4 個網友的想法 “Linux – udev 網絡介面卡的順序

  1. 自動參照通知: Linux – Network device eth0 , eth1 – Benjr.tw

  2. 自動參照通知: Biosdevname – Linux 下一致性的網絡設備命名 | Benjr.tw

  3. 自動參照通知: 硬體裝置 | Benjr.tw

  4. 自動參照通知: Linux – udev | Benjr.tw

發表迴響