Office365_flake:借助 umu+GE-Proton,在 Linux Nix 环境跑微软 365

Office365_flake 是一个实验性 Nix flake,通过 umu-launcher 配合 GE-Proton(或 Bottles ProtoSoda)在 Linux 上运行 Microsoft 365(即点即用版)。该项目不打包任何 Microsoft 内容,Office 部署工具(ODT)与 Office 本体均在安装时由脚本动态下载,用户需自备有效 Microsoft 365 许可证。截至 2026-09-16,使用 GE-Proton11-7 与 Office 构建 16.0.20326.20144 测试,Word 可启动、显示登录界面并完成个人账户登录,但完整许可验证仍未解决;Excel、PowerPoint、Outlook 等已安装但未充分测试。

⚠️ 重要声明:此为“尽力而为”的社区方案,非官方支持路径。生产环境、企业合规或关键业务场景请勿依赖。

技术原理:绕过 Wine 原生限制

Microsoft 365 因深度依赖 Windows 专有组件(SPP、WinRT、DirectComposition、App-V VFS)而无法在标准 Wine 上运行。Office365_flake 采用多层 shim 策略:

问题域解决方案
SPP 许可验证失败sppc/ shim 接受许可证安装请求,提供 5 天宽限,强制切换至 vNext token 模式
WinRT 接口缺失ole32-shim/ 实现 ILanguageStaticsIJsonObjectStatics 等工厂
kernel32 导出缺失shim 注册加载器通知,重写导入槽为良性桩
Direct2D 渲染错误替换为 nixpkgs Wine 11.16 的 d2d1.dll(修复奇偶填充模式)
Wayland 弹窗焦点丢失shim 为 MSO_BORDEREFFECT_WINDOW_CLASS 窗口设置所有者,使其成为临时窗口
校对工具注册缺失msi-components.py 从清单重建 MSI 组件注册,shim 响应 Office 查询
WebView2 登录页需手动 winetricks webview2 安装运行时

所有 shim 均通过分析 Wine/Click-to-Run 日志逆向得出,非通用兼容层。

安装与使用

快速开始

# 安装 Office(创建前缀、应用 winetricks、下载 ODT、执行 C2R 安装)
nix run .#ms365 -- install

# 启动 Word
nix run .#word
# 或带参数
nix run .#ms365 -- run word ~/document.docx

# 查看状态/帮助
nix run .#ms365 -- status
nix run .#ms365 -- help

持久化安装

nix profile install .#ms365
# 提供 ms365, ms365-word, ms365-excel 等命令及 .desktop 条目

⚠️ 安装注意:ODT 下载数 GB 至 ~/.local/share/ms365/odt/Office;C2R 安装程序可能长时间无响应,切勿关闭窗口

配置旋钮(环境变量)

变量默认值说明
MS365_RUNNERgege / protosoda / 绝对 Proton 路径
MS365_PRODUCTO365ProPlusRetailODT 产品 ID(如 O365BusinessRetail
MS365_EXCLUDETeams OneDrive Lync Bing Groove排除应用;添加 Outlook OneNote Access Publisher 得最小安装
MS365_VERSION未设置固定 Office 构建号(旧版更稳定)
MS365_WAYLAND1Wayland 驱动;设为 0 用 X11(sway 下弹窗会立即关闭)
MS365_SCA01 启用共享计算机激活(仅商业订阅)
MS365_DPI未设置Wayland 下自动取 sway 输出缩放×96(上限 180);X11 下为 96

示例:最小安装 + ProtoSoda

MS365_RUNNER=protosoda MS365_EXCLUDE="Teams OneDrive Lync Bing Groove Outlook OneNote Access Publisher" \
  nix run .#ms365 -- install

当前状态与已知限制

✅ 已验证

  • ODT 下载与 C2R 安装成功
  • Word 启动(/q 静默模式)、渲染功能区、显示登录按钮
  • 个人 Microsoft 账户登录完成,OneDrive 文档可见,权益获取正常
  • 拼写检查基础功能可用

❌ 未解决 / 未验证

  • 完整 SPP 许可验证失败(0xC004E003);vNext 模式下以“未授权产品”运行
  • 实际许可证未验证:测试账户无桌面应用订阅;有订阅账户可能触发 DirectComposition 购买对话框导致退出(代码 64)
  • Excel/PowerPoint/Outlook 等未测试
  • 断字/同义词库可能因组件映射错误失效
  • HiDPI >180 时 Word 栈溢出;GE-Proton11-6 在 168/180 dpi 下输入偏移
  • X11 驱动下 sway 弹窗立即关闭(必须用 Wayland)

🔧 调试工具

ms365 exec regedit          # 编辑注册表
ms365 exec winecfg          # Wine 配置
ms365 winetricks <verbs>    # 安装额外依赖
ms365 install download      # 仅重新下载 ODT
ms365 reset --yes           # 重置前缀(保留 Office 负载)
MS365_DEBUG=1 nix run ...   # 启用详细日志

日志位置:~/.local/share/ms365/logs/(umu/wine)、~/.local/share/ms365/odt/logs/(ODT)

安全与合规提醒

  • 许可证风险:shim 绕过 SPP 验证,可能违反 Microsoft 服务条款;仅用于个人研究或已有合法订阅的兼容性测试
  • 数据隐私:登录流程经 Edge WebView2,凭据处理由 Microsoft 控制;但 shim 拦截 winhttp/wininet 调用,理论上可观察流量
  • 构建来源:GE-Proton、ProtoSoda、Wine d2d1 均来自第三方;Nix flake 锁定哈希,但上游变更可能引入风险
  • 无企业支持:IT 部门不应将此纳入受管设备策略

项目价值与定位

Office365_flake 不是“Linux 版 Office”,而是对 Wine 兼容性边界的精密探测。它证明了在特定 shim 组合下,Microsoft 365 的核心交互链路可在 Linux 上走通,但每一步都踩在未文档化的实现细节上。对于以下用户具有参考价值:

  • Wine/Proton 开发者:shim 实现是宝贵的逆向工程案例
  • Linux 桌面爱好者:理解 Microsoft 365 的真实依赖图谱
  • 临时应急用户:在无 Windows 环境下紧急查看/编辑 .docx

但对于日常办公,LibreOffice、OnlyOffice 或 Microsoft 365 Web 版仍是更可靠选择。此项目的意义不在于替代,而在于照亮那条狭窄、脆弱、充满陷阱的兼容之路——让后来者知道哪里是悬崖,哪里或许有桥。