背景

之前写的脚本中获取 IP 地址时,未考虑虚拟网卡的情况(docker 创建的虚拟网卡),导致脚本失败,故总结下网卡相关知识。

一致网络设备命名规范

Centos 6及之前的版本网卡命名格式:eth[0123…]


Centos 7为了方便定位和区分网络设备,采用一致网络设备命名(CONSISTENT NETWORK DEVICE NAMING)规范,支持 biosdevnamenet.ifnames 两种命名规范。

biosdevname

biosdevname 命名规范

28b7080c7c7d0ca402adf05dd8df3903.png


注: 新枚举从 1 开始。

net.ifnames

net.ifnames 命名规范为:设备类型 + 设备位置 + 数字

设备类型

  • en 代表以太网
  • wl 代表无线局域网(WLAN)
  • ww 代表无线广域网(WWAN)

设备命名

e7f7eee433889c4d56638f544bc2b252.png

示例

  • eno1 板载1号网卡
  • enp0s2 PCI扩展卡的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:"

参考资料

  • https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/networking_guide/ch-consistent_network_device_naming
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