侧边栏壁纸
博主头像
JasonLiu博主等级

Hi~ I'm Jason, Welcome

  • 累计撰写 26 篇文章
  • 累计创建 20 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录
IT

SR-IOV VF 信息查看工具

JasonLiu
2025-04-27 / 0 评论 / 0 点赞 / 15 阅读 / 760 字

SR-IOV VF 信息查看工具

背景介绍

在虚拟化环境中,SR-IOV (Single Root I/O Virtualization) 技术允许将单个物理网卡(PF,Physical Function)虚拟化为多个虚拟网卡(VF,Virtual Function)。这种技术可以显著提高虚拟机的网络性能,减少 CPU 开销,是高性能虚拟化网络的重要技术。

问题描述

在管理 SR-IOV 环境时,管理员经常需要了解:

  1. 哪些物理网卡支持 SR-IOV
  2. 每个物理网卡创建了多少个虚拟网卡
  3. 虚拟网卡和物理网卡的对应关系
  4. 每个虚拟网卡的 PCI 地址

虽然可以通过手动查看 /sys/class/net//sys/bus/pci/devices/ 目录来获取这些信息,但这种方式:

  • 操作繁琐
  • 信息分散
  • 需要手动关联 VF 和 PF 的关系
  • 输出格式不直观

解决方案

show_vf.sh 脚本通过自动化方式解决了上述问题:

  1. 自动化信息收集

    • 自动扫描系统中的所有网卡
    • 识别支持 SR-IOV 的物理网卡
    • 收集所有 VF 的信息
    • 建立 VF 和 PF 的对应关系
  2. 格式化输出

    • 使用表格形式展示信息
    • 对齐的列宽确保输出整洁
    • 清晰的表头便于理解
    • 包含所有关键信息(VF 名称、PCI 地址、PF 名称、PF PCI 地址)
  3. 使用场景

    • 快速查看 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

使用方法

  1. 创建脚本文件:
vim show_vf.sh
  1. 将上述脚本内容复制到文件中

  2. 赋予执行权限:

chmod +x show_vf.sh
  1. 运行脚本:
./show_vf.sh
0

评论区