NixOS 镜像中的 Secret 管理

给 NixOS 的 Installer Image 加入 Secret 管理支持。 背景 玩 NixOS 玩到一定程度,都将面对 Secret 管理这一经典问题,当然对于一般的 NixOS Setup 来说,这并不是非常复杂的问题,有非常多的工具可以解决,如 sops-nix、agenix、vaultix 等。 但是,我们的 NixOS 系统还包括 Installer,要是 Installer 中也需要使用一些 Secret 怎么办呢?最近我就想定制一个 Installer ISO 包括一个完整的透明代理服务,以方便安装过程中访问某些不存在的网站。透明代理的节点和订阅链接都是需要保密的。然而这些 Secret 管理方案都不能直接用在 ISO 上,这也是本文需要解决的问题。 方案设计 Secret 管理基本机制 首先我们回顾一下在普通的 NixOS 系统中如何管理 Secret。 Secret 的内容需要保密,不可以直接内联在 NixOS 配置中,也不可以在 NixOS 构建阶段直接引用,否则会被复制到 /nix/store 中。这些内容需要首先被加密后再用于构建和部署,在系统真正开始运行时再动态地解密。 每个 Secret 都是以非对称加密的方式被保护的。Secret 需要可以被维护者修改,也需要可以被需要的机器解密。前者的加密解密使用用户所有的密钥对,一般称为 Identity,后者的加解密则使用机器所有的密钥对,一般就称为 Key,大多数情况下会使用 SSH key /etc/ssh/ssh_host_{rsa,ed25519}_key{,.pub}。用户使用 Identity 的 Public Key 加密明文,后续可以使用 Identity Private Key 查看已加密的内容。同时,对于需要使用这个 Secret 的机器,需要使用该机器的 Public Key 重加密内容,以便该机器可以用自己的 Private Key 在运行时解密内容。重加密过程需要用 Identity Private Key 解密获取原始内容。 ...

August 19, 2026 · 3 min · Justin Chen

现代 Linux 桌面会话管理

最近尝试了使用 Wayfire 作为 Wayland 混成器,整体体验后,Wayfire 的功能是不错的,可惜其没有 systemd 支持,对于依赖 systemd 的我来说,这显然是不能够满足日常需求的。因此,我研究了如何为其添加基于 systemd 的会话管理机制,记录在此文中。 桌面会话的生命周期 传统方式 在 Linux 中,本没有什么非常精细的会话管理机制,无论是 Shell 登录还是图形界面登录,一切都可以是非常简洁的流程完成。 Shell 登录时,Login Manager 以登录用户身份启动 Login Interactive Shell 进程,Shell 则运行相应的 Profile 脚本,如 bash(1) 加载 ~/.bash_profile 或 ~/.profile,作为最简单的会话管理机制,运行一些后台任务。对于图形界面来说,可以直接 startx、加载 ~/.xinitrc 、启动 X 服务器和 Window Manager 等进程,或者运行 Wayland 混成器,或者由 Display Manager 负责创建 X 服务器或 Wayland 混成器进程,而图形环境所需要的程序要么通过 ~/.xinitrc 这样的脚本启动,要么在 Window Manager 的配置文件中指定。 无论是什么方法,都是原始的机制。尽管它们原理十分简单,却存在诸多弊端,比如配置服务启动的方式不统一,Shell 登录、X 环境登录和 Wayland 环境登录需要各种不同的配置文件、需要写脚本以命令式的方式完成;比如这种方式没有充分利用 systemd 的支持,集成差、体验割裂。在 Linux 桌面系统中 systemd 早已普及的今天,这种原始方式显然跟不上时代。 基于 systemd 的现代方式 systemd 早已为 Linux 的各种应用场景设计好了一套服务和会话管理的框架,其关键点在于各种预定义的 target。target 是系统的生命周期的各个阶段起始或终止的标志,只要为每个程序写好 service 文件,并设置好其与 target 的关系,systemd 即可完全自动地在特定时间节点做好规划的工作,运行各种服务。 ...

February 18, 2026 · 5 min · Justin Chen