傳統的 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 請自行參考 https://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 – https://benjr.tw/214 來為你的裝置名稱命名,不過系統的 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
如果系統使用的是 GRUB2 ,要修改的檔案為 /etc/default/grub 內的 GRUB_CMDLINE_LINUX .請參考 GRUB2 – https://benjr.tw/95009
[root@localhost ~]# cat /etc/default/grub GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet net.ifnames=0 biosdevname=0" GRUB_DISABLE_RECOVERY="true" [root@localhost ~]# grub2-mkconfig
- 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 請自行創建.
這一篇就討論到如何自行修改網路裝置的命名規則. https://benjr.tw/10626
net.ifnames
要查 net.ifnames 請用這個關鍵字 Predictable Network Interface Names,這個是預設的功能,除非你在開機的時候加入核心參數 net.ifnames=0 ,前面介紹的 biosdevname 也就沒有再用了,先來看看 Predictable Network Interface 的命名規則長怎樣!!
裝置名稱由 裝置類型 + 裝置位置+數字 組成:
裝置類型
- en for Ethernet,
- wl for wireless LAN (WLAN),
- ww for wireless wide area network (WWAN).
裝置位置+數字
- o
on-board device index number - s
[f ][d ] hotplug slot index number - x
MAC address - p
s [f ][d ] PCI geographical location - p
s [f ][u ][..][i ] USB port number chain
enp0s3 就代表 Ethernet ,PCI bus 0,slot 3
Biosdevname & net.ifnames
問題來了,如果 Biosdevname & net.ifnames 都用了,那名稱會變成怎麼樣!!!
- No parameters (net.ifnames 為預設): NIC identified as “enp5s2”.
- Parameter biosdevname=0 (net.ifnames 為預設): NIC identified as “enp5s2”.
- Parameter net.ifnames=0 (採用 biosdevname 規則): NIC identified as “em1”.
- Parameter net.ifnames=0 AND biosdevname=0 (最傳統的方式,eth0 eth1 傻傻分不清): NIC identified as “eth0”.
4 thoughts on “Linux – Biosdevname & net.ifnames”