WinBoat:3步在Linux上原生运行Windows应用的完整指南
【免费下载链接】winboatRun Windows apps on 🐧 Linux with ✨ seamless integration项目地址: https://gitcode.com/GitHub_Trending/wi/winboat
手头有个只有 Windows 版本的工具,可你的主力机是 Linux。常规思路无非两条:开台虚拟机切来切去,或者赌一把 WINE 的兼容率。WinBoat 想做的则是第三种事情——把单个 Windows 应用作为"本地窗口"直接开在 Linux 桌面上:应用窗口、剪贴板、声音都表现得像原生程序,你甚至不用意识到它背后藏着一台 Windows。它用 Electron 界面 + 容器化虚拟机 + RDP 组合窗口的思路把这条链路串了起来,安装过程也在界面里基本自动化。
先弄清它是怎么搭起来的:容器里跑系统,服务里跑接口
弄懂了架构,后面每一步操作你都能对上号。WinBoat 可以拆成三层。
Windows 系统住在容器里
Windows 虚拟机并不是裸挂在物理机上,而是跑在 Docker 或 Podman 容器内部,底层依赖 BIOS 里开启的 KVM 硬件虚拟化。好处很直接:系统镜像、启动脚本、端口映射都收进容器描述文件里,环境可复制、可销毁,宿主机不被虚拟机配置污染。相当于给"一台 Windows"发了一张容器通行证,而不是让它直接占楼。
常驻在 Windows 里的 Go 服务当翻译官
光有虚拟机还不够——Linux 端怎么知道 Windows 里装了哪些应用、CPU 用率多少、要不要更新?答案是 WinBoat Guest Server:一个驻留在 Windows 内部的 Go 语言 HTTP 服务,监听 7148 端口。宿主机侧的所有信息需求,比如应用清单、运行指标,都是它代为取回。这个 token 在安装时生成并写入 guest_token,只有持有它的一方才能调用接口,避免随便一个局域网设备来敲门。
它的更新也做了保护:Guest Server Updater 负责拉取新版,把新文件放到临时目录、校验通过后同卷改名切换,健康检查失败就回滚。服务本身由 NSSM 注册为 Windows 服务,开机自启、SYSTEM 账户运行,崩溃后能被服务管理器重新拉起,稳定性不靠"人记得开着"。
RemoteApp 协议把窗口合成到 Linux 桌面
真正让"原生感"成立的是 FreeRDP 加 Windows 的 RemoteApp 协议:只传输目标应用的窗口画面,直接合成进 Linux 桌面,而不是推送整块屏幕。于是你在 Linux 窗口管理器和任务栏里直接管理这个应用,拖拽、置顶、平铺都和原生窗口一样。想切回完整 Windows 桌面时,它也能通过 noVNC 随时给出一台完整桌面的入口。
部署落地:从装软件到放行防火墙的完整流程
架构讲完了,接下来看怎么跑起来。
前置条件确认
官方给出的底线配置:至少 4 GB 内存、2 个 CPU 线程、目标磁盘 32 GB 空闲,并且 BIOS/UEFI 里开启 KVM。容器运行时二选一——Docker(不支持 Docker Desktop,要用引擎本体)或 Podman(建议 4.x 以上版本);再装一个 3.x 版本的 FreeRDP,需要带声音支持。这几样缺任何一样,后面都会卡住。
界面里完成 Windows 环境部署
下载对应包格式的发布版本(AppImage、.deb、.rpm 或 linux-unpacked),运行后按向导走:选择 Windows 版本、分配资源规格,剩下下载镜像、构建容器、起虚拟机的活交给它自动做。这里说的"自动化"不是营销话术——虚拟机创建流程确实被封装在界面背后,你不需要手写 docker compose 文件。
注册 Guest 服务与防火墙放行
Windows 侧的初始化由 guest_server/install.bat 完成,核心就是把 Guest Server 注册成服务并放行通信端口:
nssm install WinBoatGuestServer "%WB_DIR%\server\winboat_guest_server.exe" nssm set WinBoatGuestServer Start SERVICE_AUTO_START netsh advfirewall firewall add rule name="Allow WinBoat API 7148" dir=in action=allow protocol=TCP localport=7148宿主机侧的端口分工写死在 src/renderer/lib/constants.ts:Guest 内 7148(API)、7150(更新)、7149(QMP 虚拟机构控)、3389(RDP),全部映射到本机 47270–47274 的私有段并只绑 127.0.0.1,外部根本摸不到。
进阶玩法:换系统版本、挪目录、改接口
Windows 版本切换与自定义镜像
安装时可选的 Windows 版本定义在 constants.ts 的 WINDOWS_VERSIONS 里:Win11 Pro / LTSC 2024 / Enterprise、Win10 Pro / LTSC 2021 / Enterprise 共六个预设,另有"Custom Windows"入口供你喂自己的 ISO。想长期跑 LTSC 省资源,还是上 Enterprise 用组策略,装的时候就定好了。
数据目录与安装路径自定义
Linux 侧所有运行时数据默认落在~/.local/share/winboat-app,遵循 XDG 规范——设置了 XDG_DATA_HOME 就跟着走,这是最干净的挪家方式。Windows 侧则改 install.bat 里的WB_DIR变量,文件复制、服务路径、防火墙规则都会跟着新路径走。
二次开发的两个入口
guest server 目录是独立 Go 工程:cmd/server/main.go里按接口挂路由,每个接口(应用列表、指标、版本)背后都是一段 PowerShell 脚本扫取数据再回传 JSON。想加一个 guest 侧能力,照着这个模式加路由即可。UI 侧则是 Vue 3 加 Electron,src/renderer/lib/winboat.ts里管着 FreeRDP 的拉起逻辑和一组默认 RDP 参数(剪贴板共享、PulseAudio 声音转发等),调启动行为从这里入手。
顺手一提,Linux 的 home 目录会挂载进 Windows,两边交换文件不用走网络,这也是它在"集成"这个词上敢下重注的地方。
和老路子比,它赌的是哪条路
传统虚拟机的卖点是一台完整 Windows 桌面,代价是你得整体切换屏幕、资源也按整台机器算;WINE 一类兼容层反过来,零虚拟机开销,但要和每个软件的兼容率博弈。WinBoat 赌的是中间态:虚拟机保证"任何能跑在 Windows 上的东西都跑得起来",RemoteApp 合成又让你只为用到的那个窗口买单。资源开销介于两者之间,换来的是日常几乎不感知到它存在。
收尾:值得试,但记得它是 Beta
WinBoat 把"Linux 上跑 Windows 应用"拆成了容器、guest 服务、窗口合成三段,每段都可以单独看懂、单独维护。目前仍是 beta 状态,偶尔的坑要做好排错的准备。如果你愿意动手,仓库本身就是最好的文档:bun i && bun run build:gs && bun run dev就能起开发模式,guest server 的 Go 源码和 PowerShell 脚本全部摆在 guest_server/ 里。留一个问题给你:当单个应用已经"原生化"之后,下一步会不会是 Linux 与 Windows 之间彻底消失"哪边是宿主"的概念?
【免费下载链接】winboatRun Windows apps on 🐧 Linux with ✨ seamless integration项目地址: https://gitcode.com/GitHub_Trending/wi/winboat
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考