☰
QOwnNotes 安装指南:在 Raspberry Pi OS 上通过 APT 仓库部署并解决 Keychain 密钥故障
2026/10/13 1:41:39 网站建设 项目流程
  • 桌面应用

【免费下载链接】QOwnNotes

QOwnNotes is a plain-text file notepad and todo-list manager with Markdown support and Nextcloud / ownCloud integration.

项目地址:https://gitcode.com/gh_mirrors/qo/QOwnNotes
点击查看免费下载

本文介绍如何在 Raspberry Pi OS 12/11/10 及 Raspbian 9.0 上,通过 openSUSE Build Service 的官方 APT 仓库安装 QOwnNotes,并完整覆盖安装命令、版本差异与 Direct Download 备选方式。文章结合仓库源码进一步解释了 Pi 上高频出现的Could not write secret to keychain日志:从 QOwnNotes 如何探测系统 Secret Service/KWallet、如何回退到 legacy 加密,到 GNOME 与 KDE Plasma 各自的修复命令,读完后你能独立完成树莓派上的 QOwnNotes 部署与密钥存储排障。

为什么树莓派需要专用 APT 仓库

QOwnNotes 是一个纯文本 Markdown 笔记与待办管理工具,官方分发渠道之一是基于 openSUSE Build Service(OBS)构建的.deb软件包。由于树莓派使用 ARM 架构,且各代系统基于不同版本的 Debian,官方为每个受支持的系统代次单独维护一个 OBS 仓库路径(例如Raspbian_12、Raspbian_11),仓库中的软件包已经针对对应发行版的依赖(如 Qt5 版本)完成构建。仓库自带的打包元数据可以印证这套构建方式:Debian 打包脚本 debian/rules 固定使用qt5工具链(export QT_SELECT=qt5),构建依赖中声明了qt5-qmake、qtdeclarative5-dev、libsecret-1-dev等组件(见 debian/control)。

软件包名统一为qownnotes,安装后提供usr/bin/QOwnNotes可执行文件、usr/share/applications下的桌面入口PBE.QOwnNotes.desktop、各尺寸 hicolor 图标以及多语言翻译文件(.qm),安装清单见 qownnotes.install。

选择仓库路径的原则:按你的系统代次选择对应仓库。Raspberry Pi OS 12(bookworm)用Raspbian_12,Raspberry Pi OS 11(bullseye)用Raspbian_11,Raspberry Pi OS 10(buster)用Raspbian_10,更早的 Raspbian 9.0(stretch)用Raspbian_9.0。选错代次的仓库可能导致依赖无法满足(如 glibc/Qt 版本不匹配),请严格对应下表:

系统版本OBS 仓库路径
Raspberry Pi OS 12home:/pbek:/QOwnNotes/Raspbian_12
Raspberry Pi OS 11home:/pbek:/QOwnNotes/Raspbian_11
Raspberry Pi OS 10home:/pbek:/QOwnNotes/Raspbian_10
Raspbian 9.0home:/pbek:/QOwnNotes/Raspbian_9.0

提示:apt-key属于传统签名验证方式,较新的 APT 已建议改用/etc/apt/keyrings下的.gpg文件,但为保持与官方文档一致,下文沿用apt-key命令。

安装流程:三步通用模式

不论哪个版本,安装都遵循相同的三步模式:

  1. 信任仓库签名:下载并导入该仓库的Release.key;
  2. 添加仓库:向/etc/apt/sources.list.d/qownnotes.list追加一行deb源;
  3. 更新索引并安装:apt-get update拉取新仓库的软件包索引,apt-get install qownnotes完成安装。

以下按系统版本给出完整命令。

Raspberry Pi OS 12

# 1. 导入仓库签名 wget http://download.opensuse.org/repositories/home:/pbek:/QOwnNotes/Raspbian_12/Release.key -O - | sudo apt-key add - # 2. 添加仓库并安装 sudo bash -c "echo 'deb http://download.opensuse.org/repositories/home:/pbek:/QOwnNotes/Raspbian_12/ /' >> /etc/apt/sources.list.d/qownnotes.list" sudo apt-get update sudo apt-get install qownnotes

如果不想配置 APT 仓库,也可以直接进入仓库的 Direct Download 页面,手动挑选对应架构的.deb安装(见下文“Direct Download”)。

Raspberry Pi OS 11

wget http://download.opensuse.org/repositories/home:/pbek:/QOwnNotes/Raspbian_11/Release.key -O - | sudo apt-key add -
sudo bash -c "echo 'deb http://download.opensuse.org/repositories/home:/pbek:/QOwnNotes/Raspbian_11/ /' >> /etc/apt/sources.list.d/qownnotes.list" sudo apt-get update sudo apt-get install qownnotes

Raspberry Pi OS 10

wget http://download.opensuse.org/repositories/home:/pbek:/QOwnNotes/Raspbian_10/Release.key -O - | sudo apt-key add -
sudo bash -c "echo 'deb http://download.opensuse.org/repositories/home:/pbek:/QOwnNotes/Raspbian_10/ /' >> /etc/apt/sources.list.d/qownnotes.list" sudo apt-get update sudo apt-get install qownnotes

