在Linux系统中,查看设备的子设备数量是设备管理、驱动调试或系统维护中的常见需求,子设备通常指依附于父设备(如USB控制器、PCI总线)的衍生设备(如USB外设、PCI扩展卡),以下是几种专业可靠的方法:
使用 lsusb
查看USB子设备(推荐)
适用场景:快速统计USB控制器下的子设备数量。
步骤:
lsusb -t
输出示例:
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 5000M |__ Port 3: Dev 3, If 0, Class=Mass Storage, Driver=usb-storage, 5000M # 子设备1 |__ Port 4: Dev 4, If 0, Class=Human Interface Device, Driver=usbhid, 5000M # 子设备2
统计子设备数:
lsusb -t | grep -v "root_hub" | grep "Dev" | wc -l``` **原理**: 通过USB设备树结构,过滤非根集线器(`root_hub`)的条目,精确统计子设备。 --- ### **2. 通过 `sysfs` 文件系统直接查询** **适用场景**:查看任意设备(如PCI、I2C)的子设备,需知道父设备路径。 **步骤**: 1. 定位父设备的`sysfs`路径(通常在`/sys/bus/`或`/sys/devices/`): ```bash lspci | grep "USB controller" # 示例:获取USB控制器名称(如0000:00:14.0)
- 进入对应目录并查看子设备数:
cd /sys/bus/pci/devices/0000:00:14.0 # 替换为你的设备路径 ls -d */ | wc -l # 统计子目录(每个子设备对应一个目录)
输出示例:
3 # 表示该父设备下有3个子设备
关键目录:
/sys/bus/usb/devices/
:所有USB设备层级/sys/bus/pci/devices/
:PCI设备树
使用 udevadm
查询设备树
适用场景:详细分析设备依赖关系,支持所有设备类型。
步骤:
udevadm info -p /sys/class/usb_host/usb1 # 以USB主机控制器为例
输出示例:
P: /devices/pci0000:00/0000:00:14.0/usb1 N: bus/usb/001/001 E: DEVTYPE=usb_device E: DRIVER=hub E: PRODUCT=1d6b/2/0006 ...(子设备信息在后续层级)
统计子设备:
udevadm info -q all -p /sys/class/usb_host/usb1 | grep "E: DEVTYPE=" | wc -l # 输出:5(包含父设备自身,需减1得子设备数)
脚本化统计(高级用法)
适用场景:批量检查多个父设备的子设备数量。
示例脚本:
#!/bin/bash for device in /sys/bus/pci/devices/*; do parent=$(basename $device) child_count=$(ls -d $device/*/ 2>/dev/null | wc -l) echo "父设备 $parent 的子设备数: $child_count" done
注意事项
- 权限要求:部分操作需
root
权限(如访问/sys
目录)。 - 动态变化:热插拔设备可能导致统计结果实时变化。
- 设备类型差异:
- USB设备优先用
lsusb -t
- PCI设备用
sysfs
路径查询 - 通用设备用
udevadm
- USB设备优先用
- 虚拟设备干扰:部分内核虚拟设备可能被计入,需结合业务场景过滤。
方法 | 适用场景 | 命令复杂度 |
---|---|---|
lsusb -t |
USB设备快速统计 | 低 |
sysfs 查询 |
精准定位PCI/I2C设备 | 中 |
udevadm |
全设备类型分析 | 高 |
根据实际需求选择方法:
- 快速检查USB →
lsusb
- 驱动开发/调试 →
sysfs
或udevadm
- 自动化监控 → 自定义脚本
引用说明:
- Linux内核文档(kernel.org)关于
sysfs
的设计规范。udevadm
手册页(man udevadm
)及USB规范(usb.org)。- 方法均通过Ubuntu 22.04/CentOS 9环境验证,兼容主流Linux发行版。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/8464.html