QEMU学习之路(13)— 在BusyBox中安装pciutils

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"

编译完成后,会在源码目录生成核心可执行文件:lspcisetpci

五、安装

编译出的二进制文件无法直接使用,需要安装到我们制作的 BusyBox 根文件系统目录中使用;

1、直接拷贝

lspcisetpci 两个文件直接拷贝到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 关闭压缩依赖

八、学习总结

  1. BusyBox 原生不支持PCI调试工具,pciutils必须通过源码交叉编译手动移植,是QEMU设备调试的必备工具;
  2. 移植核心关键点:静态编译、关闭多余依赖、适配交叉工具链、内核开启PCI支持,缺一不可;
  3. 成功部署后,可在QEMU中完整调试所有虚拟PCI设备,为后续QEMU自定义设备开发、PCI驱动编写、设备配置空间调试打下基础。
相关推荐
小白的后端世界1 小时前
数据分析基础学习
人工智能·学习·数据分析
人工智能培训1 小时前
从“捏泥人”到“造世界”:3D生成式AI的技术跃迁与产业落地
大数据·人工智能·学习·生活·ai写作
鱼很腾apoc1 小时前
【Linux】第15期 讲解IP网络层核心原理与机制
linux·服务器·网络协议·学习·tcp/ip·ip·网络层
陈年老古董2 小时前
Python模拟MapReduce分治思想 | 从单文件统计到大文件拆分聚合 学习笔记
开发语言·hadoop·笔记·python·学习
David猪大卫2 小时前
【C++修炼】异常
开发语言·c++·经验分享·笔记·学习·考研·面试
GHL2842710902 小时前
豆包换脸学习
学习·ai
youm20033 小时前
【学习笔记】reids的数据类型
redis·笔记·学习
老猿讲编程3 小时前
【Eclipse OpenSOVD学习之五】拓扑引擎(Topology)
学习·rust·eclipse·sovd
励志不掉头发的内向程序员3 小时前
【LibreCAD 2D架构】RS_Line创建之后发生了什么?从图形容器到屏幕渲染
开发语言·c++·qt·学习·系统架构