Raspbian 9.0

wget http://download.opensuse.org/repositories/home:/pbek:/QOwnNotes/Raspbian_9.0/Release.key -O - | sudo apt-key add -
sudo bash -c "echo 'deb http://download.opensuse.org/repositories/home:/pbek:/QOwnNotes/Raspbian_9.0/ /' >> /etc/apt/sources.list.d/qownnotes.list" sudo apt-get update sudo apt-get install qownnotes

Direct Download 备选方案

如果只需要一次性安装、不希望长期保留 APT 源,可以直接访问 OBS 仓库的目录页面手动下载.deb文件(例如Raspbian_12目录页对应路径http://download.opensuse.org/repositories/home:/pbek:/QOwnNotes/Raspbian_12),然后使用sudo dpkg -i <包名>.deb && sudo apt-get install -f补装依赖。注意手动下载时需要自行核对 CPU 架构(树莓派通常为armhf/arm64)与目标系统代号是否匹配。

安装后验证与运行

安装完成后可以这样验证:

# 查看版本信息 QOwnNotes --version # 以普通用户身份启动 QOwnNotes

启动后首次运行会创建用户配置目录与本地笔记文件夹。QOwnNotes 的全部笔记均以纯文本 Markdown 文件存储在本机磁盘上(默认位于用户主目录下),这一点在 Debian 包描述中也有说明:“You own your own notes! All notes are stored as plain-text files”(见 debian/control)。

故障排查:Could not write secret to keychain

在树莓派这类轻桌面环境上,最常见的安装后故障是:QOwnNotes 保存云连接(Nextcloud/ownCloud)密码、API Key 等敏感设置时,日志反复出现:

Could not write secret to keychain

原因:系统缺少 Secret Service 密钥环

QOwnNotes 通过内置的 qtkeychain(Qt 对 Secret Service API 与 KWallet 的封装)来安全存储密码类配置。在 Linux 上,这套机制依赖 D-Bus 会话总线上存在一个可写入的密钥服务:GNOME 系桌面对应gnome-keyring(Secret Service),KDE Plasma 对应kwalletd(KWallet)。而树莓派默认的轻量桌面(如 MATE、LXDE)常常没有预装这些服务,写入密钥环失败后,QOwnNotes 便会回退到 legacy 加密存储,并留下上述警告。

修复命令

GNOME 及其他基于 Secret Service 的桌面:

sudo apt install gnome-keyring libsecret-1-0 seahorse

KDE Plasma:

sudo apt install kwalletmanager

安装完成后重启桌面会话(注销并重新登录,或直接重启),让密钥环守护进程随会话启动,再打开 QOwnNotes 验证日志不再出现该警告。

如果桌面环境本身不打算提供密钥环,也可以保持现状:QOwnNotes 会回退到 legacy 加密(用 SimpleCrypt 对敏感值加密后写回配置文件),功能不受影响,只是密码不再集中托管在系统密钥环中。

源码纵深:QOwnNotes 的密钥存储与回退机制

上一节的结论并非凭经验推测,仓库中 CryptoService 的实现完整描述了这条链路的每个环节。以下按“探测 → 写入 → 回退 → 迁移”的顺序展开。

1. 双重探测:库可用 + D-Bus 服务可达

在 Linux 桌面(非 macOS、非 Android)编译时,detectKeychainAvailability()会做两层检查(cryptoservice.cpp#L191-L201):

  • 首先调用QKeychain::isAvailable(),它只验证 libsecret 动态库能否加载——这一层通过并不代表桌面有密钥环,源码注释明确指出了这一点;
  • 因此在编译宏QON_KEYCHAIN_DBUS_PROBE下追加isDBusSecretServiceReachable()检查(cryptoservice.cpp#L139-L188):通过会话总线查询org.freedesktop.secrets(Secret Service)、org.kde.kwalletd6、org.kde.kwalletd5是否已注册,再用原始 D-Bus 调用ListActivatableNames检查这些服务是否可被 D-Bus 激活启动。该探测“不触碰任何 keychain 条目,因此永远不会触发解锁弹窗”(源码注释原文)。

这正是树莓派轻量桌面失败的机理:libsecret 库能加载,但 D-Bus 上查不到任何密钥服务,探测返回 false。

2. 一次性判定与全局缓存

isKeychainAvailable()(cryptoservice.cpp#L408-L421)用静态变量把探测结果缓存为“每次应用运行只判定一次”。判定为不可用时打印:

No system keychain is available, secrets will be stored with the legacy encryption

之后所有writeSecret()直接短路返回失败,不再尝试写一个不存在的密钥环——这正是文档中“QOwnNotes will fall back to legacy encryption if the desktop keychain is unavailable”的实现依据。

3. 同步执行、超时保护与回退写盘

密钥环的读写都是异步 D-Bus 作业(QKeychain::Job)。executeKeychainJob()(cryptoservice.cpp#L78-L102)用QEventLoop+QTimer把它同步化:

  • 超时时间来自设置项keychainTimeout,默认 2 秒,并被限制在 1~120 秒区间内(cryptoservice.cpp#L397-L402);
  • 超时后不主动删除仍活跃的作业,交由后端自行收尾,避免悬挂回调。

写入路径storeSecret()(cryptoservice.cpp#L494-L506)的逻辑是:writeSecret()成功则返回qtkeychain:<Base64Url(键名)>形式的引用标记存入配置;失败则(当密钥环本应可用时)打印Could not store secret in keychain, falling back to legacy encryption,随后调用legacyEncryptToString()用 SimpleCrypt 加密原文落盘。而writeSecret()自身失败时打印的正是日志中的那句(cryptoservice.cpp#L527-L550):

qWarning() << "Could not write secret to keychain:" << key << job->errorString();

密钥环服务名(keychain service)默认为QOwnNotes,调试构建追加Debug后缀,多会话运行时追加-<session>后缀(cryptoservice.cpp#L63-L76),你可以在seahorse或kwalletmanager界面中按此名称找到 QOwnNotes 的密钥条目。

4. 受保护的配置项与自动迁移

从源码可以确认,会被优先托管到密钥环的配置项分两组(cryptoservice.cpp#L36-L56):

  • 加密设置键(encryptedSettingsKeys):networking/proxyPassword、ownCloud/password、ownCloud/todoCalendarCalDAVPassword、ai/groq/apiKey、ai/openai/apiKey;
  • 允许明文回退的键(plaintextFallbackSettingsKeys):WebSocket 服务令牌(webSocketServerService/bookmarkSuggestionApiToken、webSocketServerService/token)、Web App Client 令牌(webAppClientService/token)、MCP 服务令牌(ai/mcpServerToken)、LanguageTool API Key(languageToolApiKey)。

此外还有两类数据库中的敏感数据:cloudConnection表的密码列(Nextcloud/ownCloud 连接密码)和script表中settings_variables_json里以!开头的脚本敏感变量。

当你在树莓派上补装gnome-keyring或kwalletmanager后重启会话,CryptoService构造时触发的migrateSecrets()(cryptoservice.cpp#L596-L605)会扫描上述各处遗留的旧格式密文:先用 legacy 方式解出明文(带完整性校验,防止把垃圾数据当成“解密成功”),再写入密钥环,并把配置中的原值替换为qtkeychain:引用标记。也就是说,补装密钥环后旧密文会自动迁移,无需手工导入导出。

5. 构建侧:libsecret 的检测

密钥能力并非硬依赖。构建时 CMake 会检测 libsecret 并设置LIBSECRET_SUPPORT(CMakeLists.txt#L149-L167):

find_package(PkgConfig QUIET) if(PKG_CONFIG_FOUND) pkg_check_modules(LIBSECRET libsecret-1) endif() set(LIBSECRET_SUPPORT ${LIBSECRET_FOUND} CACHE BOOL "" FORCE)

从源码结构看,若构建环境缺少 libsecret,qtkeychain 的 Linux 后端不可用,QKeychain::isAvailable()恒为 false,应用整体退化为 legacy 加密——这与运行期缺少密钥环时的行为是一致的优雅降级。Debian 包则通过Depends: libsecret-1-0保证运行时至少具备 libsecret 库(debian/control)。

常见问题速查

现象原因处理
日志反复出现Could not write secret to keychain桌面缺少 Secret Service/KWallet按上文安装gnome-keyring libsecret-1-0 seahorse或kwalletmanager,重启会话
日志出现No system keychain is available, ...运行期探测不到密钥服务属一次性提示;可接受 legacy 加密,或补装密钥环
日志出现Timed out writing secret to keychain密钥环解锁等 D-Bus 交互超过keychainTimeout(默认 2 秒)尽快在弹出的解锁对话框中确认;或在设置中调大keychainTimeout(上限 120 秒)
apt-key add报NO_PUBKEY仓库 key 未正确导入重新执行对应版本的wget ... \| sudo apt-key add -
apt-get update后安装仍 404仓库路径与系统代次不匹配对照“选择仓库路径”表核对Raspbian_12/11/10/9.0

小结

在树莓派上部署 QOwnNotes 的核心是选对代次的 OBS 仓库并执行“导入 key → 添加源 → update → install”四步命令;Direct Download 页面适合作为一次性安装的备选。安装后如遇Could not write secret to keychain,本质是轻量桌面缺少 Secret Service/KWallet,安装对应密钥环包并重启会话即可,旧密文会被migrateSecrets()自动迁入系统密钥环;若不打算提供密钥环,legacy 加密回退同样能保障配置安全,只是密码不再由系统密钥环统一托管。

  • 桌面应用

【免费下载链接】QOwnNotes

QOwnNotes is a plain-text file notepad and todo-list manager with Markdown support and Nextcloud / ownCloud integration.

项目地址:https://gitcode.com/gh_mirrors/qo/QOwnNotes
点击查看免费下载
上一篇:材料颜色工具库:Material Color Utilities 使用指南
下一篇:Diem CLI 客户端参考指南:连接 Testnet、账户操作与 Move 开发命令详解

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询