RHEL8环境下如何自定义SR-IOV VF网卡接口名称
我来给你几个避开MAC地址问题的实用方案,亲测在RHEL8里可行:
方案一:用UDEV规则匹配固定PCI属性(推荐)
既然VF的MAC启动时是随机的,那咱们换个固定的匹配维度——比如VF的物理端口索引或者PCI设备路径:
先查看你的VF的
phys_port_name属性,执行命令:for vf in <PF>v0 <PF>v1 <PF>v2; do ethtool -P $vf; echo "phys_port_name: $(cat /sys/class/net/$vf/phys_port_name)"; done你会看到每个VF对应的
phys_port_name是0、1、2这样的固定数字(和VF索引对应)。创建UDEV规则文件
/etc/udev/rules.d/70-sriov-vf-naming.rules,内容如下(把名字换成你想要的):SUBSYSTEM=="net", ACTION=="add", ATTR{phys_port_name}=="0", NAME="web-vf0" SUBSYSTEM=="net", ACTION=="add", ATTR{phys_port_name}=="1", NAME="db-vf1" SUBSYSTEM=="net", ACTION=="add", ATTR{phys_port_name}=="2", NAME="storage-vf2"如果
phys_port_name不生效,也可以用固定的PCI路径来匹配:先通过lspci -D找到每个VF的完整PCI地址(比如0000:01:00.1),然后写规则:SUBSYSTEM=="net", ACTION=="add", DEVPATH=="*/0000:01:00.1", NAME="web-vf0" SUBSYSTEM=="net", ACTION=="add", DEVPATH=="*/0000:01:00.2", NAME="db-vf1" SUBSYSTEM=="net", ACTION=="add", DEVPATH=="*/0000:01:00.3", NAME="storage-vf2"重启UDEV服务或者直接重启系统,就能看到自定义的VF名称了:
udevadm control --reload-rules && udevadm trigger
方案二:用Systemd服务在启动后重命名
如果UDEV的方式还是有问题,咱们可以搞个简单的Systemd服务,等网络初始化完成后手动改名字:
创建服务文件
/etc/systemd/system/vf-rename.service,内容:[Unit] Description=自定义SR-IOV VF网卡名称 After=network.target [Service] Type=oneshot ExecStart=/usr/sbin/ip link rename <PF>v0 web-vf0 ExecStart=/usr/sbin/ip link rename <PF>v1 db-vf1 ExecStart=/usr/sbin/ip link rename <PF>v2 storage-vf2 [Install] WantedBy=multi-user.target启用并启动服务:
systemctl daemon-reload systemctl enable --now vf-rename.service这样每次系统启动后,都会自动把默认的VF名称改成你指定的名字。
方案三:通过NetworkManager直接配置VF连接
既然你已经用NetworkManager持久化了PF的VF数量,那也可以直接给每个VF创建独立的NetworkManager连接,指定接口名称:
先查看当前的VF设备:
nmcli device status找到对应的
<PF>v0、<PF>v1、<PF>v2。给每个VF创建自定义名称的连接:
nmcli connection add type ethernet ifname web-vf0 con-name web-vf0 connection.autoconnect true nmcli connection add type ethernet ifname db-vf1 con-name db-vf1 connection.autoconnect true nmcli connection add type ethernet ifname storage-vf2 con-name storage-vf2 connection.autoconnect true删除原来的默认VF连接(可选):
nmcli connection delete <PF>v0 <PF>v1 <PF>v2下次重启后,NetworkManager就会自动识别并使用你设置的自定义接口名称。
为什么你之前的UDEV方法没用?
因为SR-IOV VF在系统启动初期,MAC地址是随机生成的,之后可能会被NetworkManager或者网卡驱动重新设置为固定值,而UDEV是在VF刚创建时触发的,此时看到的是随机MAC,和你后续设置的固定MAC不一致,所以规则匹配失败。
备注:内容来源于stack exchange,提问作者user892960

