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/ 实现 ILanguageStatics、IJsonObjectStatics 等工厂 |
| 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_RUNNER | ge | ge / protosoda / 绝对 Proton 路径 |
MS365_PRODUCT | O365ProPlusRetail | ODT 产品 ID(如 O365BusinessRetail) |
MS365_EXCLUDE | Teams OneDrive Lync Bing Groove | 排除应用;添加 Outlook OneNote Access Publisher 得最小安装 |
MS365_VERSION | 未设置 | 固定 Office 构建号(旧版更稳定) |
MS365_WAYLAND | 1 | Wayland 驱动;设为 0 用 X11(sway 下弹窗会立即关闭) |
MS365_SCA | 0 | 1 启用共享计算机激活(仅商业订阅) |
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 版仍是更可靠选择。此项目的意义不在于替代,而在于照亮那条狭窄、脆弱、充满陷阱的兼容之路——让后来者知道哪里是悬崖,哪里或许有桥。










