惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
D
Docker
J
Java Code Geeks
腾讯CDC
Blog — PlanetScale
Blog — PlanetScale
G
Google Developers Blog
M
MIT News - Artificial intelligence
L
LangChain Blog
T
The Blog of Author Tim Ferriss
P
Proofpoint News Feed
MyScale Blog
MyScale Blog
博客园 - Franky
GbyAI
GbyAI
Hugging Face - Blog
Hugging Face - Blog
aimingoo的专栏
aimingoo的专栏
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
N
Netflix TechBlog - Medium
B
Blog RSS Feed
Y
Y Combinator Blog
阮一峰的网络日志
阮一峰的网络日志
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google DeepMind News
Google DeepMind News

kkocdko's blog

Tasker 永久试用修改思路 - kkocdko's blog 极限压缩文档扫描件 - kkocdko's blog Bypass the Blank Chars Detection crknob - Chrome portable patch 我如何将博客首页体积降至 3 KB - kkocdko's blog 如何极限优化压缩文件体积 - kkocdko's blog EmEditor 精简版 - kkocdko's blog Backup Data from VSCode Web 优雅地游玩 Minecraft - kkocdko's blog 让程序以管理员权限运行的 PE 清单 - kkocdko's blog 注销 ZEIT 账号之后遇到的坑 - kkocdko's blog 本博客的协议已更改为 CC0 - kkocdko's blog mobp - 使 MSOffice 后台常驻 在安装 VS 生成工具时规避 .NET 安装错误 各种格式的占位空文件 - kkocdko's blog 优雅地游玩 Flash 游戏 - kkocdko's blog WPS 2016 极限精简版 - kkocdko's blog Convert Const to Let by Terser 规避 Visual Studio 许可证过期的 Bug 方便地使用 iPod - kkocdko's blog 用 UserJS 注入 UserCSS - kkocdko's blog 注册表修改文件关联(默认程序) - kkocdko's blog 周期精准的太阳系模型 - kkocdko's blog 关闭屏幕的 WinAPI - kkocdko's blog 重置 Windows 图标缓存 - kkocdko's blog AIDA64 极限精简单文件版 - kkocdko's blog 几何画板单文件精简版 - kkocdko's blog 世界之窗浏览器单文件版 - kkocdko's blog 在 MBR + Legacy 下用 Bootmgr 引导 Ubuntu 简洁的 Markdown 预览工具 - kkocdko's blog
简陋的 Win on Linux 兼容方案
2026-04-11 · via kkocdko's blog

本文原先希望以教程形式展开,现在看来细节是讲不完了,重要内容提一下完事。

桌面 Linux 下运行 Windows 程序的解决方案五花八门。本文所述方案以 稳定易用 为首要目标:QEMU (KVM) + 精简版 Win10。WebDAV 文件共享。使用 Snapshot 避免写入原始镜像。

与其他方案对比(点击展开)

对比 Wine:

  • Wine 性能好;本方案图形性能较弱。
  • 本方案几乎无需维护,一劳永逸;Wine 有时需为特定应用作出调整,存在紧急情况下新应用无法运行的尴尬

对比其他虚拟机:

  • VitrualBox 图形性能略好,但需额外内核模块;本方案使用 KVM,更稳定。
  • 本方案中 QCOW2 磁盘镜像支持 ZSTD 压缩,体积小(当前为 1.33 GiB)。

成品

下载链接: OneDrive | 123 云盘 | 百度网盘 。无特殊需求建议直接使用成品镜像。其中 win10_xxx.qcow2 是磁盘镜像主体,vvfat_xxx.zip 是外置盘内容(解压后参考下文的命令),文件名后缀为 CRC32。

安装 QEMU。Debian: apt install qemu-kvm qemu-utils; Fedora: dnf install qemu-system-x86。写入并运行 ./win10(.sh)

#!/bin/sh
hda_base=/home/kkocdko/misc/res/qemu_win10/win10_a58fd75e.qcow2
hda=/tmp/win10_hda.qcow2
[ -e $hda ] || qemu-img create -o compression_type=zstd -F qcow2 -b $hda_base -f qcow2 $hda
qemu-system-x86_64 -no-user-config -nodefaults \
  -machine q35,accel=kvm -cpu host,hv-relaxed,hv-vapic,hv-spinlocks=0x1fff,hv-vpindex,hv-time,hv-synic,hv-stimer -rtc base=localtime \
  -smp 3 -m 3G \
  -hda $hda -drive format=raw,file=fat:rw:/home/kkocdko/misc/res/qemu_win10/vvfat \
  -nic hostfwd=tcp:127.0.0.1:9121-:5000 \
  -display gtk,gl=on -device virtio-vga-gl -device qemu-xhci -device usb-tablet \
  $*

任意 WebDAV 客户端连接 dav://127.0.0.1:9121/ 实现文件共享。

