机器环境
目前我是 Arch Linux 环境,下面是我的一份系统信息(部分信息已隐藏)
fastfetch
-` kun@moe
.o+` -------
`ooo/ OS: Arch Linux x86_64
`+oooo: Host:
`+oooooo: Kernel: Linux 6.18.13-zen1-1-zen
-+oooooo+: Uptime: 9 hours, 17 mins
`/:-:++oooo+: Packages: 2175 (pacman)
`/++++/+++++++: Shell: zsh 5.9
`/++++++++++++++: Display: 3840x2160 @ 1.5x in 27", 120 Hz [External]
`/+++ooooooooooooo/` DE: KDE Plasma 6.5.1
./ooosssso++osssssso+` WM: KWin (Wayland)
.oossssso-````/ossssss+` WM Theme: Wind
-osssssso. :ssssssso. Theme: Breeze (Sweet) [Qt], Breeze-Dark [GTK2], Breeze [GTK3]
:osssssss/ osssso+++. Icons: candy-icons [Qt], candy-icons [GTK2/3/4]
/ossssssss/ +ssssooo/- Font: Noto Sans (11pt) [Qt], Noto Sans (11pt) [GTK2/3/4]
`/ossssso+/:- -:/+osssso+- Cursor: Sweet (24px)
`+sso+:-` `.-/+oso: Terminal: konsole 25.12.2
`++:. `-/+/ Terminal Font: Hack (12pt)
.` `/ CPU: AMD Ryzen 9 9950X3D (32) @ 5.76 GHz
GPU 1: AMD Radeon Graphics [Integrated]
GPU 2: NVIDIA RTX PRO 6000 Blackwell
Memory: 180.00 GiB / 241.32 GiB (75%)
Swap: 4.72 GiB / 64.00 GiB (7%)
Disk (/): 2.12 TiB / 7.24 TiB (29%) - btrfs
Local IP (enp16s0): 192.168.0.96/24
Locale: en_US.UTF-8
基础知识
在开始之前,让我们明确下面的几个基础知识
光标加速放大 Shake to Find
启动虚拟机之后,在虚拟机稍微晃动光标就会导致光标变得很大,很不适应
这是 KDE 的鼠标加速光标放大功能,叫做 Shake to Find
可以在 系统设置 -> Mouse -> Cursor -> 取消 Shake to locate pointer
这个功能本意是帮助用户快速找到光标位置,但是在这个场景太令人困惑了
什么是 CoW
CoW 即写时复制(Copy on Write)
传统文件系统写入数据时,会直接覆盖原有数据块,而 CoW 的策略是
- 修改数据时,不覆盖原位置,而是将新数据写入一块新的空闲区域
- 写入成功后,再更新元数据中的指针,指向新位置
- 旧数据块随后被标记为可回收
这带来了一个关键特性,在新数据完全写入之前,旧数据始终完好保留,天然避免了"写到一半断电"导致的数据损坏
btrfs
Btrfs(B-tree Filesystem)是 Linux 下的一个 CoW 文件系统
CoW 并非没有代价,写放大与碎片每次修改都写新位置,长期运行后文件的物理块会越来越分散,产生碎片,对机械硬盘的随机读性能影响较大(但是这里我是 SSD),需要定期 defragment
它不适合数据库等随机小写场景,数据库通常自己管理 WAL 和事务,Btrfs 的 CoW 会与之叠加,造成严重的写放大
下面的装虚拟机也是这个思路,CoW 可能造成虚拟机文件块大小对不齐,从而导致无法创建虚拟机,这个问题到现在我还在疑惑(但是下面的安装过程规避了这一点)
VirtIO 是什么
VirtIO 是一套半虚拟化(paravirtualization)设备标准
普通虚拟化的问题在于,QEMU 默认会模拟真实硬件(比如 Intel e1000 网卡、IDE 控制器),Guest OS 用标准驱动驱动这些"假硬件",每次 I/O 都要经过完整的硬件模拟层,开销很大
VirtIO 的思路是:既然 Guest 知道自己在虚拟机里,不如用一套专为虚拟化设计的精简协议直接和 Host 通信,跳过硬件模拟,大幅降低 I/O 开销
普通模拟: Guest驱动 -> 模拟硬件层 -> QEMU -> Host内核
VirtIO: Guest驱动 -> VirtIO协议 -> Host内核(几乎直通)
在 Arch + QEMU 装 Windows 10 这个场景下 VirtIO 有什么用
Windows 没有内置 VirtIO 驱动,需要额外安装,但装了之后各方面性能提升明显
| 设备 | 默认模拟 | VirtIO 替代 | 效果 |
|---|---|---|---|
| 磁盘 | IDE / SATA | virtio-blk / virtio-scsi |
磁盘吞吐大幅提升 |
| 网卡 | e1000 / rtl8139 | virtio-net |
网络延迟降低、带宽提升 |
| 显存/显示 | VGA / QXL | virtio-gpu |
2D 性能改善(3D 用 vfio 另说) |
| 内存 | 固定分配 | virtio-balloon |
允许宿主机动态回收虚拟机内存 |
| 随机数 | 无 | virtio-rng |
给 Guest 提供高质量随机数 |
还有其他的小提升
某些情况下你可能想把虚拟机的硬盘的 Device type 改为 VirtIO,但是实测之后这是不行的,否则启动的时候会报下面的错误
BdsDxe: failed to start Boot0002 "UEFI QEMU DUD-ROM QM00003" from PciRoot (0x0)/Pci (0x1F, 0x2)/Data(0x1,0xFFFF,0x0): Time out
PXE-E16: No valid offer received
似乎只能设置为 SATA,如果你的安装也碰到了这个错误,不妨保持 SATA 不变
UEFI 是什么
UEFI(Unified Extensible Firmware Interface)是计算机启动时运行的固件接口,是老式 BIOS 的替代品
计算机开机流程
上电 -> 固件(UEFI/BIOS)初始化硬件 -> 找到启动设备 -> 加载操作系统
UEFI 相比 BIOS 的主要进步
- 支持 GPT 分区表(突破 2TB 启动盘限制)
- 支持 Secure Boot(验证启动链签名)
- 有图形界面,支持鼠标操作
- 启动速度更快
- 支持 64 位环境,可直接访问更大内存
在虚拟机里,OVMF 就是 UEFI 的开源实现,专门给 QEMU/KVM 用。
在当前场景下的优点
- Windows 10 原生支持 UEFI,体验更完整
微软从 Windows 8 开始推 UEFI,Windows 10 在 UEFI 模式下才能完整使用 Secure Boot、TPM 2.0 等功能
我们接下来会在自定义安装配时配 TPM 模拟,UEFI + TPM 组合是 Windows 10 的推荐环境
- GPT 分区,磁盘管理更规范
UEFI 模式下 Windows 会用 GPT 分区表,相比 MBR 支持更多分区,且是现代 Windows 的标准做法
还有一些其他无关紧要的提升,总之是可以使用的
安装步骤
只需要跟着下面的步骤走完即可安装完成 Windows 10 操作系统
安装必要的包
sudo pacman -S qemu-full virt-manager virt-viewer dnsmasq vde2 openbsd-netcat edk2-ovmf swtpm
paru -S bridge-utils
- qemu-full qemu 相关的支持
- virt-manager 图形化的虚拟机管理程序
- virt-viewer 命令行的虚拟机管理程序
libvirt
启动 libvirt
sudo systemctl enable libvirtd
sudo systemctl start libvirtd
把当前用户加入 libvirt 组
sudo usermod -aG libvirt $USER
然后重新登录或执行
newgrp libvirt
验证
virsh list --all
如果没有报错就证明没有问题
下载相关的镜像
下面我们要下载两个镜像,Windows 10 ISO 和 virtio 的 ISO
Windows 10 ISO: https://www.microsoft.com/en-us/software-download/windows10 (需要填写几个问题)
VirtIO ISO: https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/
virtio-win.iso 是 KVM 的 Windows 驱动集合
创建虚拟机
接下来打开 Virtual Machine Manager 这个软件,左上角 New
弹出一个窗口,直接选择 Local install media (ISO),然后 Forword
然后输入镜像 ISO 文件的所在路径,比如 /home/kun/vm/Win10_22H2_EnglishInternational_x64v1.iso
virt manager 会自动检测镜像文件的操作系统,这里给我检测为 Windows 11 的镜像了,实际上我是 Windows 10,但是这里并不能直接选择对应的镜像,就将就用 Windows 11 了
但是,我们接下来要勾选上 Customize configuration before install ,安装之后弹出的界面,点击 OS information 这个 tab,可以在这里将自动识别的操作系统改为 Windows 10
内存和 CPU 核心数我的设置为 32768 和 16,硬盘这里选择了 1024 GiB
这里的 Network 选择 `Virtual network ‘default’: NAT 即可
最后的 Ready to begin the installation 中,必须要勾选上 Customize configuration before install,以便接下来进入高级界面进行一些自定义的虚拟机配置
启用 UEFI
UEFI 是通过 edk2-ovmf 这个包提供的,我们刚才已经安装过这个包了
进入 Overview → Firmware,选择 UEFI x86_64: /usr/share/edk2/x64/OVMF_CODE.fd ,没有这个就选择 UEFI 即可
网络设置
这里默认是 e1000,不要选择 e1000,我们选择
Network source: default
Device model: virtio
挂载 VirtIO
点击 Add Harkware ,然后这样添加

TPM 2.0
点击 TPM vNone,设置为
Type: Emulator
Model: TIS
Version: 2.0
Video QXL
这里选择 VirtIO,并勾选 3D acceleration
更改完之后这里会变为 Video VirtIO
SATA Disk 1
Disk bus 改为 VirtIO,改完之后 SATA Disk 1 会变为 VirtIO Disk 1
Cache mode 改为 none
Discard model 保持 unmap
CPU
CPU 这里的 `Copy host CPU configuration (host-passthrough) 要打开,我这里默认是勾选的
btrfs 的一点问题
如果宿主机是 btrfs,比如我,就需要删除默认创建的 SATA Device 1,然后手动创建一个磁盘镜像并绑定,否则就会报错
Unable to complete install: 'internal error: QEMU unexpectedly closed the monitor (vm='windows10'): 2026-03-10T10:13:29.480577Z qemu-system-x86_64: -device {"driver":"virtio-blk-pci","bus":"pci.4","addr":"0x0","drive":"libvirt-1-storage","id":"virtio-disk0","write-cache":"on"}: Cannot get 'write' permission without 'resize': Image size is not a multiple of request alignment'
Traceback (most recent call last):
File "/usr/share/virt-manager/virtManager/asyncjob.py", line 67, in cb_wrapper
callback(asyncjob, *args, **kwargs)
~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/share/virt-manager/virtManager/createvm.py", line 1969, in _do_async_install
installer.start_install(guest, meter=meter)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
File "/usr/share/virt-manager/virtinst/install/installer.py", line 722, in start_install
domain = self._create_guest(guest, meter, initial_xml, final_xml, doboot, transient)
File "/usr/share/virt-manager/virtinst/install/installer.py", line 664, in _create_guest
domain = self.conn.createXML(initial_xml or final_xml, 0)
File "/usr/lib/python3.14/site-packages/libvirt.py", line 4599, in createXML
raise libvirtError('virDomainCreateXML() failed')
libvirt.libvirtError: internal error: QEMU unexpectedly closed the monitor (vm='windows10'): 2026-03-10T10:13:29.480577Z qemu-system-x86_64: -device {"driver":"virtio-blk-pci","bus":"pci.4","addr":"0x0","drive":"libvirt-1-storage","id":"virtio-disk0","write-cache":"on"}: Cannot get 'write' permission without 'resize': Image size is not a multiple of request alignment
输入下面的命令创建镜像文件
sudo qemu-img create -f qcow2 /var/lib/libvirt/images/windows10.qcow2 80G
查看一下信息
sudo qemu-img info /var/lib/libvirt/images/windows10.qcow2
会有类似于下面的输出
image: /var/lib/libvirt/images/windows10.qcow2
file format: qcow2
virtual size: 80 GiB (85899345920 bytes)
disk size: 196 KiB
cluster_size: 65536
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: false
refcount bits: 16
corrupt: false
extended l2: false
Child node '/file':
filename: /var/lib/libvirt/images/windows10.qcow2
protocol type: file
file length: 194 KiB (198144 bytes)
disk size: 196 KiB
然后点击 Add Hardware 来挂载一下这个镜像,配置是这样的

