You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何控制SR-IOV虚拟函数(VF)的命名规则?

当然可以控制SR-IOV虚拟函数(VF)的命名方式!Linux提供了几种灵活的手段来实现自定义命名逻辑,完美解决你提到的默认命名冲突问题,下面我会详细拆解可行方案:

控制SR-IOV VF命名的实用方案

1. 使用udev规则(最推荐的生产级方案)

udev是Linux用户空间管理设备事件的核心工具,通过编写自定义规则可以精准控制VF的命名,完全隔离物理接口和VF的命名逻辑,从根源避免冲突。

示例1:让VF遵循ethvf[0-9]*格式

创建或编辑/etc/udev/rules.d/70-sriov-vf-naming.rules文件,添加以下规则:

# 匹配指定驱动的SR-IOV虚拟函数,自定义命名为ethvfX
SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="ixgbevf|iavf|mlx5_core", ATTR{virtfn}=="[0-9]*", NAME="ethvf%k"

这里的规则逻辑是:

  • SUBSYSTEM=="net":只针对网络设备生效
  • ENV{ID_NET_DRIVER}:指定你的VF对应的驱动(比如ixgbevf是Intel的VF驱动,mlx5_core是Mellanox的,根据实际网卡型号调整)
  • ATTR{virtfn}=="[0-9]*":精准匹配虚拟函数设备
  • NAME="ethvf%k"%k会自动替换为VF的原始序号,最终生成ethvf0ethvf1这类标准化名称

示例2:让VF使用指定数字范围(如eth100-eth200)

如果需要让VF的编号从100开始,可以结合udev的自定义变量实现:

SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="ixgbevf", ATTR{virtfn}=="[0-9]*", PROGRAM="/bin/sh -c 'echo $((100 + %k))'", NAME="eth%c"

这里通过PROGRAM执行shell命令,把VF的原始序号加上100,再通过%c变量代入命名,最终生成eth100eth101这类符合范围要求的名称。

2. 驱动模块参数(依赖驱动支持)

部分网卡驱动自带VF命名相关的模块参数,比如Intel的部分VF驱动支持指定命名前缀。你可以先查看驱动的参数列表:

modinfo ixgbevf | grep parm

如果发现类似vf_name_prefix的参数,可以在加载模块时指定:

modprobe ixgbevf vf_name_prefix=ethvf

这种方式更轻量化,但缺点是依赖驱动本身的支持,不是所有厂商的驱动都提供这个功能。

验证规则生效方法

编写完udev规则后,不需要重启系统,只需要重新加载udev并触发设备事件即可:

udevadm control --reload-rules
udevadm trigger --subsystem-match=net

然后用ip link show命令查看网络设备,就能看到VF已经使用你自定义的名称了。


内容的提问来源于stack exchange,提问作者Ricky Robinson

火山引擎 最新活动