QEMU 常用命令

QEMU 是一个开源的虚拟化软件,它能够模拟不同的硬件平台,让用户在不同的操作系统之间进行切换和测试。以下是 QEMU 常用命令的总结文档,包含每个命令的功能说明。

QEMU 安装

源码下载

压缩包方式

版本可以修改

cd qemu-build && wget  "https://download.qemu.org/qemu-8.0.2.tar.xz"
tar -xf qemu-8.0.2.tar.xz --strip-components=1 

Clone 方式

git clone https://gitlab.com/qemu-project/qemu.git
cd qemu
git submodule init
git submodule update --recursive

配置编译选项

./configure --target-list=riscv32-softmmu,riscv32-linux-user,riscv64-linux-user,riscv64-softmmu \
--enable-kvm \
--enable-debug \
--enable-sdl \
--prefix=/home/user/program/riscv64-qemu \
--python=/usr/bin/python3
# --python=python路径,如果提示默认python版本低,可以加这个参数
# --prefix 选项设置qemu的安装位置绝对路径,之后若要卸载删除qemu只要删除该文件夹即可,--enable-kvm开启kvm
# config完,可以在指定的qemu安装文件夹下面找到config-host.mak文件,
# 该文件记录着qemu配置的选项,可以和自己设置的进行对比,确保配置和自己已知

一些常用的编译选项

--enable-debug:编译调试版本,调试版本的运行速度非常慢
--disable-werror:忽略警告,否则任何编译警告都被视为编译错误
--enable-plugins:开启TCG Plugin支持
--disable-stack-protector:关闭QEMU自身的栈保护
--extra-cflags="-O3":能让你的QEMU提速5~10%,如果编译时报错,请加上`--disable-werror`
--prefix=<路径>:指定安装目录的路径
--target-list=<架构>:指定要编译的目标架构列表,例如 `x86_64-softmmu,arm-softmmu`。
--enable-<功能>:启用指定的功能。例如,`--enable-kvm` 启用 KVM 支持,`--enable-gtk` 启用 GTK 图形界面等。
--disable-<功能>:禁用指定的功能。
--enable-debug:启用调试模式,包括调试符号和调试输出。
--enable-virtfs:启用 virtio 文件系统支持。
--enable-modules:启用模块支持。
--disable-guest-agent:禁用客户机代理支持。
--enable-trace-backend=<后端>:指定跟踪后端,例如 `simple`、`log` 或 `dtrace`。
--disable-vhost-net:禁用 vhost-net 支持。

编译时输出.i 文件用于查看宏定义展开

$ ./configure  --extra-cflags="-save-temps"   --target-list=riscv64-linux-user,riscv64-softmmu --disable-werror  --python=/usr/bin/python3

启动虚拟机

以下命令用于启动虚拟机:

qemu-system-x86_64 -boot d -cdrom /path/to/iso -m 1024 -hda /path/to/hda.img
  • -boot d:从 CD/DVD 启动
  • -cdrom /path/to/iso:指定 ISO 文件的路径
  • -m 1024:设置虚拟机的内存大小为 1024MB
  • -hda /path/to/hda.img:指定虚拟硬盘的路径

安装系统至磁盘

qemu-system-x86_64 \
    -cdrom ~/Downloads/ubuntu.iso \
    -drive file=ubuntu.qcow2 \
    -enable-kvm \
    -cpu host \
    -smp cores=2,threads=2 \
    -m 2G \
    -vga virtio \
    -display sdl,gl=on 

网络配置

以下命令用于配置虚拟机的网络:

qemu-system-x86_64 -net nic -net user,hostfwd=tcp::2222-:22
  • -net nic:启用虚拟网卡
  • -net user:使用用户模式网络堆栈
  • hostfwd=tcp::2222-:22:将主机的 2222 端口转发到虚拟机的 22 端口

调试相关命令

启动调试模式

qemu-system-x86_64 -s -S
  • -s:启用 GDB 调试
  • -S:在启动时暂停虚拟机,等待调试器连接

输出调试日志

/home/user/develop/qemu/build/qemu-riscv64 -d in_asm,exec,cpu,strace -D ./log hello

QEMU 的 -d 参数说明