之后记得将 Boot Options 里面的 Boot Device Order 改为 VirtIO Disk 2
完成
配置完上面的所有内容之后,点击一下左上角的 Begin Installation 就可以开始安装 Windows 10 了
新的配置
上面的一份配置在我的系统上运行起来会有各种问题,主要是因为显卡的问题以及 dae 的问题
除了显卡和 dae,我的系统使用了 btrfs,根据一开始我们的观点,这可能会导致一些虚拟机的性能问题,因此我禁用掉了下面两个目录的 CoW
chattr +C /var/lib/libvirt/images/ # 放置了 virt 默认的镜像存储位置,我这里设置为了 raw,是 .img 文件
chattr +C /home/kun/vm # 放置了下载好的官方 Windows 10 镜像以及 VirtIO 镜像
下面提供一份完整的 xml 配置参考文件
Details
<domain type="kvm">
<name>windows10</name>
<uuid>49386cde-9ef6-4347-a65f-5e45470b44b2</uuid>
<metadata>
<libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
<libosinfo:os id="http://microsoft.com/win/10"/>
</libosinfo:libosinfo>
</metadata>
<memory unit="KiB">33554432</memory>
<currentMemory unit="KiB">33554432</currentMemory>
<vcpu placement="static">16</vcpu>
<os firmware="efi">
<type arch="x86_64" machine="pc-q35-10.2">hvm</type>
<firmware>
<feature enabled="no" name="enrolled-keys"/>
<feature enabled="yes" name="secure-boot"/>
</firmware>
<loader readonly="yes" secure="yes" type="pflash" format="raw">/usr/share/edk2/x64/OVMF_CODE.secboot.4m.fd</loader>
<nvram template="/usr/share/edk2/x64/OVMF_VARS.4m.fd" templateFormat="raw" format="raw">/var/lib/libvirt/qemu/nvram/windows10_VARS.fd</nvram>
<boot dev="hd"/>
</os>
<features>
<acpi/>
<apic/>
<hyperv mode="custom">
<relaxed state="on"/>
<vapic state="on"/>
<spinlocks state="on" retries="8191"/>
<vpindex state="on"/>
<runtime state="on"/>
<synic state="on"/>
<stimer state="on"/>
<frequencies state="on"/>
<tlbflush state="on"/>
<ipi state="on"/>
<avic state="on"/>
</hyperv>
<vmport state="off"/>
<smm state="on"/>
</features>
<cpu mode="host-passthrough" check="none" migratable="on"/>
<clock offset="localtime">
<timer name="rtc" tickpolicy="catchup"/>
<timer name="pit" tickpolicy="delay"/>
<timer name="hpet" present="no"/>
<timer name="hypervclock" present="yes"/>
</clock>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<pm>
<suspend-to-mem enabled="no"/>
<suspend-to-disk enabled="no"/>
</pm>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type="file" device="disk">
<driver name="qemu" type="raw"/>
<source file="/var/lib/libvirt/images/windows10.img"/>
<target dev="sda" bus="sata"/>
<address type="drive" controller="0" bus="0" target="0" unit="0"/>
</disk>
<disk type="file" device="cdrom">
<driver name="qemu" type="raw"/>
<source file="/home/kun/vm/Win10_22H2_EnglishInternational_x64v1.iso"/>
<target dev="sdb" bus="sata"/>
<readonly/>
<address type="drive" controller="0" bus="0" target="0" unit="1"/>
</disk>
<disk type="file" device="cdrom">
<driver name="qemu" type="raw"/>
<source file="/home/kun/vm/virtio-win-0.1.285.iso"/>
<target dev="sdc" bus="sata"/>
<readonly/>
<address type="drive" controller="0" bus="0" target="0" unit="2"/>
</disk>
<controller type="usb" index="0" model="qemu-xhci" ports="15">
<address type="pci" domain="0x0000" bus="0x02" slot="0x00" function="0x0"/>
</controller>
<controller type="pci" index="0" model="pcie-root"/>
<controller type="pci" index="1" model="pcie-root-port">
<model name="pcie-root-port"/>
<target chassis="1" port="0x10"/>
<address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x0" multifunction="on"/>
</controller>
<controller type="pci" index="2" model="pcie-root-port">
<model name="pcie-root-port"/>
<target chassis="2" port="0x11"/>
<address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x1"/>
</controller>
<controller type="pci" index="3" model="pcie-root-port">
<model name="pcie-root-port"/>
<target chassis="3" port="0x12"/>
<address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x2"/>
</controller>
<controller type="pci" index="4" model="pcie-root-port">
<model name="pcie-root-port"/>
<target chassis="4" port="0x13"/>
<address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x3"/>
</controller>
<controller type="pci" index="5" model="pcie-root-port">
<model name="pcie-root-port"/>
<target chassis="5" port="0x14"/>
<address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x4"/>
</controller>
<controller type="pci" index="6" model="pcie-root-port">
<model name="pcie-root-port"/>
<target chassis="6" port="0x15"/>
<address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x5"/>
</controller>
<controller type="pci" index="7" model="pcie-root-port">
<model name="pcie-root-port"/>
<target chassis="7" port="0x16"/>
<address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x6"/>
</controller>
<controller type="pci" index="8" model="pcie-root-port">
<model name="pcie-root-port"/>
<target chassis="8" port="0x17"/>
<address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x7"/>
</controller>
<controller type="pci" index="9" model="pcie-root-port">
<model name="pcie-root-port"/>
<target chassis="9" port="0x18"/>
<address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x0" multifunction="on"/>
</controller>
<controller type="pci" index="10" model="pcie-root-port">
<model name="pcie-root-port"/>
<target chassis="10" port="0x19"/>
<address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x1"/>
</controller>
<controller type="pci" index="11" model="pcie-root-port">
<model name="pcie-root-port"/>
<target chassis="11" port="0x1a"/>
<address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x2"/>
</controller>
<controller type="pci" index="12" model="pcie-root-port">
<model name="pcie-root-port"/>
<target chassis="12" port="0x1b"/>
<address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x3"/>
</controller>
<controller type="pci" index="13" model="pcie-root-port">
<model name="pcie-root-port"/>
<target chassis="13" port="0x1c"/>
<address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x4"/>
</controller>
<controller type="pci" index="14" model="pcie-root-port">
<model name="pcie-root-port"/>
<target chassis="14" port="0x1d"/>
<address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x5"/>
</controller>
<controller type="sata" index="0">
<address type="pci" domain="0x0000" bus="0x00" slot="0x1f" function="0x2"/>
</controller>
<controller type="virtio-serial" index="0">
<address type="pci" domain="0x0000" bus="0x03" slot="0x00" function="0x0"/>
</controller>
<interface type="network">
<mac address="52:54:00:20:b4:39"/>
<source network="default"/>
<model type="virtio"/>
<address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/>
</interface>
<serial type="pty">
<target type="isa-serial" port="0">
<model name="isa-serial"/>
</target>
</serial>
<console type="pty">
<target type="serial" port="0"/>
</console>
<channel type="spicevmc">
<target type="virtio" name="com.redhat.spice.0"/>
<address type="virtio-serial" controller="0" bus="0" port="1"/>
</channel>
<input type="tablet" bus="virtio">
<address type="pci" domain="0x0000" bus="0x05" slot="0x00" function="0x0"/>
</input>
<input type="mouse" bus="ps2"/>
<input type="keyboard" bus="ps2"/>
<tpm model="tpm-tis">
<backend type="emulator" version="2.0"/>
</tpm>
<graphics type="spice" autoport="yes">
<listen type="address"/>
<image compression="off"/>
<jpeg compression="never"/>
<zlib compression="never"/>
<playback compression="off"/>
<streaming mode="off"/>
</graphics>
<sound model="ich9">
<address type="pci" domain="0x0000" bus="0x00" slot="0x1b" function="0x0"/>
</sound>
<audio id="1" type="spice"/>
<video>
<model type="virtio" heads="1" primary="yes">
<acceleration accel3d="no"/>
</model>
<address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x0"/>
</video>
<redirdev bus="usb" type="spicevmc">
<address type="usb" bus="0" port="2"/>
</redirdev>
<redirdev bus="usb" type="spicevmc">
<address type="usb" bus="0" port="3"/>
</redirdev>
<watchdog model="itco" action="reset"/>
<memballoon model="virtio">
<address type="pci" domain="0x0000" bus="0x04" slot="0x00" function="0x0"/>
</memballoon>
</devices>
</domain>
这个配置文件里面下面几点需要特别说明
virt-manager 配置
我更改了 virt-manager 的配置,包括支持编辑 xml,默认 UEFI 等
在 General 里将 Enable XML Editing 勾选,然后在 NewVM 中将它改为这样

