QEMU完全指南

QEMU完全指南:从入门到精通

  • QEMU完全指南
    • 引言
    • 一、QEMU是什么
      • [1.1 定义与概述](#1.1 定义与概述)
      • [1.2 核心功能](#1.2 核心功能)
      • [1.3 QEMU工作模式](#1.3 QEMU工作模式)
    • 二、QEMU的发展历史
      • [2.1 起源与早期发展](#2.1 起源与早期发展)
      • [2.2 关键时间节点](#2.2 关键时间节点)
      • [2.3 当前状态](#2.3 当前状态)
    • 三、QEMU的安装
    • 四、QEMU的基础使用
      • [4.1 系统模式基本用法](#4.1 系统模式基本用法)
        • [4.1.1 启动一个简单的x86虚拟机](#4.1.1 启动一个简单的x86虚拟机)
        • [4.1.2 参数详解](#4.1.2 参数详解)
      • [4.2 用户模式基本用法](#4.2 用户模式基本用法)
      • [4.3 常用磁盘镜像操作](#4.3 常用磁盘镜像操作)
        • [4.3.1 创建镜像](#4.3.1 创建镜像)
        • [4.3.2 查看镜像信息](#4.3.2 查看镜像信息)
        • [4.3.3 镜像格式转换](#4.3.3 镜像格式转换)
        • [4.3.4 调整镜像大小](#4.3.4 调整镜像大小)
    • 五、QEMU的高级配置
      • [5.1 网络配置](#5.1 网络配置)
        • [5.1.1 用户模式网络(SLIRP)](#5.1.1 用户模式网络(SLIRP))
        • [5.1.2 桥接网络](#5.1.2 桥接网络)
        • [5.1.3 TAP设备网络](#5.1.3 TAP设备网络)
      • [5.2 存储配置](#5.2 存储配置)
        • [5.2.1 virtio-blk(高性能存储)](#5.2.1 virtio-blk(高性能存储))
        • [5.2.2 使用多个磁盘](#5.2.2 使用多个磁盘)
        • [5.2.3 virtio-fs(共享文件夹)](#5.2.3 virtio-fs(共享文件夹))
      • [5.3 图形显示配置](#5.3 图形显示配置)
        • [5.3.1 VNC显示](#5.3.1 VNC显示)
        • [5.3.2 SPICE显示(推荐)](#5.3.2 SPICE显示(推荐))
        • [5.3.3 无图形模式(用于服务器)](#5.3.3 无图形模式(用于服务器))
      • [5.4 USB设备配置](#5.4 USB设备配置)
        • [5.4.1 添加USB设备](#5.4.1 添加USB设备)
        • [5.4.2 USB直通](#5.4.2 USB直通)
    • 六、QEMU与KVM结合
      • [6.1 检查KVM支持](#6.1 检查KVM支持)
      • [6.2 启用KVM](#6.2 启用KVM)
      • [6.3 KVM性能优化](#6.3 KVM性能优化)
    • 七、QEMU在嵌入式开发中的应用
      • [7.1 模拟ARM开发板](#7.1 模拟ARM开发板)
        • [7.1.1 树莓派模拟](#7.1.1 树莓派模拟)
        • [7.1.2 ARM Versatile Express](#7.1.2 ARM Versatile Express)
      • [7.2 模拟RISC-V](#7.2 模拟RISC-V)
      • [7.3 内核调试](#7.3 内核调试)
    • 八、QEMU管理工具
      • [8.1 libvirt与virsh](#8.1 libvirt与virsh)
      • [8.2 virt-manager(图形界面)](#8.2 virt-manager(图形界面))
      • [8.3 Vagrant与QEMU](#8.3 Vagrant与QEMU)
    • 九、踩坑总结
      • [9.1 常见问题与解决方案](#9.1 常见问题与解决方案)
      • [9.2 性能优化建议](#9.2 性能优化建议)
    • 十、实际应用案例
      • [10.1 搭建开发测试环境](#10.1 搭建开发测试环境)
      • [10.2 嵌入式系统开发](#10.2 嵌入式系统开发)
      • [10.3 安全研究环境](#10.3 安全研究环境)
    • 结束语

QEMU完全指南

引言

大家好!今天我们来深入探索一个在虚拟化和嵌入式开发领域大名鼎鼎的工具------QEMU。无论是做虚拟机开发、嵌入式系统调试,还是跨平台软件测试,QEMU都是一个不可或缺的强大工具。

在这篇文章中,我将带你全面了解QEMU,包括它是什么、发展历史、安装、配置、编译和运行等各个环节。让我们开始这场QEMU探索之旅吧!

一、QEMU是什么

1.1 定义与概述

QEMU(Quick EMUlator)是一款开源的硬件虚拟化模拟器动态二进制翻译器。它由Fabrice Bellard于2003年创建,现在由一个活跃的开源社区维护。

图 1: QEMU 项目图标

1.2 核心功能

QEMU主要提供以下功能:

  • 系统模拟:完整模拟整个计算机系统(CPU、内存、外设等)
  • 用户模式模拟:在一个架构上运行另一个架构的程序
  • 动态二进制翻译:实时翻译不同架构的机器码
  • 与KVM结合:支持硬件辅助虚拟化,提供接近原生的性能
  • 多种架构支持:x86、ARM、MIPS、PowerPC、RISC-V等

1.3 QEMU工作模式

模式 描述 用途
系统模式 模拟完整计算机系统 运行完整操作系统
用户模式 模拟单个程序 跨架构运行应用程序
加速模式 结合KVM/Xen/HAX 高性能虚拟化

二、QEMU的发展历史

2.1 起源与早期发展

QEMU由法国程序员Fabrice Bellard于2003年创建。Fabrice Bellard也是FFmpeg、Tiny C Compiler(TCC)等著名开源项目的作者。

2.2 关键时间节点

#mermaid-svg-m8kDV9X5p1rSKcok{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-m8kDV9X5p1rSKcok .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-m8kDV9X5p1rSKcok .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-m8kDV9X5p1rSKcok .error-icon{fill:#552222;}#mermaid-svg-m8kDV9X5p1rSKcok .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-m8kDV9X5p1rSKcok .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-m8kDV9X5p1rSKcok .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-m8kDV9X5p1rSKcok .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-m8kDV9X5p1rSKcok .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-m8kDV9X5p1rSKcok .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-m8kDV9X5p1rSKcok .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-m8kDV9X5p1rSKcok .marker{fill:#333333;stroke:#333333;}#mermaid-svg-m8kDV9X5p1rSKcok .marker.cross{stroke:#333333;}#mermaid-svg-m8kDV9X5p1rSKcok svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-m8kDV9X5p1rSKcok p{margin:0;}#mermaid-svg-m8kDV9X5p1rSKcok .edge{stroke-width:3;}#mermaid-svg-m8kDV9X5p1rSKcok .section--1 rect,#mermaid-svg-m8kDV9X5p1rSKcok .section--1 path,#mermaid-svg-m8kDV9X5p1rSKcok .section--1 circle,#mermaid-svg-m8kDV9X5p1rSKcok .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .section--1 text{fill:#ffffff;}#mermaid-svg-m8kDV9X5p1rSKcok .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-m8kDV9X5p1rSKcok .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .edge-depth--1{stroke-width:17;}#mermaid-svg-m8kDV9X5p1rSKcok .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m8kDV9X5p1rSKcok .lineWrapper line{stroke:#ffffff;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled,#mermaid-svg-m8kDV9X5p1rSKcok .disabled circle,#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:lightgray;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:#efefef;}#mermaid-svg-m8kDV9X5p1rSKcok .section-0 rect,#mermaid-svg-m8kDV9X5p1rSKcok .section-0 path,#mermaid-svg-m8kDV9X5p1rSKcok .section-0 circle,#mermaid-svg-m8kDV9X5p1rSKcok .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-m8kDV9X5p1rSKcok .section-0 text{fill:black;}#mermaid-svg-m8kDV9X5p1rSKcok .node-icon-0{font-size:40px;color:black;}#mermaid-svg-m8kDV9X5p1rSKcok .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-m8kDV9X5p1rSKcok .edge-depth-0{stroke-width:14;}#mermaid-svg-m8kDV9X5p1rSKcok .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-m8kDV9X5p1rSKcok .lineWrapper line{stroke:black;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled,#mermaid-svg-m8kDV9X5p1rSKcok .disabled circle,#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:lightgray;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:#efefef;}#mermaid-svg-m8kDV9X5p1rSKcok .section-1 rect,#mermaid-svg-m8kDV9X5p1rSKcok .section-1 path,#mermaid-svg-m8kDV9X5p1rSKcok .section-1 circle,#mermaid-svg-m8kDV9X5p1rSKcok .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .section-1 text{fill:black;}#mermaid-svg-m8kDV9X5p1rSKcok .node-icon-1{font-size:40px;color:black;}#mermaid-svg-m8kDV9X5p1rSKcok .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .edge-depth-1{stroke-width:11;}#mermaid-svg-m8kDV9X5p1rSKcok .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m8kDV9X5p1rSKcok .lineWrapper line{stroke:black;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled,#mermaid-svg-m8kDV9X5p1rSKcok .disabled circle,#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:lightgray;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:#efefef;}#mermaid-svg-m8kDV9X5p1rSKcok .section-2 rect,#mermaid-svg-m8kDV9X5p1rSKcok .section-2 path,#mermaid-svg-m8kDV9X5p1rSKcok .section-2 circle,#mermaid-svg-m8kDV9X5p1rSKcok .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .section-2 text{fill:#ffffff;}#mermaid-svg-m8kDV9X5p1rSKcok .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-m8kDV9X5p1rSKcok .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .edge-depth-2{stroke-width:8;}#mermaid-svg-m8kDV9X5p1rSKcok .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m8kDV9X5p1rSKcok .lineWrapper line{stroke:#ffffff;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled,#mermaid-svg-m8kDV9X5p1rSKcok .disabled circle,#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:lightgray;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:#efefef;}#mermaid-svg-m8kDV9X5p1rSKcok .section-3 rect,#mermaid-svg-m8kDV9X5p1rSKcok .section-3 path,#mermaid-svg-m8kDV9X5p1rSKcok .section-3 circle,#mermaid-svg-m8kDV9X5p1rSKcok .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .section-3 text{fill:black;}#mermaid-svg-m8kDV9X5p1rSKcok .node-icon-3{font-size:40px;color:black;}#mermaid-svg-m8kDV9X5p1rSKcok .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .edge-depth-3{stroke-width:5;}#mermaid-svg-m8kDV9X5p1rSKcok .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m8kDV9X5p1rSKcok .lineWrapper line{stroke:black;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled,#mermaid-svg-m8kDV9X5p1rSKcok .disabled circle,#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:lightgray;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:#efefef;}#mermaid-svg-m8kDV9X5p1rSKcok .section-4 rect,#mermaid-svg-m8kDV9X5p1rSKcok .section-4 path,#mermaid-svg-m8kDV9X5p1rSKcok .section-4 circle,#mermaid-svg-m8kDV9X5p1rSKcok .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .section-4 text{fill:black;}#mermaid-svg-m8kDV9X5p1rSKcok .node-icon-4{font-size:40px;color:black;}#mermaid-svg-m8kDV9X5p1rSKcok .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .edge-depth-4{stroke-width:2;}#mermaid-svg-m8kDV9X5p1rSKcok .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m8kDV9X5p1rSKcok .lineWrapper line{stroke:black;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled,#mermaid-svg-m8kDV9X5p1rSKcok .disabled circle,#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:lightgray;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:#efefef;}#mermaid-svg-m8kDV9X5p1rSKcok .section-5 rect,#mermaid-svg-m8kDV9X5p1rSKcok .section-5 path,#mermaid-svg-m8kDV9X5p1rSKcok .section-5 circle,#mermaid-svg-m8kDV9X5p1rSKcok .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .section-5 text{fill:black;}#mermaid-svg-m8kDV9X5p1rSKcok .node-icon-5{font-size:40px;color:black;}#mermaid-svg-m8kDV9X5p1rSKcok .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .edge-depth-5{stroke-width:-1;}#mermaid-svg-m8kDV9X5p1rSKcok .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m8kDV9X5p1rSKcok .lineWrapper line{stroke:black;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled,#mermaid-svg-m8kDV9X5p1rSKcok .disabled circle,#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:lightgray;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:#efefef;}#mermaid-svg-m8kDV9X5p1rSKcok .section-6 rect,#mermaid-svg-m8kDV9X5p1rSKcok .section-6 path,#mermaid-svg-m8kDV9X5p1rSKcok .section-6 circle,#mermaid-svg-m8kDV9X5p1rSKcok .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .section-6 text{fill:black;}#mermaid-svg-m8kDV9X5p1rSKcok .node-icon-6{font-size:40px;color:black;}#mermaid-svg-m8kDV9X5p1rSKcok .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .edge-depth-6{stroke-width:-4;}#mermaid-svg-m8kDV9X5p1rSKcok .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m8kDV9X5p1rSKcok .lineWrapper line{stroke:black;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled,#mermaid-svg-m8kDV9X5p1rSKcok .disabled circle,#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:lightgray;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:#efefef;}#mermaid-svg-m8kDV9X5p1rSKcok .section-7 rect,#mermaid-svg-m8kDV9X5p1rSKcok .section-7 path,#mermaid-svg-m8kDV9X5p1rSKcok .section-7 circle,#mermaid-svg-m8kDV9X5p1rSKcok .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .section-7 text{fill:black;}#mermaid-svg-m8kDV9X5p1rSKcok .node-icon-7{font-size:40px;color:black;}#mermaid-svg-m8kDV9X5p1rSKcok .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .edge-depth-7{stroke-width:-7;}#mermaid-svg-m8kDV9X5p1rSKcok .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m8kDV9X5p1rSKcok .lineWrapper line{stroke:black;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled,#mermaid-svg-m8kDV9X5p1rSKcok .disabled circle,#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:lightgray;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:#efefef;}#mermaid-svg-m8kDV9X5p1rSKcok .section-8 rect,#mermaid-svg-m8kDV9X5p1rSKcok .section-8 path,#mermaid-svg-m8kDV9X5p1rSKcok .section-8 circle,#mermaid-svg-m8kDV9X5p1rSKcok .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .section-8 text{fill:black;}#mermaid-svg-m8kDV9X5p1rSKcok .node-icon-8{font-size:40px;color:black;}#mermaid-svg-m8kDV9X5p1rSKcok .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .edge-depth-8{stroke-width:-10;}#mermaid-svg-m8kDV9X5p1rSKcok .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m8kDV9X5p1rSKcok .lineWrapper line{stroke:black;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled,#mermaid-svg-m8kDV9X5p1rSKcok .disabled circle,#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:lightgray;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:#efefef;}#mermaid-svg-m8kDV9X5p1rSKcok .section-9 rect,#mermaid-svg-m8kDV9X5p1rSKcok .section-9 path,#mermaid-svg-m8kDV9X5p1rSKcok .section-9 circle,#mermaid-svg-m8kDV9X5p1rSKcok .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .section-9 text{fill:black;}#mermaid-svg-m8kDV9X5p1rSKcok .node-icon-9{font-size:40px;color:black;}#mermaid-svg-m8kDV9X5p1rSKcok .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .edge-depth-9{stroke-width:-13;}#mermaid-svg-m8kDV9X5p1rSKcok .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m8kDV9X5p1rSKcok .lineWrapper line{stroke:black;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled,#mermaid-svg-m8kDV9X5p1rSKcok .disabled circle,#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:lightgray;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:#efefef;}#mermaid-svg-m8kDV9X5p1rSKcok .section-10 rect,#mermaid-svg-m8kDV9X5p1rSKcok .section-10 path,#mermaid-svg-m8kDV9X5p1rSKcok .section-10 circle,#mermaid-svg-m8kDV9X5p1rSKcok .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .section-10 text{fill:black;}#mermaid-svg-m8kDV9X5p1rSKcok .node-icon-10{font-size:40px;color:black;}#mermaid-svg-m8kDV9X5p1rSKcok .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .edge-depth-10{stroke-width:-16;}#mermaid-svg-m8kDV9X5p1rSKcok .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m8kDV9X5p1rSKcok .lineWrapper line{stroke:black;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled,#mermaid-svg-m8kDV9X5p1rSKcok .disabled circle,#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:lightgray;}#mermaid-svg-m8kDV9X5p1rSKcok .disabled text{fill:#efefef;}#mermaid-svg-m8kDV9X5p1rSKcok .section-root rect,#mermaid-svg-m8kDV9X5p1rSKcok .section-root path,#mermaid-svg-m8kDV9X5p1rSKcok .section-root circle{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-m8kDV9X5p1rSKcok .section-root text{fill:#ffffff;}#mermaid-svg-m8kDV9X5p1rSKcok .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-m8kDV9X5p1rSKcok .edge{fill:none;}#mermaid-svg-m8kDV9X5p1rSKcok .eventWrapper{filter:brightness(120%);}#mermaid-svg-m8kDV9X5p1rSKcok :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 2003 QEMU项目启动 2005 引入KVM支持 2008 QEMU 0.10发布,支持更多架构 2011 QEMU 1.0发布 2015 引入virtio 1.0支持 2018 QEMU 3.0发布,支持RISC-V 2021 QEMU 6.0发布 2023 QEMU 8.0发布 2024-至今 持续更新,性能优化 QEMU发展历程

2.3 当前状态

截至2026年,QEMU已经发展成为最流行的开源虚拟化解决方案之一,广泛应用于:

  • 云计算基础设施
  • 嵌入式系统开发
  • 跨平台软件测试
  • 安全研究和恶意软件分析

三、QEMU的安装

3.1 系统要求

在开始之前,我们需要确保系统满足以下要求:

  • 操作系统:Linux、Windows、macOS
  • 磁盘空间:至少2GB(用于QEMU和虚拟机镜像)
  • 内存:建议4GB以上(虚拟机额外内存)
  • 硬件虚拟化支持(可选但推荐):Intel VT-x或AMD-V

3.2 Linux系统安装

Ubuntu/Debian
bash 复制代码
# 更新软件包列表
sudo apt-get update

# 安装QEMU和常用工具
sudo apt-get install -y qemu-system-x86 qemu-system-arm \
    qemu-user qemu-utils bridge-utils virt-manager
Fedora/CentOS/RHEL
bash 复制代码
# 使用DNF安装
sudo dnf install -y qemu-system-x86 qemu-system-arm \
    qemu-user qemu-img bridge-utils virt-manager
Arch Linux
bash 复制代码
sudo pacman -S qemu-full

3.3 Windows系统安装

方式一:使用预编译二进制包
  1. 访问 QEMU官网
  2. 下载Windows版本安装程序
  3. 运行安装程序,按照向导完成安装
方式二:使用包管理器
powershell 复制代码
# 使用Chocolatey
choco install qemu

# 或使用Scoop
scoop install qemu

3.4 macOS系统安装

bash 复制代码
# 使用Homebrew安装
brew install qemu

# 或使用MacPorts
sudo port install qemu

3.5 从源代码编译安装

如果你需要最新功能或自定义配置,可以从源代码编译:

bash 复制代码
# 安装编译依赖
sudo apt-get install -y build-essential pkg-config libglib2.0-dev \
    libpixman-1-dev zlib1g-dev libaio-dev libcap-ng-dev \
    libattr1-dev libfdt-dev

# 克隆源码仓库
git clone https://gitlab.com/qemu-project/qemu.git
cd qemu

# 检查到稳定版本
git checkout v8.2.0

# 创建构建目录
mkdir build && cd build

# 配置(示例配置,可根据需要调整)
../configure \
    --prefix=/usr/local \
    --target-list=x86_64-softmmu,arm-softmmu,aarch64-softmmu \
    --enable-kvm \
    --enable-virtfs

# 编译
make -j$(nproc)

# 安装
sudo make install

四、QEMU的基础使用

4.1 系统模式基本用法

4.1.1 启动一个简单的x86虚拟机
bash 复制代码
# 创建一个空的磁盘镜像
qemu-img create -f qcow2 mydisk.qcow2 20G

# 从ISO安装系统
qemu-system-x86_64 \
    -m 2G \
    -smp 2 \
    -hda mydisk.qcow2 \
    -cdrom ubuntu-22.04-desktop-amd64.iso \
    -boot d \
    -enable-kvm
4.1.2 参数详解
复制代码
-m 2G              # 分配2GB内存
-smp 2             # 2个CPU核心
-hda mydisk.qcow2  # 第一块硬盘
-cdrom ubuntu.iso  # CD-ROM
-boot d            # 从CD启动(d=CD-ROM, c=硬盘)
-enable-kvm        # 启用KVM加速

4.2 用户模式基本用法

bash 复制代码
# 运行ARM程序(需要先安装qemu-user)
qemu-arm ./arm_program

# 带有动态库支持
qemu-arm -L /usr/arm-linux-gnueabihf ./arm_program

4.3 常用磁盘镜像操作

4.3.1 创建镜像
bash 复制代码
# 创建qcow2格式镜像(推荐)
qemu-img create -f qcow2 disk.qcow2 10G

# 创建raw格式镜像
qemu-img create -f raw disk.raw 10G

# 创建带后备镜像的qcow2(增量镜像)
qemu-img create -f qcow2 -b base.qcow2 delta.qcow2
4.3.2 查看镜像信息
bash 复制代码
# 查看镜像信息
qemu-img info disk.qcow2

# 检查镜像一致性
qemu-img check disk.qcow2
4.3.3 镜像格式转换
bash 复制代码
# 将raw转换为qcow2
qemu-img convert -f raw -O qcow2 disk.raw disk.qcow2

# 将vmdk转换为qcow2
qemu-img convert -f vmdk -O qcow2 disk.vmdk disk.qcow2
4.3.4 调整镜像大小
bash 复制代码
# 扩大镜像(先扩容,再在虚拟机内调整分区)
qemu-img resize disk.qcow2 +10G

五、QEMU的高级配置

5.1 网络配置

5.1.1 用户模式网络(SLIRP)
bash 复制代码
qemu-system-x86_64 \
    -m 2G \
    -hda disk.qcow2 \
    -netdev user,id=net0,hostfwd=tcp::2222-:22 \
    -device virtio-net-pci,netdev=net0

特点:

  • 无需root权限
  • 虚拟机可以访问外网
  • 宿主机可通过端口转发访问虚拟机
5.1.2 桥接网络
bash 复制代码
# 创建网桥(需要root权限)
sudo brctl addbr br0
sudo brctl addif br0 eth0
sudo dhclient br0

# 启动虚拟机使用网桥
qemu-system-x86_64 \
    -m 2G \
    -hda disk.qcow2 \
    -netdev bridge,id=net0,br=br0 \
    -device virtio-net-pci,netdev=net0
5.1.3 TAP设备网络
bash 复制代码
# 创建TAP设备
sudo tunctl -t tap0 -u $(whoami)
sudo brctl addif br0 tap0
sudo ifconfig tap0 up

# 启动虚拟机
qemu-system-x86_64 \
    -m 2G \
    -hda disk.qcow2 \
    -netdev tap,id=net0,ifname=tap0 \
    -device virtio-net-pci,netdev=net0

5.2 存储配置

5.2.1 virtio-blk(高性能存储)
bash 复制代码
qemu-system-x86_64 \
    -m 2G \
    -drive file=disk.qcow2,if=virtio,format=qcow2
5.2.2 使用多个磁盘
bash 复制代码
qemu-system-x86_64 \
    -m 2G \
    -drive file=os.qcow2,if=virtio,format=qcow2 \
    -drive file=data.qcow2,if=virtio,format=qcow2
5.2.3 virtio-fs(共享文件夹)
bash 复制代码
# 启动虚拟机,共享宿主机目录
qemu-system-x86_64 \
    -m 2G \
    -hda disk.qcow2 \
    -chardev socket,id=char0,path=vhost.sock \
    -device vhost-user-fs-pci,chardev=char0,tag=myfs \
    -object memory-backend-memfd,id=mem,size=2G,share=on \
    -numa node,memdev=mem

5.3 图形显示配置

5.3.1 VNC显示
bash 复制代码
qemu-system-x86_64 \
    -m 2G \
    -hda disk.qcow2 \
    -vnc :0
5.3.2 SPICE显示(推荐)
bash 复制代码
qemu-system-x86_64 \
    -m 2G \
    -hda disk.qcow2 \
    -spice port=5900,disable-ticketing
5.3.3 无图形模式(用于服务器)
bash 复制代码
qemu-system-x86_64 \
    -m 2G \
    -hda disk.qcow2 \
    -nographic \
    -serial mon:stdio

5.4 USB设备配置

5.4.1 添加USB设备
bash 复制代码
# 添加USB tablet(解决鼠标同步问题)
qemu-system-x86_64 \
    -m 2G \
    -hda disk.qcow2 \
    -usb \
    -device usb-tablet
5.4.2 USB直通
bash 复制代码
# 查看USB设备列表
lsusb

# 直通特定USB设备
qemu-system-x86_64 \
    -m 2G \
    -hda disk.qcow2 \
    -usb \
    -device usb-host,vendorid=0x1234,productid=0x5678

六、QEMU与KVM结合

6.1 检查KVM支持

bash 复制代码
# 检查CPU是否支持硬件虚拟化
egrep -c '(vmx|svm)' /proc/cpuinfo

# 检查KVM模块是否加载
lsmod | grep kvm

# 检查/dev/kvm权限
ls -l /dev/kvm

6.2 启用KVM

bash 复制代码
qemu-system-x86_64 \
    -m 2G \
    -smp 4 \
    -hda disk.qcow2 \
    -enable-kvm \
    -cpu host

6.3 KVM性能优化

bash 复制代码
qemu-system-x86_64 \
    -m 4G \
    -smp 8,sockets=1,cores=4,threads=2 \
    -cpu host,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time \
    -enable-kvm \
    -drive file=disk.qcow2,if=virtio,aio=native,cache=none \
    -netdev user,id=net0 \
    -device virtio-net-pci,netdev=net0 \
    -mem-prealloc \
    -overcommit mem-lock=on

七、QEMU在嵌入式开发中的应用

7.1 模拟ARM开发板

7.1.1 树莓派模拟
bash 复制代码
# 使用树莓派配置启动
qemu-system-arm \
    -M raspi2b \
    -m 1G \
    -kernel kernel7.img \
    -dtb bcm2709-rpi-2-b.dtb \
    -sd 2022-01-28-raspios-bullseye-armhf.img \
    -append "root=/dev/mmcblk0p2 rootwait console=ttyAMA0" \
    -serial stdio
7.1.2 ARM Versatile Express
bash 复制代码
qemu-system-arm \
    -M vexpress-a9 \
    -m 512M \
    -kernel zImage \
    -dtb vexpress-v2p-ca9.dtb \
    -sd rootfs.ext3 \
    -append "root=/dev/mmcblk0 rootwait console=ttyAMA0" \
    -serial stdio

7.2 模拟RISC-V

bash 复制代码
# RISC-V 64位系统
qemu-system-riscv64 \
    -M virt \
    -m 2G \
    -kernel fw_payload.elf \
    -drive file=rootfs.img,format=raw,id=hd0 \
    -device virtio-blk-device,drive=hd0 \
    -netdev user,id=net0 \
    -device virtio-net-device,netdev=net0 \
    -nographic

7.3 内核调试

bash 复制代码
# 启动虚拟机,等待GDB连接
qemu-system-x86_64 \
    -m 2G \
    -hda disk.qcow2 \
    -kernel vmlinuz \
    -append "root=/dev/sda1 console=ttyS0" \
    -S -s \
    -nographic

# 在另一个终端启动GDB
gdb vmlinux
(gdb) target remote :1234
(gdb) continue

八、QEMU管理工具

8.1 libvirt与virsh

bash 复制代码
# 安装libvirt
sudo apt-get install -y libvirt-daemon libvirt-clients virt-manager

# 定义虚拟机
virsh define myvm.xml

# 启动虚拟机
virsh start myvm

# 查看虚拟机状态
virsh list --all

# 关闭虚拟机
virsh shutdown myvm

8.2 virt-manager(图形界面)

bash 复制代码
# 安装virt-manager
sudo apt-get install -y virt-manager

# 启动virt-manager
virt-manager

8.3 Vagrant与QEMU

ruby 复制代码
# Vagrantfile示例
Vagrant.configure("2") do |config|
  config.vm.box = "generic/ubuntu2204"
  config.vm.provider :libvirt do |libvirt|
    libvirt.driver = "qemu"
    libvirt.memory = 2048
    libvirt.cpus = 2
  end
end

九、踩坑总结

9.1 常见问题与解决方案

  1. KVM不可用

    • 检查BIOS中是否启用了VT-x/AMD-V
    • 确认kvm模块已加载:lsmod | grep kvm
    • 检查/dev/kvm权限:sudo chmod 666 /dev/kvm
  2. 网络无法连接

    • 检查防火墙设置
    • 确认网卡驱动正确加载
    • 尝试使用不同的网络模式
  3. 虚拟机性能差

    • 启用KVM加速:-enable-kvm
    • 使用virtio设备
    • 分配足够的CPU和内存
  4. 鼠标不同步

    • 添加-usb -device usb-tablet
    • 使用SPICE或VNC客户端

9.2 性能优化建议

  • 使用qcow2镜像格式配合cache=none
  • 尽量使用virtio设备
  • 启用KVM硬件加速
  • 使用mem-prealloc预分配内存
  • 合理分配CPU核心数

十、实际应用案例

10.1 搭建开发测试环境

bash 复制代码
# 创建虚拟机
qemu-img create -f qcow2 dev-env.qcow2 50G

# 启动开发环境
qemu-system-x86_64 \
    -m 8G \
    -smp 8 \
    -hda dev-env.qcow2 \
    -cdrom ubuntu-22.04.iso \
    -enable-kvm \
    -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::8080-:8080 \
    -device virtio-net-pci,netdev=net0 \
    -fsdev local,id=work,path=/home/user/work,security_model=mapped \
    -device virtio-9p-pci,fsdev=work,mount_tag=work

10.2 嵌入式系统开发

bash 复制代码
# 启动ARM嵌入式系统
qemu-system-arm \
    -M vexpress-a9 \
    -m 512M \
    -kernel ./build/zImage \
    -dtb ./build/vexpress-v2p-ca9.dtb \
    -drive file=./build/rootfs.ext2,if=sd,format=raw \
    -append "console=ttyAMA0 root=/dev/mmcblk0 rootwait" \
    -serial stdio \
    -netdev tap,id=net0,ifname=tap0,script=no,downscript=no \
    -device virtio-net-device,netdev=net0

10.3 安全研究环境

bash 复制代码
# 创建一个隔离的分析环境
qemu-img create -f qcow2 -b base.qcow2 analysis-snapshot.qcow2

# 启动快照虚拟机
qemu-system-x86_64 \
    -m 4G \
    -hda analysis-snapshot.qcow2 \
    -enable-kvm \
    -netdev user,id=net0,restrict=yes \
    -device virtio-net-pci,netdev=net0 \
    -monitor stdio

结束语

恭喜你!现在你已经掌握了QEMU的核心使用方法。QEMU是一个功能极其强大的工具,它不仅可以用于虚拟化,还能在嵌入式开发、系统调试、安全研究等多个领域发挥重要作用。

回顾一下,我们学习了:

  1. QEMU的基本概念和发展历史
  2. 在不同平台上的安装方法
  3. 基础使用和高级配置
  4. 与KVM结合实现高性能虚拟化
  5. 在嵌入式开发中的应用
  6. 常用管理工具和实际案例

希望这篇文章对你有所帮助!如果你在使用QEMU过程中有任何问题,欢迎在评论区留言讨论。


参考资料


感谢阅读!如果觉得本文对你有帮助,请点赞、收藏、关注三连支持一下博主哦!

相关推荐
2301_777998342 小时前
磁盘与文件系统
linux
牟同學2 小时前
Ubuntu 18.04 升级至 22.04 LTS 完整指南
linux·ubuntu
qq_163135752 小时前
Linux 【05-rmdir命令超详细教程】
linux
qq_163135752 小时前
Linux 【02-cd命令超简教程】
linux
ShirleyWang0122 小时前
win11运行ubuntu报错
linux·运维·ubuntu
加油码2 小时前
Linux 进程详解:从进程状态、调度到程序替换
linux·服务器
DeeplyMind2 小时前
Linux 内核模块符号版本不匹配问题排查指南
linux·crc·module.symvers
qq_163135752 小时前
Linux查看组名
linux
烁3473 小时前
Linux简单脚本
linux·运维·服务器