当前位置: 首页 > news >正文

保姆级教程:在Ubuntu 20.04上从源码编译QEMU 8.2.4(含国内源配置与常见编译错误解决)

深度实践:Ubuntu 20.04环境下QEMU 8.2.4源码编译全攻略

为什么选择源码编译QEMU?

在虚拟化技术领域,QEMU作为开源的机器仿真和虚拟化工具,其重要性不言而喻。对于开发者而言,从源码编译QEMU不仅能获得最新功能,还能根据特定需求进行定制化配置。本文将带你深入探索在Ubuntu 20.04系统上编译QEMU 8.2.4的全过程,特别针对国内开发者可能遇到的网络问题和依赖问题提供解决方案。

源码编译相比直接安装预编译版本具有以下优势:

  • 版本控制:可以自由选择特定版本,避免系统仓库版本过旧的问题
  • 功能定制:通过配置参数选择需要的组件,减少不必要的依赖
  • 调试能力:可以添加调试信息,便于后续开发和问题排查
  • 学习价值:了解整个构建过程,加深对QEMU架构的理解

1. 环境准备与依赖安装

1.1 系统要求

在开始之前,请确保你的Ubuntu 20.04系统满足以下基本要求:

  • 至少4GB可用内存(推荐8GB以上)
  • 20GB以上可用磁盘空间
  • 稳定的网络连接
  • 已安装基本的开发工具

可以通过以下命令检查系统信息:

lsb_release -a uname -a free -h df -h

1.2 安装编译依赖

QEMU编译需要大量开发库支持,以下是完整的依赖安装命令:

sudo apt update sudo apt install -y \ gcc make python3-venv python3-pip ninja-build \ libglib2.0-dev flex bison libcapstone-dev \ libfdt-dev device-tree-compiler zlib1g-dev \ libpixman-1-dev libssl-dev libaio-dev \ libusb-1.0-0-dev libiscsi-dev libnfs-dev \ libcurl4-gnutls-dev libssh-dev libvde-dev \ libsdl2-dev libgtk-3-dev libspice-server-dev \ libvirglrenderer-dev libepoxy-dev

对于文档生成,还需要安装Sphinx相关包:

pip3 install Sphinx sphinx_rtd_theme

注意:如果系统中有多个Python版本,请确保使用Python3作为默认解释器

2. 源码获取与国内源配置

2.1 获取QEMU源码

官方推荐通过Git获取QEMU源码:

git clone https://git.qemu.org/git/qemu.git cd qemu git checkout v8.2.4

如果官方仓库访问困难,可以使用国内镜像源:

git clone https://mirrors.tuna.tsinghua.edu.cn/git/qemu.git

2.2 解决子模块下载问题

QEMU编译过程中需要下载多个子模块,国内开发者常因网络问题在此步骤失败。以下是解决方案:

  1. 修改.gitmodules文件
sed -i 's|gitlab.com/qemu-project|gitee.com/tinylab/qemu-|g' .gitmodules
  1. 更新subprojects中的.wrap文件
find subprojects/ -name "*.wrap" -exec sed -i 's|gitlab.com/qemu-project|gitee.com/tinylab/qemu-|g' {} \;
  1. 初始化子模块
git submodule update --init --recursive

如果某些子模块仍然无法下载,可以尝试手动下载后放入对应目录:

mkdir -p subprojects/packagecache wget https://gitee.com/tinylab/qemu-berkeley-softfloat-3/-/archive/master/berkeley-softfloat-3.zip -O subprojects/packagecache/berkeley-softfloat-3.zip

2.3 解决测试用例版本不匹配

国内镜像可能存在版本滞后问题,导致测试用例失败。可以临时禁用相关测试:

编辑tests/fp/meson.build文件,注释掉以下部分:

# testfloat_comp = find_program('testfloat_gen', required: false) # if testfloat_comp.found() # ... # endif

3. 编译配置与优化

3.1 基本编译配置

创建一个构建目录并运行配置脚本:

mkdir build cd build ../configure

这将使用默认配置编译所有目标架构。对于大多数开发者,我们推荐更精确的配置:

../configure \ --target-list=arm-softmmu,arm-linux-user \ --enable-debug \ --enable-sdl \ --enable-gtk \ --enable-virtfs \ --enable-kvm \ --enable-vnc

常用配置选项说明:

选项说明
--target-list指定要编译的目标架构,减少编译时间
--enable-debug启用调试信息
--disable-strip禁止剥离符号,便于调试
--enable-kvm启用KVM加速支持
--enable-tools构建额外工具如qemu-img

