如何在仅搭载BusyBox的自定义内核QEMU虚拟机中安装GCC等开发工具
极简QEMU自定义内核环境部署开发工具方案
你当前的BusyBox根文件系统仅包含基础用户态命令,缺失编译工具链、依赖库、内核构建支撑文件,是触发gcc: not found、模块编译路径不存在报错的直接原因,按以下步骤操作即可解决:
快速部署方案(零编译成本,适合快速验证)
直接使用静态编译的开发工具集,无需额外处理动态依赖,丢入根文件系统即可运行:
- 提前确认QEMU虚拟机的CPU架构(x86_64/arm64/riscv64等),在宿主机上获取对应该架构的静态编译工具集,确保包内包含
gcc、g++、make、binutils(ld/ar/as等)、C/C++头文件与静态库文件。 - 解压工具集压缩包,将解压出的
bin、lib、include目录下的内容,分别对应拷贝到你BusyBox根文件系统的/usr/bin、/usr/lib、/usr/include路径下,给所有二进制文件加可执行权限。 - 重新打包根文件系统启动QEMU,进入终端后执行
gcc -v、make -v,如果能正常输出版本信息,就可以直接编译hello world类的用户态C/C++程序。
注意:不要拿宿主机上动态编译的gcc直接往根文件系统里拷,这类程序依赖宿主机的动态链接器与系统库,在极简BusyBox环境里会直接报"not found",哪怕文件路径权限都正确也跑不起来。
长期使用方案(自动化生成完整环境,推荐)
手动拼装文件容易漏依赖,直接用Buildroot自动化构建带完整开发环境的根文件系统即可:
- 拉取Buildroot源码,执行对应QEMU目标架构的默认配置,比如x86_64架构用
qemu_x86_64_defconfig。 - 进入配置交互菜单,在Target packages分类下的Development tools子项中,勾选需要的开发组件:gcc、g++、make、binutils、linux-headers,同时开启"Build native toolchain for target"选项,生成可直接在虚拟机内运行的本地编译链。
- 内核源码路径指定为你本地编译好的自定义内核源码目录,开启内核模块编译支持,Buildroot会自动完成内核预处理、模块编译目录部署,自动在
/lib/modules/$(uname -r)/路径下生成符合要求的build软链接与配套文件。 - 执行整体编译,直接生成配套的内核镜像、根文件系统镜像,用QEMU启动后无需额外配置,直接支持用户态程序编译、内核模块编译。
手动搭建环境的内核模块编译补全步骤
如果坚持使用自己手动拼装的BusyBox根文件系统,仅装gcc和make还无法编译内核模块,必须补全内核构建目录:
- 回到宿主机上编译自定义内核的源码目录,执行
make modules_prepare,生成模块编译依赖的配置文件、头文件、构建脚本。 - 将整个预处理后的内核源码目录,拷贝到虚拟机根文件系统的
/lib/modules/<对应内核版本号>/build路径下;如果不想占太多空间,也可以把源码目录放到根文件系统其他路径,在上述路径下创建指向源码目录的软链接。 - 确认内核源码根目录下存在
.config配置文件、Module.symvers符号表文件,缺失的话从你之前编译内核的输出目录拷贝对应文件过来。 - 完成上述操作后,再执行
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules命令即可正常编译模块。
常见问题排查
- 工具放入后仍提示
gcc: not found:先执行echo $PATH确认/usr/bin在环境变量中,不在的话在/etc/profile中追加export PATH=$PATH:/usr/bin:/usr/local/bin并执行source /etc/profile;如果路径正确仍报错,执行readelf -l /usr/bin/gcc查看程序要求的动态链接器路径,把对应链接器与依赖库从工具集中拷贝到根文件系统的/lib路径下。 - 编译模块提示版本不匹配:确保虚拟机中运行的内核,和build目录下的内核源码是同一份代码、同一配置编译出的产物,不要用其他版本内核的头文件或构建目录凑数。
- 编译用户态程序提示头文件找不到:检查
/usr/include路径下是否存在stdio.h等标准库头文件,缺失的话从工具集的include目录拷贝对应文件即可。
内容的提问来源于stack exchange,提问作者vincent
相关产品推荐
相关产品推荐

