🌗使用指北-014-qemu入门

type
status
date
slug
summary
tags
category
icon
password

1. Qemu 架构

Qemu 是纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,我们最熟悉的就是能够模拟一台能够独立运行操作系统的虚拟机,虚拟机认为自己和硬件打交道,但其实是和 Qemu 模拟出来的硬件打交道,Qemu 将这些指令转译给真正的硬件。
正因为 Qemu 是纯软件实现的,所有的指令都要经 Qemu 过一手,性能非常低,所以,在生产环境中,大多数的做法都是配合 KVM 来完成虚拟化工作,因为 KVM 是硬件辅助的虚拟化技术,主要负责 比较繁琐的 CPU 和内存虚拟化,而 Qemu 则负责 I/O 虚拟化,两者合作各自发挥自身的优势,相得益彰。
notion image
从本质上看,虚拟出的每个虚拟机对应 host 上的一个 Qemu 进程,而虚拟机的执行线程(如 CPU 线程、I/O 线程等)对应 Qemu 进程的一个线程。下面通过一个虚拟机启动过程看看 Qemu 是如何与 KVM 交互的。

2. Qemu 源码结构

Qemu 软件虚拟化实现的思路是采用二进制指令翻译技术,主要是提取 guest 代码,然后将其翻译成 TCG 中间代码,最后再将中间代码翻译成 host 指定架构的代码,如 x86 体系就翻译成其支持的代码形式,ARM 架构同理。
notion image
所以,从宏观上看,源码结构主要包含以下几个部分:
  • /vl.c:最主要的模拟循环,虚拟机环境初始化,和 CPU 的执行。
  • /target-arch/translate.c:将 guest 代码翻译成不同架构的 TCG 操作码。
  • /tcg/tcg.c:主要的 TCG 代码。
  • /tcg/arch/tcg-target.c:将 TCG 代码转化生成主机代码。
  • /cpu-exec.c:主要寻找下一个二进制翻译代码块,如果没有找到就请求得到下一个代码块,并且操作生成的代码块。
其中,涉及的主要几个函数如下:
函数
路径
注释
main_loop
{/vl.c}
很多条件的判断,如电源是否断等
qemu_main_loop_start
{/cpus.c}
分时运行 CPU 核
struct CPUState
{/target-xyz/cpu.h}
CPU 状态结构体
cpu_exec
{/cpu-exec.c}
主要的执行循环
struct TranslationBlock
{/exec-all.h}
TB(二进制翻译代码块) 结构体
cpu_gen_code
{translate-all.c}
初始化真正代码生成
tcg_gen_code
{/tcg/tcg.c}
tcg 代码翻译成 host 代码
知道了这个总体的代码结构,再去具体了解每一个模块可能会相对容易一点。

3. Qemu 安装

3.1. 源码下载

3.2. 编译及安装

configure 脚本用于生成 Makefile,其选项可以用 ./configure --help 查看。

4. Qemu 基本使用

4.1. 创建虚拟机

  • 使用 qemu-img 创建虚拟机镜像
虚拟机镜像用来模拟虚拟机的硬盘,在启动虚拟机之前需要创建镜像文件。
  • f 选项用于指定镜像的格式,qcow2 格式是 Qemu 最常用的镜像格式,采用来写时复制技术来优化性能。test-vm-1.qcow2 是镜像文件的名字,10G 是镜像文件大小。镜像文件创建完成后,可使用 qemu-system-x86 来启动 x86 架构的虚拟机.
  • 使用 qemu-system-x86 来启动 x86 架构的虚拟机
因为 test-vm-1.qcow2 中并未给虚拟机安装操作系统,所以会提示 “No bootable device”,无可启动设备。
  • 启动 VM 安装操作系统镜像
  • m 指定虚拟机内存大小,默认单位是 MB;
  • enable-kvm 使用 KVM 进行加速;
  • cdrom 添加 fedora 的安装镜像。
可在弹出的窗口中操作虚拟机,安装操作系统,安装完成后重起虚拟机便会从硬盘 (test-vm-1.qcow2) 启动。之后再启动虚拟机只需要执行:

4.2. 创建虚拟磁盘

4.2.1. 创建

qemu-img 支持非常多种的文件格式,可以通过 qemu-img -h 查看。
其中 raw 和 qcow2 是比较常用的两种,raw 是 qemu-img 命令默认的,qcow2 是 qemu 目前推荐的镜像格式,是功能最多的格式。
此处可以使用 fdisk 对两种格式的磁盘进行格式化:
比如此处将 test.qcow2 格式化为两个分区。

4.2.2. 挂载

此处可以使用 qemu-nbd 来进行挂载。

5. 参考

  • 部分章节为本人原创。
中年码农的困境log-001-我与计算机