QEMU 笔记
我最近尝试了在 Gentoo 上用 QEMU 运行 Windows 10。 我想把过程中的一些细节记录在这里。
Gentoo Wiki 和 ArchWiki 上的 QEMU 条目也是很好的参考。
设置
安装 qemu-system-x86_64
。 启用编译选项 gtk
。
启用 Linux 内核中的 KVM
选项。
KVM 极大地提高虚拟机的运行效率。
创建磁盘镜像:
$ qemu-img create -f qcow2 win10.qcow2 20G
创建启动虚拟机的脚本文件 start.sh
:
#!/bin/bash
CMD="qemu-system-x86_64 "
CMD+="-M q35 "
CMD+="-accel kvm "
CMD+="-cpu host "
CMD+="-smp 4,sockets=1,cores=2,threads=2 "
CMD+="-m 4G "
CMD+="-hda win10.qcow2 "
CMD+="-cdrom Win10_1909_English_x64.iso "
CMD+="-net nic "
CMD+="-net user "
CMD+="-usb "
CMD+="-device usb-tablet "
CMD+="-rtc base=localtime "
CMD+="-display gtk "
CMD+="-daemonize "
CMD+="-name 'Windows 10' "
echo "$CMD" && eval "$CMD"
注:
-smp
选项应根据宿主机上的 CPU 的情况和虚拟机的需求而定。-m
选项应根据宿主机上的 RAM 的情况和虚拟机的需求而定。
运行此脚本并完成安装流程。 重启后可将 -cdrom
选项去除。
使用
可以用上述 start.sh
启动虚拟机。 打开 GTK 界面中的 “Grab on hover” 选项。
按 Ctrl+Alt+M 隐藏菜单, Ctrl+Alt+F 进入全屏。
注: 如果不隐藏菜单, 全屏显示可能有位移。 但隐藏菜单后, Ctrl+Alt+G 失效。
USB 设备
要在虚拟机中使用宿主机上的 USB 设备, 先找到设备的总线(bus)和设备(device)编号:
$ lsusb
Bus 001 Device 003: ID 04f2:b5ce Chicony Electronics Co., Ltd Integrated Camera
在 QEMU 的 GTK 界面中按 Ctrl+Alt+2 进入控制台。 使用 device_add
命令:
(qemu) device_add usb-host,hostbus=1,hostaddr=3,id=usb1
按 Ctrl+Alt+1 回到 VGA 显示。
要移除设备, 使用 device_del
命令:
(qemu) device_del usb1
用户需要有访问 USB 设备的权限(root, 或在 usb 组中)。
音频
我在 QEMU 的命令行中加上了 -soundhw all
后可以在虚拟机中播放声音。
效果比较差。 如果宿主机上有 PulseAudio, 可以参考 ArchWiki 中的描述。
镜像管理
在宿主机上挂载
宿主机上应安装有 nbd
和 ntfs
内核模块。
nbd
是一种在用户态中实现块设备的方式。
# modprobe nbd
# qemu-nbd -c /dev/nbd0 win10.qcow2 # 将 qcow2 映射为一个 nbd
# mount /dev/nbd0 /mnt/windows # 挂载 nbd
...
# umount /dev/nbd0
# qemu-nbd -d /dev/nbd0
扩张磁盘
我一开始使用了 10G 的磁盘镜像。 安装完后发现磁盘已满。 可以增加磁盘大小:
$ qemu-img resize win10.qcow2 +10G
然后调整分区大小, 在 Windows 中可以使用磁盘管理工具 (diskmgmt.msc
) 完成。
压缩镜像
当磁盘较大时, 即使虚拟机没有使用全部空间, 镜像文件也会随着使用越来越大。
此时可以压缩镜像。 做此操作前应先尽可能释放虚拟机中的空间,
例如删除不必要文件、进行磁盘清理 (cleanmgr
) 和映像清理。
用 qemu-img
创建磁盘镜像的副本:
$ mv win10.qcow2 win10.qcow2~
$ qemu-img convert -p -O qcow2 win10.qcow2~ win10.qcow2
另外, 也可加上 -c
选项, 这样还会对磁盘中已被占用的部分应用压缩算法。
启动虚拟机, 确认磁盘镜像无问题后, 可以删除旧的镜像。
后记
QEMU 的作者是 Fabrice Bellard。这人还有许多其他有名的作品,包括 FFmpeg (被广泛使用和抄袭的媒体编码程序库) 和 TinyCC。 他还发明了一种快速计算圆周率的算法,并曾以此成为世界纪录保持者。