Skip to content

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

参考

访问量 PV:Blocked用户数 UV:Blocked