3.2 高级优化配置

对于性能敏感的场景,可以添加以下优化选项:

../configure \ --extra-cflags="-O3 -march=native" \ --extra-ldflags="-Wl,--as-needed" \ --enable-lto

这些选项会:

  • 启用最高级别优化(-O3)
  • 针对当前CPU架构优化(-march=native)
  • 启用链接时优化(--enable-lto)

提示:优化编译可能需要更长时间和更多内存

4. 编译与安装

4.1 并行编译

使用make命令开始编译,-j参数指定并行任务数(通常设置为CPU核心数):

make -j$(nproc)

编译过程可能持续10-30分钟,取决于硬件配置。常见问题及解决方案:

  1. 内存不足:减少并行任务数make -j2
  2. 依赖缺失:根据错误信息安装缺失的开发包
  3. 测试失败:可以暂时跳过测试make -j$(nproc) || make -j1

4.2 安装到系统

编译完成后,安装到系统目录:

sudo make install

这将把QEMU可执行文件安装到/usr/local/bin,相关数据文件安装到/usr/local/share/qemu

4.3 验证安装

检查安装是否成功:

qemu-system-arm --version qemu-arm --version

预期输出类似:

QEMU emulator version 8.2.4 Copyright (c) 2003-2023 Fabrice Bellard and the QEMU Project developers

5. 常见问题解决

5.1 编译错误排查

问题1fatal error: gnutls/gnutls.h: No such file or directory

解决方案:安装缺失的开发包

sudo apt install libgnutls28-dev

问题2ERROR: Dependency "pixman-1" not found

解决方案:

sudo apt install libpixman-1-dev

问题3:测试用例失败

解决方案:可以临时禁用测试

../configure --disable-tests

5.2 运行时问题

问题1Could not initialize SDL - No available video device

解决方案:安装SDL视频驱动

sudo apt install libsdl2-2.0-0

或者使用其他显示后端:

qemu-system-arm -display gtk

问题2:KVM加速不可用

检查KVM支持:

lsmod | grep kvm

如果没有输出,需要加载内核模块:

sudo modprobe kvm sudo modprobe kvm_intel # Intel CPU # 或 sudo modprobe kvm_amd # AMD CPU

6. 进阶应用:交叉编译ARM程序

6.1 安装交叉编译工具链

sudo apt install gcc-arm-linux-gnueabi

验证安装:

arm-linux-gnueabi-gcc --version

6.2 编译测试程序

创建简单的Hello World程序hello.c

#include <stdio.h> int main() { printf("Hello from ARM!\n"); return 0; }

静态编译:

arm-linux-gnueabi-gcc -o hello hello.c -static

6.3 使用QEMU运行

用户模式运行:

qemu-arm hello

系统模式运行(需要内核和文件系统):

qemu-system-arm -M versatilepb -kernel zImage -dtb versatile-pb.dtb -initrd rootfs.cpio -append "console=ttyAMA0" -nographic

7. 源码修改与调试

7.1 添加调试输出

编辑system/main.c,在main函数开始处添加:

printf("QEMU starting at %s %s\n", __DATE__, __TIME__);

重新编译并验证:

make -j$(nproc) ./qemu-system-arm --version

7.2 使用GDB调试

编译时确保启用了调试信息:

../configure --enable-debug make -j$(nproc)

启动GDB调试:

gdb --args ./qemu-system-arm -M virt -kernel zImage

常用GDB命令:

  • break main:在main函数设置断点
  • run:启动程序
  • backtrace:查看调用栈
  • print variable:打印变量值

8. 性能优化建议

8.1 编译优化

  • 使用--enable-lto启用链接时优化
  • 针对特定CPU架构优化:--extra-cflags="-march=native"
  • 禁用不需要的功能减少二进制大小

8.2 运行时优化

  • 启用KVM加速:-enable-kvm
  • 使用多线程:-smp cores=4
  • 调整内存分配:-m 4096

8.3 监控与调优工具

  • perf:性能分析
  • strace:系统调用跟踪
  • valgrind:内存调试

9. 实际应用案例

9.1 嵌入式开发环境搭建

使用QEMU模拟ARM开发板:

qemu-system-arm -M vexpress-a9 -m 512M -kernel zImage -dtb vexpress-v2p-ca9.dtb -initrd rootfs.cpio.gz -append "console=ttyAMA0" -nographic

9.2 内核开发与测试

编译Linux内核:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- vexpress_defconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j$(nproc)

