QEMU学习之路(13)--- 在BusyBox中安装pciutils
一、前言
为什么需要安装 pciutils?
BusyBox 被誉为嵌入式Linux的"瑞士军刀",集成了数百个常用Linux命令,但内置的lspci命令功能及其简单。
而 pciutils 是Linux平台标配的PCI总线设备工具集,核心作用如下:
- lspci:枚举系统所有PCI/PCIe设备,查看设备VID、PID、总线号、设备功能、硬件信息
- setpci:读写PCI设备配置空间,调试设备寄存器、修改设备参数
- 支撑QEMU虚拟PCI设备(如网卡、磁盘、EDU测试设备)的调试与验证
二、基础环境
往期博文:QEMU学习之路(5)--- 基于RISC-V 64 架构启动Linux
三、下载 pciutils 源码
pciutils 为开源项目,我们采用源码编译的方式移植
拉取官方源码,选择稳定版本编译:
克隆官方仓库
bash
git clone https://github.com/pciutils/pciutils.git
bash
cd pciutils
切换稳定分支
bash
git checkout v3.12.0
v3.12.0 为长期稳定版,兼容性强,适配QEMU+BusyBox环境,无兼容bug。
也可以直接通过 wget 获取官方发布的稳定源码包
bash
wget https://mirrors.edge.kernel.org/pub/software/utils/pciutils/pciutils-3.12.0.tar.gz
四、交叉编译
pciutils 默认是宿主本地编译,想要在BusyBox中运行,必须修改编译配置,指定交叉编译工具链,关闭动态依赖,避免依赖宿主库导致虚拟机运行报错。
- 指定交叉编译器和目标架构:
CROSS_COMPILE=riscv64-linux-gnu- HOST=riscv64-linux - 关闭 zlib 压缩(BusyBox默认无zlib库,避免依赖缺失)
- 开启静态编译,不依赖动态链接库
直接执行命令编译,无需手动修改Makefile:
bash
make CROSS_COMPILE=riscv64-linux-gnu- HOST=riscv64-linux ZLIB=no DNS=no SHARED=no IDS=yes LDFLAGS="--static"
编译完成后,会在源码目录生成核心可执行文件:lspci、setpci。

五、安装
编译出的二进制文件无法直接使用,需要安装到我们制作的 BusyBox 根文件系统目录中使用;
1、直接拷贝
将 lspci和setpci 两个文件直接拷贝到rootfs中
bash
cp lspci setpci ~/project/learn/linux/05_pci/ramfs/usr/bin
然后重新打包根文件系统镜像
bash
cd ramfs && find . | cpio -H newc -o | gzip > ../ramfs.cpio.gz
至此,pciutils工具已经集成到我们的根文件系统镜像中。
2、使用命令安装
也可以直接使用如下命令进行安装
bash
make install DESTDIR=~/project/learn/linux/05_pci/ramfs HOST=riscv64-linux CROSS_COMPILE=riscv64-linux-gnu- PREFIX=/usr

六、QEMU虚拟机上机验证
重新启动QEMU虚拟机,加载新的内核和根文件系统镜像,启动成功后,进入BusyBox终端,执行验证命令:
查看pciutils版本
bash
lspci -v
枚举所有QEMU虚拟PCI设备
bash
lspci
查看详细设备信息
bash
lspci -nn
输出效果

可以正常枚举出QEMU模拟的所有PCI设备:PCI主机桥、虚拟网卡、IDE磁盘控制器、串口设备、EDU测试设备等,同时显示设备厂商ID、设备ID、总线地址、设备状态等完整信息。
说明 pciutils 移植成功,完美适配BusyBox极简环境。
七、常见问题汇总
问题1:lspci: not found
- 原因:未将编译好的二进制文件放入
/bin目录,或未重新打包根文件系统镜像 - 解决:重新拷贝文件、赋予权限、重新打包镜像
问题2:lspci 无任何输出
- 原因:Linux内核未开启PCI总线支持
- 解决:重新配置内核,开启
CONFIG_PCI并重新编译内核
问题3:编译报错缺失zlib
- 原因:默认开启zlib依赖
- 解决:编译时添加
ZLIB=no关闭压缩依赖
八、学习总结
- BusyBox 原生不支持PCI调试工具,pciutils必须通过源码交叉编译手动移植,是QEMU设备调试的必备工具;
- 移植核心关键点:静态编译、关闭多余依赖、适配交叉工具链、内核开启PCI支持,缺一不可;
- 成功部署后,可在QEMU中完整调试所有虚拟PCI设备,为后续QEMU自定义设备开发、PCI驱动编写、设备配置空间调试打下基础。