VirtISO 是一个 CDROM
简而言之,需要将挂载的 VirtIO 镜像改成这样,这样才能在 Windows 安装完毕之后识别到(这里会识别为一个外置的光盘 Read-Only Mamory)

附带一份 XML
<disk type="file" device="cdrom">
<driver name="qemu" type="raw"/>
<source file="/home/kun/vm/virtio-win-0.1.285.iso" index="1"/>
<backingStore/>
<target dev="sdc" bus="sata"/>
<readonly/>
<alias name="sata0-0-2"/>
<address type="drive" controller="0" bus="0" target="0" unit="2"/>
</disk>
Windows 10 安装好之后
安装 Windows 10 的过程太简单这里就不叙述了
安装好之后设备管理器这里会有感叹号,这是因为还没有安装 VirtIO 相关的驱动

这里我们看到管理器中有一个 CD Drive,这就是 VirtIO,点进去之后运行 virtio-win-guest-tools.exe 即可

安装完之后设备管理器的感叹号就会消失
安装好之后机器的分辨率可能很低,调高一点即可
Windows 10 虚拟机没有网络
这个问题真的折腾了好久,先说结论,是因为我的 libvirt 网络规则没有被写入 iptables
比如我这里下面两条命令在连不上网时什么都没有输出
sudo iptables -t nat -L -n -v | grep 122
sudo iptables -L FORWARD -n -v | grep virbr0
修复好了大概会变成这样
sudo iptables -t nat -L -n -v | grep 122
0 0 MASQUERADE all -- * * 192.168.122.0/24 !192.168.122.0/24
sudo iptables -L FORWARD -n -v | grep virbr0
0 0 ACCEPT all -- * virbr0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0
下面来说一说如何排查 Windows 10 安装好之后没有网络的问题
Windows 下检查 ip
ipconfig
如果显示 169.254.x.x,说明 DHCP 没有分配到地址
再看一下 default 网络的状态,如果 default 网络显示 inactive,就需要启动它
sudo virsh net-start default
sudo virsh net-autostart default
如果 default 网络已经是 active,检查宿主机上的 NAT 转发是否开启,检查 IP 转发
cat /proc/sys/net/ipv4/ip_forward
应该输出 1,如果是 0 则执行
sudo sysctl -w net.ipv4.ip_forward=1
同时确认 virbr0 网桥存在
ip link show virbr0
如果上面都正常,在 Windows 10 里手动续租
ipconfig /release
ipconfig /renew
iptables NAT 规则配置
如果你的 IP 地址、网关、转发都正常,那么问题可能在于iptables NAT 规则
sudo iptables -t nat -L POSTROUTING -n -v
正常情况应该有一条类似这样的规则
Name State Autostart Persistent
--------------------------------------------
default active no yes
如果没有,说明 libvirt 的 NAT 规则没有生效,需要手动添加
sudo iptables -t nat -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
同时检查 FORWARD 链
sudo iptables -L FORWARD -n -v | grep 192.168.122
应该有允许 virbr0 转发的规则,如果没有需要运行下面的命令
sudo iptables -I FORWARD -i virbr0 -o virbr0 -j ACCEPT
sudo iptables -I FORWARD -o virbr0 -j ACCEPT
sudo iptables -I FORWARD -i virbr0 -j ACCEPT
运行完之后用下面的命令重建规则
sudo virsh net-destroy default
sudo virsh net-start default
同时在 Windows 10 里面执行
ipconfig /release
ipconfig /renew
libvirt default 网络设置为自动启动
如果没有设置自启动的话,下次开机打开虚拟机就会报错 Error starting domain: Requested operation is not valid: network 'default' is not active
运行下面的命令来使它自启动
sudo virsh net-autostart default
如果你已经出现了这个报错,先运行下面的命令来启动 default 这个网络
sudo virsh net-start default
Windows 10 走宿主机的代理
我们可以让 Windows 10 走 arch linux 的 dae 代理,这样就不用在 windows 中再次配置代理了
sudo vim /etc/dae/config.dae
把这一行改掉
global {
lan_interface: virbr0
...
}
这样 dae 会在 virbr0 上也挂载 eBPF,VM 的流量就会经过 dae 的代理规则,改完之后 sudo systemctl restart dae 就可以了
打开 Windows 10 虚拟机会发现使用了宿主机的代理
减小 Windows 10 中鼠标光标的延迟
在我这个环境下装好机器,感觉虚拟机中的光标延迟足足有 300ms 往上,这实在是难以接受
不过幸运的是,我找到了办法缓解这个问题
如果目前用的是 USB tablet 输入设备 + SPICE 显示,这就会是延迟的主要原因,还有一部分可能是没有装显卡,画面有点卡和割裂,自然感觉有延迟
换用 VirtIO 鼠标
把 tablet 换成 virtio 总线的输入设备,需要直接编辑 XML 文件
<!-- delete this -->
<input type="tablet" bus="usb">
<address type="usb" bus="0" port="1"/>
</input>
<!-- change to this -->
<input type="tablet" bus="virtio">
<address type="pci" domain="0x0000" bus="0x05" slot="0x00" function="0x0"/>
</input>
关闭 SPICE 图像压缩
优化一下 SPICE 配置,直接编辑 XML 文件
<graphics type="spice" autoport="yes">
<listen type="address"/>
<image compression="off"/>
<jpeg compression="never"/>
<zlib compression="never"/>
<playback compression="off"/>
<streaming mode="off"/>
</graphics>
显卡直通
显卡直通我还没有实验,毕竟我现在没有第二张显卡,如果直通给 Windows 10 虚拟机那么 Arch Linux 就要用 AMD 的核显了
这一节等我有显卡之后补上…
问题解答与避免
下面是一些可能导致安装失败的问题以及解决方案
3D 加速
你可能会在 Video Virtio 这个 Tab 中勾选 3D acceleration,如果你接下来遇到了奇怪的错误,取消勾选掉它再试试能不能启动虚拟机
这个具体的错误原因我也不是很清楚



