Linux 运行 Windows 应用,靠一条 40 多行的脚本完成 Windows 服务自动化部署
【免费下载链接】winboatRun Windows apps on 🐧 Linux with ✨ seamless integration项目地址: https://gitcode.com/GitHub_Trending/wi/winboat
Winboat 让你在 Linux 桌面里像打开原生窗口一样运行 Windows 应用;Windows 侧的全部组件由一条 40 多行的批处理脚本装好。这篇文章拆解开自动化部署的四步流程,以及 nssm 注册服务的几个关键配置。
场景切入:手动装这套东西有多麻烦
假设你刚重装了一台 Windows 来宾系统,想让 Winboat 的 Linux 端连上它:
- 要装
WinBoatGuestServer和WinBoatGuestServerUpdater两个服务,每个都要单独指定工作目录、启动方式和运行账户 - 手工敲
sc命令配服务,少敲一个参数就不启动,而且错误提示基本等于没有 - Windows 默认防火墙拦截所有入站连接,7148 端口不通,Linux 侧等到的只有超时
- 换个机器、或者重装系统,上面全部重来一遍
这些活没有一处值得靠脑子记。Winboat 把它们全部写进了 install.bat。
Windows 服务一键部署:脚本按顺序做了四件事
第一步:统一路径,先把目录移出杀毒扫描
脚本开头把所有路径收敛成变量,比如安装目录固定为C:\Program Files\WinBoat。建好目录后,它顺手把这个路径加进 Windows Defender 的排除列表——因为接下来要写入大量来宾二进制文件,实时扫描一边扫一边写,既拖慢速度,还可能误报卡住安装。
第二步:xcopy 一次性搬完全部依赖
运行所需文件预先放在C:\OEM里。一条命令xcopy "%OEM_DIR%\*" "%WB_DIR%\" /Y /E把它们连同 server\、updater\ 这些子目录整体复制到安装目录,/Y保证重复运行时不弹确认框,全程无人值守。
第三步:用 nssm 注册两个 Windows 服务
这是整个脚本的核心。nssm 能把普通 exe 包装成标准 Windows 服务,服务机制自带依赖配置、崩溃自动拉起和开机自启,这些是任务计划做不到的。Winboat 注册了两个服务:
WinBoatGuestServer:API 服务,监听 7148 端口WinBoatGuestServerUpdater:自更新服务,监听 7150 端口
每个服务依次设置自动启动(SERVICE_AUTO_START)、工作目录(AppDirectory)、描述和运行账户,四步之内全部就位。
第四步:放行端口、启动并挂上开机任务
两条netsh命令分别放行 TCP 7148 和 7150,随后nssm start直接拉起两个服务。最后schtasks创建 TimeSyncTask,开机时以 SYSTEM 身份执行 time-sync.bat,保持两侧时钟同步。
关键配置拆解:三个"为什么"值得停下看
为什么用 xcopy /E 而不是 copy
copy只处理当前层级的散文件,子目录会整个丢。来宾服务依赖 server\ 和 updater\ 两套子目录结构,/E是必须的,下面这行就是全部依赖部署动作:
xcopy "%OEM_DIR%\*" "%WB_DIR%\" /Y /E复制完成、覆盖静默,装完就能跑。
为什么运行账户选 NT AUTHORITY\SYSTEM
普通用户账户有两个坑:密码一改或者账户被禁用,服务立刻启动失败;权限也常不足以访问系统资源。SYSTEM 是内置账户,不随任何用户密码变化,权限足够,适合需要长期静默运行的场景:
nssm set WinBoatGuestServer ObjectName "NT AUTHORITY\SYSTEM"为什么防火墙只放行两个端口
不显式放行,Linux 侧永远连不上 Windows 侧。但放行也不是越宽越好——Winboat 只开了它实际在用的 7148 和 7150 两条规则,其余端口维持 Windows 默认拦截状态,这是最小权限原则最省事的落法。
📋 故障自查清单:三类常见现象怎么查
| 现象 | 先跑什么 | 往哪查 |
|---|---|---|
| nssm 安装服务失败 | 对比 guest_server/nssm.sha1.txt 里的校验值和本地 nssm.exe 哈希;再执行nssm.exe version | 可执行文件损坏或被替换 |
| Linux 端一直连不上 | netstat -ano \| findstr 7148看端口被谁占着 | 端口被别的程序占用,或防火墙规则没生效 |
| 服务装上了但无响应 | nssm status WinBoatGuestServer;再看winboat_guest_server.log | 工作目录指错位置、依赖文件缺失 |
如果你是自己改过端口,记得同步 src/renderer/lib/constants.ts 里的GUEST_API_PORT、防火墙规则和服务描述,三处不一致时排查成本翻倍。
🔧 进阶定制:两个实用小改动
改安装路径要同步三处:install.bat 里的WB_DIR变量、nssm 的AppDirectory、防火墙规则里的可执行文件路径。只改第一处,服务能启动但找不到文件,报错很难看。
日志集中管理:企业环境可以单独定义LOG_DIR,再用nssm set WinBoatGuestServer AppStdout "%LOG_DIR%\stdout.log"把服务输出重定向到文件,方便接集中监控。
Go 写的来宾端源码都在 guest_server/ 目录里,updater 带健康检查和自动回滚逻辑,值得顺带一读。
这条 40 多行的脚本给所有需要在 Windows 侧静默部署服务的场景提供了一个通用范式:路径收敛为变量、标准工具批量复制、nssm 统一注册服务、端口按需放行。下次做类似集成时,这套思路可以直接搬走。
【免费下载链接】winboatRun Windows apps on 🐧 Linux with ✨ seamless integration项目地址: https://gitcode.com/GitHub_Trending/wi/winboat
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考