3,376 瀏覽數

Linux – Biosdevname & net.ifnames

傳統的 Linux 下面看到的網路裝置名稱都是從 eth0, eth1, eth2 …. 一直連續下去,一般我們使用的電腦只有 1 , 2 個網路埠,所以在使用上不會遇到太大的難題,但是在多個網路裝置的伺服器上就頭大了,到底哪一個 ethx 是對應到哪一個實體裝置.

還好現在有新的裝置命名規則,目前看到有兩種方式 Biosdevname & net.ifnames

Biosdevname

在討論 Biosdevname 這種一致性的網絡設備命名規則 device naming rule ,我們先來看看什麼是 udev.
Linux 核心 2.6.15 之後的版本採用 sysfs 取代過去的 devfs ,我們就不需要像是傳統的 Linux 把所有裝置還是存放在 /dev/ 目錄下(不管是不是會用到先通通產生),sysfs 多了一個 /sys/ 的目錄存放動態設備節點 udev (sysfs), 優點是 /dev/ 不再需要預先產生很多不必要的裝置.當有需要時系統再自行產生. udev 還提供了自我的規則式來命名裝置. 關於更多 udev 請自行參考 http://benjr.tw/10632

但老實說這還是很麻煩, Dell 戴爾開發了一個 udev 的協助工具 – Biosdevname,這是一個以 GNU General Public License(GPL)下所開發的工具,它提供了一個一致性的命名機制,實體網路裝置的名稱會依據 BIOS 所建議的方式來命名,命名規則大致如下.

  • Embedded network interface (LOM)
    em[1234…] ⁠[New enumeration starts at 1]
  • PCI card network interface
    p[slot]p[ethernet port] ⁠[For example: p3p4]
  • Virtual function
    p[slot]p[ethernet port]_ ⁠[For example: p3p4_1]

biosdevname 會依據系統的 SMBIOS 來為你的裝置名稱命名,不過系統的 BIOS 須為 SMBIOS 2.6 版本或是更高,當然如果你要使用此功能,必須透過 root 身份使用 yum 來安裝 biosdevname 套件.

  • RHEL (RedHat)
    #yum install biosdevname
    

    接著在 Kernel 加入參數 biosdevname=1

    #vi /boot/grub/grub.conf
    kernel /boot/vmlinuz biosdevname=1
    initrd /boot/initrd.img 
    
  • Ubuntu
    #yum install biosdevname
    

    一樣在 append 加入參數 biosdevname=1

    #vi /boot/grub/grub.conf
    kernel /boot/vmlinuz
    append initrd=/boot/initrd.img biosdevname=1
    

如果要取消將 biosdevname=0 即可.

或者是手動更改 /etc/udev/rules.d/70-persistent-net.rules 改變其命名規則.下面示範列參考

# vi /etc/udev/rules.d/70-persistent-net.rules 
# PCI device 0x14e4:0x1680 (tg3)
ACTION=="add", SUBSYSTEM=="net", DRIVER=="tg3", ATTR{address}=="00:1A:64:22:04:83", NAME="em1"

只要修改 NAME 的部分,如果系統沒有 /etc/udev/rules.d/70-persistent-net.rules 請自行創建.

這一篇就討論到如何自行修改網路裝置的命名規則. http://benjr.tw/10626

net.ifnames

要查 net.ifnames 請用這個關鍵字 Predictable Network Interface Names,這個是預設的功能,除非你在開機的時候加入核心參數 net.ifnames=0 ,前面介紹的 biosdevname 也就沒有再用了,先來看看 Predictable Network Interface 的命名規則長怎樣!!

裝置名稱由 裝置類型 + 裝置位置+數字 組成:
裝置類型

  1. en for Ethernet,
  2. wl for wireless LAN (WLAN),
  3. ww for wireless wide area network (WWAN).

裝置位置+數字

  • o
    on-board device index number
  • s[f][d]
    hotplug slot index number
  • x
    MAC address
  • ps[f][d]
    PCI geographical location
  • ps[f][u][..][i]
    USB port number chain

enp0s3 就代表 Ethernet ,PCI bus 0,slot 3

問題來了,如果 Biosdevname & net.ifnames 都用了,那名稱會變成怎麼樣!!!

  1. No parameters (net.ifnames 為預設): NIC identified as “enp5s2″.
  2. Parameter biosdevname=0 (net.ifnames 為預設): NIC identified as “enp5s2″.
  3. Parameter net.ifnames=0 (採用 biosdevname 規則): NIC identified as “em1″.
  4. Parameter net.ifnames=0 AND biosdevname=0 (最傳統的方式,eth0 eth1 傻傻分不清): NIC identified as “eth0″.

4 個網友的想法 “Linux – Biosdevname & net.ifnames

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

  2. 自動參照通知: Linux之CentOS 7 & RedHat 7网卡名回归eth命名风格 | Linux–不是那么难

  3. 自動參照通知: Linux – 固定網絡介面順序 – Benjr.tw

  4. 自動參照通知: RHEL 7 – ip add show – Benjr.tw

發表迴響