【小工具pcie2netdev】一次获取Mellanox网卡eth、ib、IP、PCIe等信息的命令(lspci > bdf > /sys/class/pci_bus > eth > ibdev)

文章介绍了一个脚本,通过整合多个命令,提高效率并全面地获取MellanoxPCIe设备的Ethernet(ETH)、InfiniBand(IBdev)接口信息以及IP地址,简化了获取IB设备信息的过程。

快速回忆

  • 使用方法:拷贝 工具脚本 章节
  • 通过系统pcie的sys接口可以获取eth口,比如:ls -l /sys/class/pci_bus/0000:05/device/0000:05:00.0/net/
  • 通过lspci的-s可以查看某个bdf的信息:比如lspci -s 05:00.1
  • 通过lspci的-d可以查看某个vendor的所有pci设别,比如:lspci -d 15b3:
  • 通过ip link show可以查看某个接口的updown和ip信息,比如:ip addr show

背景

经常为了获取某个IB设备的信息需要多个命令,并且命令之间需要获取PCIe的BDF、获取Eth名字、获取ib名字,然后查询。效率低而且不全面。特此写了个小工具一把刷出来。效果:
在这里插入图片描述

工具脚本(拷贝执行)

mlnx_list=($(lspci -d 15b3: | awk '{print $1}' | awk -F\: '{print $1 "," $1":"$2}'))
printf "%-10s %-10s %-20s %-10s %-15s %-30s\n" "VENDOR" "ETH" "BDF" "IBdev" "IPaddr" "Company"
for item in "${mln
Linux 系统中,`/sys/class/net/eth0.10` 是一个 **sysfs 虚拟文件系统路径**,它提供了关于网络接口 `eth0.10` 的详细运行时信息。你可以通过读取该目录下的各种文件来查看 VLAN 子接口的设备信息。 --- ## ✅ 查看 `/sys/class/net/eth0.10` 中的关键信息 假设你的 VLAN 接口已创建(如通过 `vconfig add eth0 10` 或 `ip link add ... type vlan id 10`),那么你会看到: ```bash ls /sys/class/net/eth0.10 ``` 输出示例: ``` address brdaddr carrier ifindex mtu operstate tx_queue_len addr_len broadcast dev_id link_mode name_assign_type power type dev_port dormant netdev_group proto_down speed ``` 下面逐个解释这些关键文件的作用和如何使用它们。 --- ### 📁 常见文件及其含义与读取方法 | 文件名 | 含义 | 示例命令 | 输出说明 | |-------|------|----------|---------| | `address` | 接口的 MAC 地址 | `cat /sys/class/net/eth0.10/address` | `aa:bb:cc:dd:ee:ff` | | `broadcast` 或 `brdaddr` | 广播地址 | `cat /sys/class/net/eth0.10/broadcast` | `ff:ff:ff:ff:ff:ff` | | `ifindex` | 内核分配的接口索引(ifindex) | `cat /sys/class/net/eth0.10/ifindex` | `5`(整数) | | `mtu` | 最大传输单元 | `cat /sys/class/net/eth0.10/mtu` | `1500` | | `operstate` | 操作状态(up/down) | `cat /sys/class/net/eth0.10/operstate` | `up`, `down`, `lowerlayerdown` | | `dormant` | 是否处于休眠状态 | `cat /sys/class/net/eth0.10/dormant` | `0`=否, `1`=是 | | `carrier` | 物理链路是否连接(仅物理接口有意义) | `cat /sys/class/net/eth0.10/carrier` | `1`=有载波, `0`=无(VLAN 可能不存在) | | `type` | 接口类型 | `cat /sys/class/net/eth0.10/type` | `1` 表示以太网 | | `tx_queue_len` | 发送队列长度 | `cat /sys/class/net/eth0.10/tc_queue_len` | 默认通常是 `1000` | | `mtu` | 当前 MTU 大小 | `cat /sys/class/net/eth0.10/mtu` | 如 `1500` | | `name_assign_type` | 名称分配方式 | `cat /sys/class/net/eth0.10/name_assign_type` | `1`=内核默认, `2`=用户空间指定 | --- ### 🔍 特殊属性:识别 VLAN 类型和配置 虽然 `/sys/class/net/eth0.10` 不直接显示 VLAN ID 和父接口,但可以通过以下方式推断: #### 1. 查看符号链接目标(确定父接口) ```bash readlink /sys/class/net/eth0.10/lower_eth0 ``` 更通用的方法是检查是否存在 `lower_*` 链接: ```bash ls -l /sys/class/net/eth0.10/ ``` 输出可能包含: ``` lrwxrwxrwx 1 root root 0 Jun 5 10:00 lower_eth0 -> ../eth0 ``` 这表示 `eth0.10` 是基于 `eth0` 创建的。 > ⚠️ 注意:只有使用 `ip link` 创建时才会自动建立 `lower_*` 链接;`vconfig` 创建的接口可能没有这个链接! #### 2. 获取 VLAN 相关信息(需访问 `/proc/net/vlan/`) 如果你加载了 `8021q` 模块,并且使用的是传统 VLAN 接口,可以查看: ```bash cat /proc/net/vlan/config ``` 输出示例: ``` VLAN Dev name | VLAN ID | Device -----------------|---------|------- eth0.10 | 10 | eth0 ``` 📌 这是最直接查看 VLAN ID 和父接口的方式。 --- ## ✅ Shell 脚本示例:获取 eth0.10 的完整信息 ```bash #!/bin/bash IFACE="eth0.10" SYSFS="/sys/class/net/$IFACE" echo "=== Network Interface Info: $IFACE ===" [ -f "$SYSFS/address" ] && echo "MAC Address: $(cat $SYSFS/address)" [ -f "$SYSFS/ifindex" ] && echo "Interface Index (ifindex): $(cat $SYSFS/ifindex)" [ -f "$SYSFS/mtu" ] && echo "MTU: $(cat $SYSFS/mtu)" [ -f "$SYSFS/operstate" ] && echo "Operational State: $(cat $SYSFS/operstate)" [ -f "$SYSFS/dormant" ] && echo "Dormant: $(cat $SYSFS/dormant)" [ -f "$SYSFS/type" ] && echo "Type: $(cat $SYSFS/type)" # 1 = Ethernet [ -L "$SYSFS/lower_eth0" ] && echo "Parent Interface: eth0" # 尝试从 /proc/net/vlan/config 获取 VLAN 信息 if grep -q "$IFACE" /proc/net/vlan/config 2>/dev/null; then echo "VLAN Info:" grep "$IFACE" /proc/net/vlan/config | sed 's/^/ /' fi ``` 输出示例: ``` === Network Interface Info: eth0.10 === MAC Address: aa:bb:cc:dd:ee:ff Interface Index (ifindex): 5 MTU: 1500 Operational State: up Dormant: 0 Type: 1 Parent Interface: eth0 VLAN Info: eth0.10 | 10 | eth0 ``` --- ## ✅ 在 C 程序中读取这些信息(示例:读取 ifindex) ```c #include <stdio.h> #include <stdlib.h> #include <string.h> int read_sysfs_int(const char *iface, const char *file) { char path[256]; FILE *fp; int value; snprintf(path, sizeof(path), "/sys/class/net/%s/%s", iface, file); fp = fopen(path, "r"); if (!fp) return -1; fscanf(fp, "%d", &value); fclose(fp); return value; } char* read_sysfs_str(const char *iface, const char *file, char *buf, size_t len) { char path[256]; FILE *fp; snprintf(path, sizeof(path), "/sys/class/net/%s/%s", iface, file); fp = fopen(path, "r"); if (!fp) return NULL; if (fgets(buf, len, fp)) { size_t n = strlen(buf); if (n > 0 && buf[n-1] == '\n') buf[n-1] = '\0'; // strip newline } fclose(fp); return buf; } int main() { const char *ifname = "eth0.10"; char mac[32], state[16]; printf("Interface: %s\n", ifname); if (read_sysfs_str(ifname, "address", mac, sizeof(mac))) printf("MAC: %s\n", mac); int idx = read_sysfs_int(ifname, "ifindex"); if (idx >= 0) printf("ifindex: %d\n", idx); if (read_sysfs_str(ifname, "operstate", state, sizeof(state))) printf("State: %s\n", state); return 0; } ``` --- ## ✅ 总结:常用命令一览 | 信息 | 命令 | |------|------| | MAC 地址 | `cat /sys/class/net/eth0.10/address` | | ifindex | `cat /sys/class/net/eth0.10/ifindex` | | 状态 | `cat /sys/class/net/eth0.10/operstate` | | MTU | `cat /sys/class/net/eth0.10/mtu` | | VLAN 配置 | `cat /proc/net/vlan/config` | | 父接口线索 | `ls -l /sys/class/net/eth0.10/lower_*` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值