日志选项(用逗号分隔):

  • out_asm:显示每个已编译基本块生成的宿主汇编代码
  • in_asm:显示每个已编译基本块的目标汇编代码
  • op:显示每个已编译基本块的微操作
  • op_opt:显示优化后的微操作
  • op_ind:显示间接降低前的微操作
  • int:以简短格式显示中断/异常
  • exec:在每次执行基本块前显示跟踪(大量日志)
  • cpu:在进入基本块前显示 CPU 寄存器(大量日志)
  • fpu:在“cpu”日志中包含 FPU 寄存器
  • mmu:记录与 MMU 相关的活动
  • pcall:仅限 x86:显示保护模式下的远程调用/返回/异常
  • cpu_reset:在 CPU 重置前显示 CPU 状态
  • unimp:记录未实现的功能
  • guest_errors:当来宾操作系统执行无效操作(例如访问不存在的寄存器)时记录日志
  • page:在用户模式仿真开始时转储页面
  • nochain:不链式编译基本块,以便“exec”和“cpu”显示完整的跟踪
  • plugin:输出来自 TCG 插件的信息
  • strace:记录每个用户模式系统调用、其输入和结果
  • trace:PATTERN:启用跟踪事件

使用 "-d trace:help" 来获取跟踪事件列表。

qemu-system-xxx 常用相关参数

  • -M:指定 machine,-help 可以列出所有所支持的 machine
  • -cpu:指定模拟的 CPU 型号,例如 cortex-a57cortex-a53 等。
  • -smp:CPU 核数
  • -m:RAM 容量
  • -kernel:Linux kernel 文件
  • -append:Linux Kernel 的 bootargs。这个命令的参数很复杂,具体可以参考 kernel 文档。
  • -console:设备名必须和 machine 的串口一致,否则会看不到 kernel log。而不同的平台 console 名称都是不一样的,这是 Kernel 很不友好的一点。
  • -ignore_loglevel:可以让你看到尽可能多的 kernel log,当然也会减慢 kernel 的启动速度
  • -init:必须保证 initrd 里有/linuxrc 这个文件,否则会无法启动 shell
  • -initrd:指定 initrd 文件

快照管理

# 拍快照
qemu-img snapshot -c oe-rv-snapshot1  openEuler-22.09-riscv64-qemu.qcow2
# 列举快照
qemu-img snapshot-l openEuler-22.09-riscv64-qemu.qcow2
# 恢复快照
qemu-img snapshot -a my_snapshot mydisk.qcow2

查看虚拟硬盘信息

qemu-img info /path/to/image

将虚拟硬盘转换为 QCOW2 格式

qemu-img convert -O qcow2 /path/to/image /path/to/new/image

调整磁盘大小

qemu-img resize ubuntu.qcow2 +5G

显示器选项

qemu-system-x86_64 -vga std
qemu-system-x86_64 -display sdl
qemu-system-x86_64 -display gtk
  • -vga std:使用标准 VGA 显示器
  • -display sdl:使用 SDL 显示器
  • -display gtk:使用 GTK 显示器

输入选项

qemu-system-x86_64 -k en-us
qemu-system-x86_64 -usb
qemu-system-x86_64 -device usb-mouse
  • -k en-us:使用英文键盘布局
  • -usb:启用 USB 支持
  • -device usb-mouse:使用 USB 鼠标设备

声音选项

以下命令用于配置虚拟机的声音:

qemu-system-x86_64 -soundhw all
qemu-system-x86_64 -soundhw sb16
qemu-system-x86_64 -audiodev pa,id=pa1,out.mixing-engine=off
  • -soundhw all:启用所有声卡
  • -soundhw sb16:启用 SoundBlaster 16 声卡
  • -audiodev pa,id=pa1,out.mixing-engine=off:使用 PulseAudio 声音设备

USB 设备管理

以下命令用于管理虚拟机的 USB 设备:

qemu-system-x86_64 -usbdevice host:1234:5678
qemu-system-x86_64 -usbdevice tablet
qemu-system-x86_64 -usbdevice keyboard
  • -usbdevice host🔢5678:将主机的 USB 设备 1234:5678 分配给虚拟机
  • -usbdevice tablet:使用 USB 触摸板
  • -usbdevice keyboard:使用 USB 键盘