其他常用命令行选项(点击展开)
# USB 直通(使用 lsusb 获取两个 id)
-device usb-host,vendorid=0x0000,productid=0x1111
# 音频支持
-audiodev pipewire,id=pw0 -device usb-audio,audiodev=pw0
# todo: 使用 rdp
# todo: 使用 qemu vvfat
详细信息(点击展开)
  • 集成常用运行库和精简版输入法。自定义内容建议写入外置盘。
  • 可参考外置盘中的 custom_startup.bat 实现调整分辨率、激活等需求。
  • 默认 Administrator 用户,禁用几乎所有安全功能,强制自动登录。
  • 制作于 QEMU 6.2,经测试 8.2 可用,之后应该也没问题。
  • 触摸板无法平滑滚动:在设置中调整滚轮速度为每次 1 行可以缓解问题。
  • 为什么使用中文版系统:有些国内软件在非中文环境下会卡 Bug。也许可以换用 Tiny10。
  • 为什么不使用 virt-manager:本文同样适用,只是个人认为直接使用 QEMU 更便捷。

更新日志:

  • 20250124(a58fd75e):外置盘支持修复 PowerShell 和 SPP 服务。
  • 20221002(a58fd75e):进一步提升 ZSTD 压缩等级,减小体积。
  • 20221001(8b8db6b9):统一资源管理器列布局;消除开始菜单最近添加提示;恢复系统属性信息到原版。
  • 20220904(d936163a):修复输入法无法输入全角符号(原帖 84 楼);消除 IE 主页破坏提示。

鸣谢:

减小磁盘镜像体积

对减小镜像体积的问题,当前网络上有许多过时甚至错误的内容,所以在这说道两句。下述内容中如非注明,都是指装有 Windows 系统的虚拟机磁盘镜像。

收缩与压缩

文件系统的设计非常复杂(正经点,别拿 tmpfs 说事):删除文件,会留下空洞;多个 fd 同时写入,可能产生碎片;想减少碎片产生,需要预分配;为提升性能,还可能缓存写入队列,先规划一下再 commit...

磁盘镜像驱动本质是一个用户态的文件系统后端,把对块设备的操作映射到文件。客户机文件系统与宿主机之间缺乏信息共享,导致了各种问题:空洞难以被积极回收,碎片与预分配过度占用之间的权衡等。所以我们需要偶尔执行收缩、压缩这类高开销操作。

请一定区分“收缩(shrink)”与“压缩(compress)”。“收缩”是整理镜像,消除空洞、碎片、冗余数据;“压缩”则是将数据使用压缩算法进行处理。

许多教程推荐用 Virtual Disk Precompactor 或 dd 撑满分区,迫使客户机文件系统腾出连续空间,但这类做法实际上非常糟糕:需写入大量数据,耗时长;不能同时 defrag,效果差。收缩镜像最简单有效的方式是取出内容写入新镜像。可以使用 Dism++ 等工具备份系统分区,还原到新镜像上:

qemu-img create -f qcow2 win10.qcow2 32G
# > 此时安装系统
mv win10.qcow2 win10.old.qcow2
qemu-img create -f qcow2 win10.qcow2 32G
# > 此时启动到 PE,拆分原镜像分区,备份到拆出的空闲分区,还原到新镜像的分区
rm win10.old.qcow2
# 可选,差异不明显。如果你接下来还要压缩,那么这一步是**完全多余**的
# qemu-img convert -p -f qcow2 -O qcow2 -c win10.qcow2 win10-shrink.qcow2

对于压缩,若你在客户机内使用 NTFS 压缩,就会发现这毫无作用,因为它会尽量减少搬运,导致压缩后数据依然是稀疏分布的。个人认为目前最佳方案是在 QCOW2 上启用 ZSTD 压缩:

qemu-img convert -p -f qcow2 -O qcow2 -c -o compression_type=zstd,preallocation=off win10.qcow2 win10-zstd.qcow2

相比于客户机内的 NTFS 压缩,QCOW2 的解压完全在宿主机上运行,性能损失较小。进一步地,我们还可以 修改 QCOW2 镜像的 ZSTD 压缩级别,尽力压到最小。

快照

Windows 的可控性向来都很糟糕。若你有幸打开过 UWF,就会观察到各个进程在各种角落不断写入临时文件。我们不可能找到所有这些地方并定时清理。

使用 Snapshot 是比较好的方案:随时回滚,遏制镜像体积膨胀,在出现意外后兜底。

qemu-img create -q -F qcow2 -b win10_xxx.qcow2 -f qcow2 win10_snapshot.qcow2
# qemu-kvm -hda win10_snapshot.qcow2 -cpu host -accel kvm -smp 2 -m 2G

你还可以创建共用同一 Backing 的多个 Snapshot。在一段时间后若 Snapshot 体积增大,按照上文的方法进行压缩即可。

后续内容

你可以在 本文源码 的末尾找到还未发布的内容,可能包含一些实用的技巧和命令范例。