前言
AUR 每次更新都要重打包,速度还慢,给人一种脱裤子放屁的感觉。因此陆续将能迁移到 Flatpak 的软件都迁移过去,于是就遇到了文章标题的问题。
之前浏览器和 Bitwarden 都通过系统包管理器安装,Bitwarden 的浏览器插件能够很好地和 App 协同工作。但是将浏览器转移到 Flatpak 后,发现插件挂掉了只能主密码解锁。
调查
遇事不决第一反应问 Gemini,给出了检查插件 NativeMessagingHosts
路径的建议:
"path": "/usr/lib/bitwarden/desktop_proxy",
于是第一反应就是将它直接挂载上去完事,但是实测事情没有这么简单。尝试通过 Flatseal 给浏览器直接加上这个路径的访问权限,但是通过 flatpak enter com.microsoft.Edge sh
进去看 /usr
下压根没找到 bitwarden
目录。折腾半天以为是 Flatseal 安装问题,尝试手动 override,同样无果。问 AI 翻来覆去叫我变着花样 override,也没用。
接着在网上搜索,在红迪看到一篇关于 Flatpak override 无效的提问,没解决我的疑惑,但帖主提到了可以执行 flatpak run --command=sh com.microsoft.Edge
来在对应命名空间下启动一个 shell,和 enter 比起来不需要浏览器在后台运行。本意是想要测试起来更快,结果恰巧它输出了一个重要信息:
F: Not sharing "/usr/lib/bitwarden/desktop_proxy" with sandbox: Path "/usr" is reserved by Flatpak
把错误信息丢到 Google 上查,还真查出了 23 年的一个 issue,大概总结是 /usr
是个运行时保留目录,Flatpak 的开发人员觉得单纯分享 /usr
和分享整个 host-os 没有区别,所以不支持单独挂载。在 Flatseal 里把 host-os 勾上后终于能在 /run/host/usr/..
找到 Bitwarden 的 proxy 了。
把浏览器插件的 path
改成对应的路径后,重启浏览器发现生物验证还是坏的。尝试在容器 namespace 下直接执行 desktop_proxy
,得到了报错:
21:45:28 [INFO] Starting Bitwarden IPC Proxy.
21:45:28 [INFO] Process args: []
21:45:28 [INFO] Attempting to connect to /home/nullptr/.var/app/com.microsoft.Edge/cache/com.bitwarden.desktop/app.bitwarden
21:45:28 [ERROR] IPC client connection error: No such file or directory (os error 2)
经典路径问题。给对应路径添加访问权限,再软链接过去,终于搞定。
解决
总结如下:
- Flatseal 中勾上
filesystem=host-os
,再添加一条~/.cache/com.bitwarden.desktop/app.bitwarden
规则 - 修改
~/.var/app/com.microsoft.Edge/config/microsoft-edge/NativeMessagingHosts/com.8bit.bitwarden.json
里的path
,加上/run/host
前缀 - 创建从
~/.var/app/com.microsoft.Edge/cache/com.bitwarden.desktop
到~/.cache/com.bitwarden.desktop
的软链接
其他浏览器或者 Bitwarden 也通过 Flatpak 安装原理类似。