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

推荐订阅源

T
Threatpost
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
J
Java Code Geeks
博客园_首页
Google Online Security Blog
Google Online Security Blog
Hugging Face - Blog
Hugging Face - Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
I
Intezer
P
Palo Alto Networks Blog
V
Vulnerabilities – Threatpost
雷峰网
雷峰网
O
OpenAI News
SecWiki News
SecWiki News
小众软件
小众软件
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
N
News | PayPal Newsroom
Project Zero
Project Zero
Forbes - Security
Forbes - Security
IT之家
IT之家
A
Arctic Wolf
WordPress大学
WordPress大学
Jina AI
Jina AI
T
Tor Project blog
博客园 - 三生石上(FineUI控件)
S
Secure Thoughts
Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
博客园 - 聂微东
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Privacy International News Feed
Cloudbric
Cloudbric
G
GRAHAM CLULEY
博客园 - 叶小钗
H
Hacker News: Front Page
腾讯CDC
量子位
Help Net Security
Help Net Security
人人都是产品经理
人人都是产品经理
C
Cyber Attacks, Cyber Crime and Cyber Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
宝玉的分享
宝玉的分享
爱范儿
爱范儿
L
Lohrmann on Cybersecurity
Hacker News - Newest:
Hacker News - Newest: "LLM"
Recorded Future
Recorded Future
C
CERT Recently Published Vulnerability Notes

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 修复 MSOffice 墨迹不可用问题 - kkocdko's blog 使用 VBA 批量转换 Office 文档格式 不便携的有道词典便携版 - kkocdko's blog 关于清华同方还原卡的一个坑 - kkocdko's blog 也许是最简洁的搜狗输入法皮肤 - kkocdko's blog 用批处理弄个 U 盘复制器 - kkocdko's blog 美化版 TRIXX - kkocdko's blog Windows 默认蓝色代码 - kkocdko's blog A4 大小的普通英文稿纸 - kkocdko's blog 在批处理中延时(等待) - kkocdko's blog 让批处理隐藏窗口运行 - kkocdko's blog 让批处理以管理员权限运行 - kkocdko's blog 批量修改 PPT 字体样式 - kkocdko's blog New Post - kkocdko's blog Block Android dex2oat on demand Disable “insecure download blocked” warning on Chrome and Edge Reduce memory usage of FreeCAD and OrcaSlicer 用 GDB + Python 获取 Linux 端微信本地数据库密钥 Android bug prevents exfat readonly USB drive Cons of IronRDP today, compare to FreeRDP Multi call binary for existing projects WPS Android modified and stripped Disadvantages of APE - kkocdko's blog Change Linux UKI cmdline without regeneration Disk duplicator is considered deprecated 请弃用网易邮箱 - kkocdko's blog Summary of window state restore on desktop Draft of Mono Client Project Right path to use new glibc on old Linux Linux 笔电的所谓省电技巧 - kkocdko's blog Android 腾讯 TIM 迁移 QQ 指北 消费级 Android on Windows 是没有前途的 请停止滥用新 Web 标准特性 - kkocdko's blog Rescuing data from offline sites Differences in AMD P-State modes after kernel 6.3 Fix Docker 'input device is not a TTY' elegantly 在 2023 年评测前端静态资源公共 CDN - kkocdko's blog Recording + streaming on Wayland kk 对耳机主动降噪功能的体验与评价 - kkocdko's blog Node.js native addon without node-gyp Standalone and portable MSVC - kkocdko's blog 腾讯云安装 Fedora - kkocdko's blog 优化 Git 仓库的额外提示 - kkocdko's blog Using hwmoncat, a tiny alternative to lm_sensors Build Fedora ISO in 3 Commands Tradition and Modernity in Async Rust Change ZSTD Level in QCOW2 无损转换 PDF 到 Word 是不可能的 Dump PDF from HEP Website Fedora for Termux - kkocdko's blog Using VSCode Web Server Variant Tricks for C++ Simple App Development Tweak CPU Power Elegantly on Windows Fix Windows Power Options Ineffective 优雅地使用联想电脑管家 - kkocdko's blog Restone Image's Alpha Channel - kkocdko's blog 成立 hal-drv 组织,维护一些 Rust embedded-hal 外设驱动 PotPlayer 图标包:爱奇艺播放器 - kkocdko's blog 爱奇艺万能播放器调教指南 - kkocdko's blog Draft - 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 体积增大,按照上文的方法进行压缩即可。

后续内容

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