背景
之前寫的腳本中獲取 IP 地址時,未考慮虛擬網卡的情況(docker 創建的虛擬網卡),導致腳本失敗,故總結下網卡相關知識。
一致網絡設備命名規范
Centos 6及之前的版本網卡命名格式:eth[0123…]。
Centos 7為了方便定位和區分網絡設備,采用一致網絡設備命名(CONSISTENT NETWORK DEVICE NAMING)規范,支持 biosdevname 和 net.ifnames 兩種命名規范。
biosdevname
biosdevname 命名規范
| 設備 | 舊名稱 | 新名稱 | 示例 |
|---|---|---|---|
| 內嵌網絡接口(LOM) | eth[0123…] | em[1234…][a] | em1 |
| PCI 卡網絡接口 | eth[0123…] | p
|
p3p4 |
| 虛擬功能 | eth[0123…] | p
|
p3p4_1 |
注: 新枚舉從 1 開始。
net.ifnames
net.ifnames 命名規范為:設備類型 + 設備位置 + 數字
設備類型
en代表以太網wl代表無線局域網(WLAN)ww代表無線廣域網(WWAN)
設備命名
| 格式 | 描述 |
|---|---|
| o<index> | 板載設備索引號 |
| s<slot>[f<function>][d<dev_id>] | 熱插拔插槽索引號 |
| x<MAC> | MAC 地址 |
| p<bus>s<slot>[f<function>][d<dev_id>] | PCI 地理位置 |
| p<bus>s<slot>[f<function>][u<port>][..][c<config>][i<interface>] | USB 端口鏈 |
示例
eno1板載1號網卡enp0s2PCI擴展卡的2號端口ens33熱插拔插槽3號PCI-E插槽的3號端口wlp3s0第3號PCI擴展卡的0號端口
系統默認命名規則
默認情況下,systemd 會使用以下策略,采用支持的命名方案為接口命名:
- 方案 1:如果固件或 BIOS 信息適用且可用,則使用整合了為板載設備提供索引號的固件或 BIOS 的名稱(例如:
eno1),否則請使用方案 2。 - 方案 2:如果固件或 BIOS 信息適用且可用,則使用整合了為 PCI 快速熱插拔插槽提供索引號的固件或 BIOS 名稱(例如
ens1),否則請使用方案 3。 - 方案 3:如果硬件連接器物理位置信息可用,則使用整合了該信息的名稱(例如:enp2s0),否則請使用方案 5。
- 方案 4:默認不使用整合接口 MAC 地址的名稱(例如:
enx78e7d1ea46da),但用戶可選擇使用此方案。 - 方案 5:傳統的不可預測的內核命名方案,在其他方法均失敗后使用(例如:
eth0)。
這個策略(如上所述)是默認策略。如果該系統已啟用 biosdevname,則會使用該方案。
注:啟用 biosdevname 需要添加 biosdevname=1 作為命令行參數(Dell 系統除外),此時只要安裝 biosdevname,就會默認使用該方案。如果用戶已添加 udev 規則,該規則會更改內核設備名稱,則會優先使用這些規則。
查看網卡、獲取 IP
# 全部網卡
$ ls /sys/class/net/
或
$ ifconfig -a
或
$ ip a
# 虛擬網卡
$ ls /sys/devices/virtual/net/
# 物理網卡
$ ls /sys/class/net/ | grep -v "$(ls /sys/devices/virtual/net/)"
# 獲取本機所有 IP
$ ifconfig -a |grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"
# 獲取物理網卡的 IP
$ ifconfig $(ls /sys/class/net/ | grep -v "$(ls /sys/devices/virtual/net/)") |grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"
參考資料
微信公眾號:daodaotest
