2026 年在 Arch Linux 高配工作站机器中安装 Windows 10 的最佳实践

Linux2,8672026/3/10编辑于 2026/3/14172文章
2026 年在 Arch Linux 高配工作站机器中安装 Windows 10 的最佳实践
我最爱莲了!

机器环境

目前我是 Arch Linux 环境,下面是我的一份系统信息(部分信息已隐藏)

Shell
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 提供高质量随机数

还有其他的小提升

DANGER

某些情况下你可能想把虚拟机的硬盘的 Device type 改为 VirtIO,但是实测之后这是不行的,否则启动的时候会报下面的错误

Shell
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 操作系统

安装必要的包

Shell
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

Shell
sudo systemctl enable libvirtd
sudo systemctl start libvirtd

把当前用户加入 libvirt 组

Shell
sudo usermod -aG libvirt $USER

然后重新登录或执行

Shell
newgrp libvirt

验证

Shell
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

INFO

virt manager 会自动检测镜像文件的操作系统,这里给我检测为 Windows 11 的镜像了,实际上我是 Windows 10,但是这里并不能直接选择对应的镜像,就将就用 Windows 11 了

但是,我们接下来要勾选上 Customize configuration before install ,安装之后弹出的界面,点击 OS information 这个 tab,可以在这里将自动识别的操作系统改为 Windows 10

内存和 CPU 核心数我的设置为 3276816,硬盘这里选择了 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,我们选择

Shell
Network source: default
Device model: virtio

挂载 VirtIO

点击 Add Harkware ,然后这样添加
Screenshot_20260310_175938.png

TPM 2.0

点击 TPM vNone,设置为

Shell
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,然后手动创建一个磁盘镜像并绑定,否则就会报错

Shell
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

输入下面的命令创建镜像文件

Shell
sudo qemu-img create -f qcow2 /var/lib/libvirt/images/windows10.qcow2 80G

查看一下信息

Shell
sudo qemu-img info /var/lib/libvirt/images/windows10.qcow2

会有类似于下面的输出

Shell
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 来挂载一下这个镜像,配置是这样的

Screenshot_20260310_182114.png

之后记得将 Boot Options 里面的 Boot Device Order 改为 VirtIO Disk 2

完成

配置完上面的所有内容之后,点击一下左上角的 Begin Installation 就可以开始安装 Windows 10 了

新的配置

上面的一份配置在我的系统上运行起来会有各种问题,主要是因为显卡的问题以及 dae 的问题

除了显卡和 dae,我的系统使用了 btrfs,根据一开始我们的观点,这可能会导致一些虚拟机的性能问题,因此我禁用掉了下面两个目录的 CoW

Shell
chattr +C /var/lib/libvirt/images/  # 放置了 virt 默认的镜像存储位置,我这里设置为了 raw,是 .img 文件
chattr +C /home/kun/vm  # 放置了下载好的官方 Windows 10 镜像以及 VirtIO 镜像

下面提供一份完整的 xml 配置参考文件

Details
XML
<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 中将它改为这样

Screenshot_20260310_233814.png

VirtISO 是一个 CDROM

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

Screenshot_20260310_234235.png

附带一份 XML

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 相关的驱动

photo_2026-03-11_00-44-29.jpg

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

Screenshot_20260311_004753.png

安装完之后设备管理器的感叹号就会消失

安装好之后机器的分辨率可能很低,调高一点即可

Windows 10 虚拟机没有网络

这个问题真的折腾了好久,先说结论,是因为我的 libvirt 网络规则没有被写入 iptables

比如我这里下面两条命令在连不上网时什么都没有输出

Shell
sudo iptables -t nat -L -n -v | grep 122
sudo iptables -L FORWARD -n -v | grep virbr0

修复好了大概会变成这样

Shell
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

Shell
ipconfig

如果显示 169.254.x.x,说明 DHCP 没有分配到地址

再看一下 default 网络的状态,如果 default 网络显示 inactive,就需要启动它

Shell
sudo virsh net-start default
sudo virsh net-autostart default

如果 default 网络已经是 active,检查宿主机上的 NAT 转发是否开启,检查 IP 转发

Shell
cat /proc/sys/net/ipv4/ip_forward

应该输出 1,如果是 0 则执行

Shell
sudo sysctl -w net.ipv4.ip_forward=1

同时确认 virbr0 网桥存在

Shell
ip link show virbr0

如果上面都正常,在 Windows 10 里手动续租

Shell
ipconfig /release
ipconfig /renew

iptables NAT 规则配置

如果你的 IP 地址、网关、转发都正常,那么问题可能在于iptables NAT 规则

Shell
sudo iptables -t nat -L POSTROUTING -n -v

正常情况应该有一条类似这样的规则

Shell
 Name      State    Autostart   Persistent
--------------------------------------------
 default   active   no          yes

如果没有,说明 libvirt 的 NAT 规则没有生效,需要手动添加

Shell
sudo iptables -t nat -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE

同时检查 FORWARD 链

Shell
sudo iptables -L FORWARD -n -v | grep 192.168.122

应该有允许 virbr0 转发的规则,如果没有需要运行下面的命令

Shell
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

运行完之后用下面的命令重建规则

Shell
sudo virsh net-destroy default
sudo virsh net-start default

同时在 Windows 10 里面执行

Shell
ipconfig /release
ipconfig /renew

libvirt default 网络设置为自动启动

如果没有设置自启动的话,下次开机打开虚拟机就会报错 Error starting domain: Requested operation is not valid: network 'default' is not active

运行下面的命令来使它自启动

Shell
sudo virsh net-autostart default

如果你已经出现了这个报错,先运行下面的命令来启动 default 这个网络

Shell
sudo virsh net-start default

Windows 10 走宿主机的代理

我们可以让 Windows 10 走 arch linux 的 dae 代理,这样就不用在 windows 中再次配置代理了

Shell
sudo vim /etc/dae/config.dae

把这一行改掉

CONFIG
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 文件

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 文件

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,如果你接下来遇到了奇怪的错误,取消勾选掉它再试试能不能启动虚拟机

这个具体的错误原因我也不是很清楚

评论区

(1)

请先 登录 后发表评论

2026-03-11 19:33

那麼這個 VirtIO 對性能的提升明顯,究竟是有多明顯ね

回复了@風味點心22026-03-13 14:00

鼠标延迟是很明显的,其它的窝也没试过