SR-IOV VF 信息查看工具
背景介绍
在虚拟化环境中,SR-IOV (Single Root I/O Virtualization) 技术允许将单个物理网卡(PF,Physical Function)虚拟化为多个虚拟网卡(VF,Virtual Function)。这种技术可以显著提高虚拟机的网络性能,减少 CPU 开销,是高性能虚拟化网络的重要技术。
问题描述
在管理 SR-IOV 环境时,管理员经常需要了解:
- 哪些物理网卡支持 SR-IOV
- 每个物理网卡创建了多少个虚拟网卡
- 虚拟网卡和物理网卡的对应关系
- 每个虚拟网卡的 PCI 地址
虽然可以通过手动查看 /sys/class/net/
和 /sys/bus/pci/devices/
目录来获取这些信息,但这种方式:
- 操作繁琐
- 信息分散
- 需要手动关联 VF 和 PF 的关系
- 输出格式不直观
解决方案
show_vf.sh
脚本通过自动化方式解决了上述问题:
-
自动化信息收集:
- 自动扫描系统中的所有网卡
- 识别支持 SR-IOV 的物理网卡
- 收集所有 VF 的信息
- 建立 VF 和 PF 的对应关系
-
格式化输出:
- 使用表格形式展示信息
- 对齐的列宽确保输出整洁
- 清晰的表头便于理解
- 包含所有关键信息(VF 名称、PCI 地址、PF 名称、PF PCI 地址)
-
使用场景:
- 快速查看 SR-IOV 配置
- 验证 VF 分配情况
- 排查 VF 相关问题
- 系统维护和监控
脚本内容
#!/bin/bash
# 定义列宽
VF_NAME_WIDTH=15
VF_PCI_WIDTH=15
PF_NAME_WIDTH=15
PF_PCI_WIDTH=15
# 打印表头
printf "%-${VF_NAME_WIDTH}s %-${VF_PCI_WIDTH}s %-${PF_NAME_WIDTH}s %-${PF_PCI_WIDTH}s\n" \
"VF_NAME" "VF_PCI_ADDRESS" "PF_NAME" "PF_PCI_ADDRESS"
printf "%-${VF_NAME_WIDTH}s %-${VF_PCI_WIDTH}s %-${PF_NAME_WIDTH}s %-${PF_PCI_WIDTH}s\n" \
"--------" "--------------" "--------" "--------------"
# 遍历所有网卡
for netdev in /sys/class/net/*; do
netdev_name=$(basename "$netdev")
device_path="$netdev/device"
# 检查是否是 PF(有 virtfn 目录)
if [ -d "$device_path/virtfn0" ]; then
# 这是 PF,获取其 PCI 地址
pf_pci=$(basename $(readlink -f "$device_path"))
# 遍历所有 VF
for virtfn in $device_path/virtfn*; do
if [ -L "$virtfn" ]; then
# 获取 VF 的 PCI 地址
vf_pci=$(basename $(readlink -f "$virtfn"))
# 查找对应的 VF 网卡名
vf_netdev="N/A"
for vf_net in /sys/class/net/*; do
vf_net_name=$(basename "$vf_net")
if [ -L "$vf_net/device" ] && [ "$(basename $(readlink -f "$vf_net/device"))" = "$vf_pci" ]; then
vf_netdev=$vf_net_name
break
fi
done
# 输出对齐的 VF 和 PF 的信息
printf "%-${VF_NAME_WIDTH}s %-${VF_PCI_WIDTH}s %-${PF_NAME_WIDTH}s %-${PF_PCI_WIDTH}s\n" \
"$vf_netdev" "$vf_pci" "$netdev_name" "$pf_pci"
fi
done
fi
done
使用方法
- 创建脚本文件:
vim show_vf.sh
-
将上述脚本内容复制到文件中
-
赋予执行权限:
chmod +x show_vf.sh
- 运行脚本:
./show_vf.sh
评论区