不可变系统:NixOS + systemd-repart + systemd-sysupdate

主要观点:为嵌入式设备构建软件时,存在如何构建和更新图像的问题,希望有近乎不可变的系统、无需复杂安装程序即可写入磁盘的磁盘映像以及从互联网安全下载更新的简单机制,systemd 项目的工具可解决这些问题。
关键信息:

  • 使用 systemd-repart 创建磁盘映像并应用分区方案,示例中为嵌入式设备构建了特定分区布局,包括 ESP、System A、System B 和 Persistent 分区。
  • 构建更新包需要新的 Nix 存储版本、新的 Linux 内核和 initrd(UKI),通过image.repart.split准备系统,nix build生成相关文件。
  • systemd-sysupdate 用于扫描更新源并应用更新,示例中配置了 UKI 和 Nix 存储的更新源与目标,可通过systemd-sysupdate应用更新,更新后可重启系统并清理旧版本。
    重要细节:
  • partitions.nix模块定义了分区配置,image.repart.partitions包含各分区的详细设置。
  • 构建更新包时,nix build生成appliance_18.efi.xzstore_18.img.xz等文件。
  • systemd-sysupdate 的配置在sysupdate.nix模块中,定义了 UKI 和 Nix 存储的更新源与目标路径等。
  • 应用更新时,systemd-sysupdate找到更新候选并进行安装,安装过程包括获取和导入更新文件等步骤,更新后可通过reboot重启系统,还可使用systemd-sysupdate vacuum清理旧版本。
    示例代码:
  • 构建初始磁盘映像:nix build.#appliance_17_image
  • 构建 UKI:nix build.#nixosConfigurations.appliance_18.config.system.build.uki
  • 构建更新包:nix build.#appliance_18_update
  • 应用更新:systemd-sysupdatesystemd-sysupdate update等。
    后续待添加内容:生长分区、首次启动自动创建/var、启动失败自动回滚、安全启动、基于 TPM 的磁盘加密等。
阅读 30
0 条评论