物理服务器上安装Linux,很多设备都有非常多的网卡,每个网卡的特性都不一样,批量这种类型的机器的管理有带来很大的麻烦,如何确定哪些网卡负责管理网络,哪些网卡承载业务网络。
我们希望通过通过命名来规范业务。

Linux kernel 从2.6版本的开始支持udev设备管理器,主要的功能是管理/dev目录底下的设备节点。它同时也是用来接替devfs及hotplug的功能,这意味着它要在添加/删除硬件时处理/dev目录以及所有用户空间的行为,包括加载firmware时。

运行流程如下:

unev flow

/etc/udev/udev.conf是udev主配置文件,用户定制的规则文件在/etc/udev/rules.d目录下。对于网卡设备的配置一遍社区约定的是/etc/udev/rules.d/70-persistent-net.rules文件。

示例内容如下:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="24:6e:96:03:5c:8d", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

上述规则内容描述的是在内核发现有网络设备添加时,内核网络设备描述名文eth*格式的设备,变名为eth0.

上述依赖内核两个启动参数net.ifnames=0 biosdevname=0,默认内核启动并不会将设备统统定义为eht*格式,比如笔记本网卡有线网卡可能为enp0s25这种奇怪的格式;无限网卡可能为wlp4s0。https://en.wikipedia.org/wiki/Consistent_Network_Device_Naming 维基上有个说明介绍了常规的网卡命名规则,如:

  • em[1-N] 嵌入到主板的网卡设备
  • p<slot_number>p<port_number> 基于主板PCI插槽的网卡设备命名规则

所以对于物理机有4块以上网卡的命名成了一个特别重要的事情,后续流程需要做bond等等都有依赖。

对于多网卡命名需要在/etc/udev/rules.d/70-persistent-net.rules文件中,定义多条定义规则。

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="24:6e:96:03:5c:8d", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="24:6e:96:03:5c:8a", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="24:6e:96:03:5c:8c", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:58:0e:01", ATTR{type}=="1", KERNEL=="eth*", NAME="eth3"

上述规则描述的是根据mac地址来命名4张网卡。

有个case需要说明一下, 比如内核在初始化网卡设备的过程中,是按上述过程启动机器,默认已经将所有网卡按顺序命名为eth[0-3], 如果我们仅仅使用后面两张物理网卡,将其命名为eth[0-1]的话,我们该怎么命名呢?大概的想法就是将后两张网卡定义为eth[0-1]就可以了,我们通过实验, 这个和内核默认机制刚好存在冲突,需要将前两块网卡重定义为其他名字,总之就是不能与eth[0-1]重名,最后可用的实现如下:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{type}=="1", KERNEL=="eth*", NAME+="ens%n"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="24:6e:96:03:5c:8c", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:58:0e:01", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

上述操作逻辑是, 将所有网卡都别名为ens[0-3],在定义两条规则根据mac地址映射映射到eth[0-1]的规则。最终呈现的效果就是前两张网卡的名字是ens0/ens1, 后两张网卡的名字为eth0/eth1.

【腾讯云】境外1核2G服务器低至2折,半价续费券限量免费领取!
https://cloud.tencent.com/act/cps/redirect?redirect=1068&cps_key=e4b50f6c64a4480367f8a8d16fd07c5a&from=console

标签: kernel, udev, 网卡mingming, eth0, ens0, em0

添加新评论