Appearance
QEMU-KVM 虚拟化
why
使用 Windows 或 Linux 的过程中,经常可能遇到系统突然崩溃的情况,数据丢失无法复原,同时无法继续工作。要么排查解决问题,要么重装系统消除问题,要么重新换一台电脑,修复非常漫长、被动。
但凡涉及到重装或者换电脑,往往就需要一系列的工作环境恢复:配置电脑网络、安装常用软件并登录等等。时间非常久,导致我们的工作被拖延。
解决问题的一个方案,便是使用虚拟机。将我们所有的工作相关内容都转移到虚拟机系统中,定期生成快照,定期将快照文件转存。这样当我们虚拟机系统突然挂掉的时候,能快速地恢复到上一次快照的情况,同时无需再处理各种工作环境恢复的事情,增加了我们工作环境的可靠性。当我们宿主系统挂掉的时候,我们也可以在另一台电脑上导入快照并启动,同样快速恢复工作。
○ 概念
kvm
:虚拟化技术,底层实现。提供 cpu 和内存的虚拟化模拟,性能极高。
QUMU
:虚拟器,虚拟机硬件环境模拟(硬盘、网络等)。提供外围设备模拟,io 性能较高。
virtio
:虚拟机系统硬件驱动,实现和虚拟器实现高性能设备交互。其中 virtio-win 适用于 windows,安装过程中需要在 bus type 中设置,使其能读取到安装介质。
qxl
:windows 图形驱动,可实现调整界面分辨率
libvirt
:虚拟机系统管理工具
spice
:远程桌面访问虚拟机系统,高性能,支持 usb 重定向、剪切板共享
rdp客户端
:远程桌面访问
how
虚拟机方案比较多。如果宿主系统是 Windows,虚拟化引擎选择 Hyper-V,虚拟系统可以选择 WSL、VirtualBox、VMWare 管理。
如果宿主系统是 Linux,虚拟化引擎选择内核级 KVM,相比 Hyper-V,具有更高的 io 性能,同时虚拟机系统能直通 USB(便于 USB 加密的网银)。
本文选用了 KVM 方式来实现虚拟化,探索虚拟机带来的可靠性。
kvm 虚拟系统管理方式:
- 通过 virt-manager 导入旧配置,仍然需要一直点点点,麻烦
- 通过 qemu-kvm 命令启动则可以通过旧脚本一键启动
what
○ 宿主准备(以 Arch Linux 为例)
sh
# 检查 CPU 虚拟化支持
grep -E "svm|vmx" /proc/cpuinfo
LC_ALL=C.UTF-8 lscpu | grep Virtualization
# 检查系统内核是否加载了 KVM 模块
lsmod | grep kvm
# 升级系统,安装 qemu
paru
paru -S archlinux-keyring
paru -S qemu-full libvirt iptables-nft dnsmasq virt-manager ovmf bridge-utils openbsd-netcat
sudo systemctl enable --now libvirtd.service
sudo vim /etc/libvirt/libvirtd.conf
# 添加用户到组,拥有虚拟机使用权限
sudo usermod -aG libvirt $(whoami)
sudo usermod -aG kvm $(whoami)
○ Windows 11 虚拟系统
sh
# 创建镜像
sudo qemu-img create -f qcow2 ~/work/qemu/win11_24H2.qcow2 100G
# 安装系统到镜像
# 启动前,宿主虚拟机鼠标同步需要 usb=on 和 usb-tablet
# 安装前,禁止安全检测:shift+f10 -> regedit -> HKEY_LOCAL_MACHINE\SYSTEM\Setup -> 新建项 LabConfig -> 新建 DWORD32 的键 BypassTPMCheck BypassRAMCheck BypassSecureBootCheck,值都为 1
# 安装前,选择硬盘,Load Drivers -> E:\viostor\<os>\amd64
# 安装后,禁用网络设备:shift+f10 -> devmgmt.msc,安装完成后重新启用
# 安装后,禁用强制登录:shift+f10 -> oobe\bypassnro
# 启动后,安装驱动,运行光盘中的 virtio-win-guest-tools.exe
sudo qemu-system-x86_64 \
-enable-kvm \
-cpu host \
-smp 8 \
-m 16G \
-usb \
-device usb-tablet \
-drive file=~/work/qemu/win11_24H2.qcow2,index=0,media=disk,if=virtio \
-drive file=~/Downloads/Win11_24H2.iso,index=2,media=cdrom \
-drive file=~/Downloads/virtio-win.iso,index=3,media=cdrom
# 安装驱动,运行光盘中的 exe 安装 virtio/spice 驱动
qemu-img create -f qcow2 ~/work/qemu/dummy.qcow2 1G
sudo qemu-system-x86_64 \
-enable-kvm \
-cpu host \
-smp 8 \
-m 16G \
-usb \
-device usb-tablet \
-drive file=~/work/qemu/win11_24H2.qcow2,if=ide \
-drive file=~/work/qemu/dummy.qcow2,if=virtio \
-cdrom ~/Downloads/virtio-win.iso
# 启动系统,非 spice
# 暂不支持声音
# 暂不支持剪切板共享
sudo qemu-system-x86_64 \
-enable-kvm \
-cpu host \
-smp 8 \
-m 16G \
-nic user,model=virtio-net-pci \
-usb \
-device usb-tablet \
-vga none \
-device qxl-vga,vgamem_mb=32 \
-drive file=~/work/qemu/win11_24H2.qcow2,if=virtio \
# 启动系统,spice+qxl,流畅但模糊
# 支持声音
# 支持剪切板共享(spice)
# 后续:自启动 spice、usb 重定向或透传
# 此处腾讯元宝参考性强
sudo qemu-system-x86_64 \
-enable-kvm \
-cpu host \
-smp 8 \
-m 16G \
-nic user,model=virtio-net-pci \
-usb \
-device usb-tablet \
-device intel-hda \
-device hda-duplex \
-vga none \
-device qxl-vga,vgamem_mb=32 \
-device virtio-serial-pci \
-spice port=5930,disable-ticketing=on \
-device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 \
-chardev spicevmc,id=spicechannel0,name=vdagent \
-drive file=~/work/qemu/win11_24H2.qcow2,if=virtio
# spice 连接
paru -S spice-gtk
spicy -h localhost -p 5930
参考
- QEMU,非常详细,优先参考。虚拟机性能优化、virtio 驱动、spice 远程连接
- Arch安装KVM | SkyFish小小站
- 简单记录在服务器 Docker 上使用 Qemu 安装 Win11 🐱 ネコのメモ帳
- Windows 11 安装踩坑记 | 跳过安装阶段微软账号登录 | zhxy-CN の 小窝,虚拟机安装 Windows11 踩坑参考
- Manjaro/Arch Linux中安装使用QEMU/KVM/virt-manager运行虚拟机
- QEMU KVM学习笔记
- virtio-win.iso