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-a57
、cortex-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 键盘