使用QEMU测试:

qemu-system-arm -M vexpress-a9 -m 512M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -append "console=ttyAMA0" -nographic

9.3 系统级仿真

模拟完整系统:

qemu-system-arm -M virt -cpu cortex-a15 -m 1024 -drive file=debian-arm.img,format=raw -device virtio-blk-device,drive=hd0 -device virtio-net-device,netdev=net0 -netdev user,id=net0

10. 资源与进阶学习

10.1 官方文档

  • QEMU官方文档
  • QEMU Wiki

10.2 社区资源

  • QEMU邮件列表
  • Stack Overflow QEMU标签

10.3 推荐书籍

  • 《QEMU/KVM虚拟化技术实战》
  • 《深入理解QEMU虚拟化技术》

通过本文的详细指导,你应该已经成功在Ubuntu 20.04上编译了QEMU 8.2.4,并掌握了解决常见问题的方法。QEMU作为强大的虚拟化工具,其应用场景远不止于此。建议从实际项目需求出发,继续探索QEMU的更多高级功能和优化技巧。

http://www.jsqmd.com/news/515061/

相关文章:

  • 使用Qt开发MiniCPM-V-2_6的本地图形化客户端
  • 从Altium Designer到KiCad:一份给硬件工程师的Gerber文件迁移避坑指南(附AD23设置)
  • AVR嵌入式内存调试库:轻量级RAM/Flash转储工具
  • FastAPI与WebSocket:构建实时聊天应用的完整指南
  • Nanbeige 4.1-3B保姆级教程:从Git克隆到像素光标跳动效果验证
  • 2026工业耐磨陶瓷研磨珠厂家权威推荐指南:锂电专用氧化锆珠/锂电研磨陶瓷珠/陶瓷研磨氧化锆珠/高性能陶瓷研磨珠/选择指南 - 优质品牌商家
  • STM32启动流程详解:复位向量、BOOT模式与VTOR重映射
  • 【超详细】黑白图像上色+旧照片修复实战,零基础吃透CNN图像着色全流程(附可运行代码)
  • ESP32 PCNT模块双通道配置实现高精度正交编码方向检测
  • 影墨·今颜小红书模型在互联网产品原型设计中的应用:快速生成用户故事与界面文案
  • Pixel Dimension Fissioner 提示词工程指南:从基础语法到高级控制
  • TensorFlow-v2.15镜像定制:5分钟打造专属AI开发环境
  • 基于STM32的家庭车库智能监控系统设计
  • YOLOv11目标检测模型与Qwen3-14B-AWQ的融合应用:智能图像描述与报告生成
  • 科学智能AI4S应用:人工智能加速加速抗生素发现(AIDD助力药物研发)
  • decimal.js实战:5个真实业务场景教你避免JS数字计算的坑(电商/游戏/金融)
  • 内存不够?看这里!AI写作大师Qwen3-4B低配置优化全攻略
  • OneWire_II:工业级单总线协议栈设计与实践
  • 医疗C语言编码规范失效实录(IEC 62304 Class C级缺陷大起底)
  • PFC6.0的循环加载功能最近被我们玩出花了,今天分享几个实战中特别实用的荷载模式。直接上硬菜,先看这个半正弦加载的骚操作
  • 参考文献崩了?AI论文软件千笔 VS 云笔AI,专为论文写作全流程设计!
  • GLM-OCR性能优化建议:图片预处理、提示词技巧、批量处理提升识别效率
  • 3步打造:苹果触控板的Windows终极适配方案
  • CosyVoice2声音克隆案例分享:电商广告、教学视频、客服语音制作
  • 川内消防维保品牌推荐适配酒店老旧系统升级:成都消防改造价格、成都消防维保、成都消防维修口碑、消防劳务、消防工程施工选择指南 - 优质品牌商家
  • 智能家居中枢:OpenClaw+ollama-QwQ-32B家庭自动化改造
  • GTE中文嵌入模型部署教程:Dockerfile构建与镜像体积优化技巧
  • Clawdbot参数详解:Qwen3:32B模型配置、context window设置与推理优化技巧
  • 西南公共建筑装饰与漏烟治理服务商推荐榜:成都厨房漏烟维修/抽油烟机漏烟/排气道漏烟/止回阀漏烟/漏烟上门维修/烟道漏烟改造工程/选择指南 - 优质品牌商家
  • 别再只盯着电机了!从扫地机器人到工业机械臂,聊聊不同场景下执行器的选型避坑指南