Hyffer
发布于 2026-03-18 / 23 阅读 / 0 评论 / 0 点赞

声明式配置、不可变设施和持久化存储

码数一体 vs 码数分离

程序(代码)与数据究竟应该揉作一团还是划清界限,从冯诺伊曼的"stored-program"理念[1],到如今用户在多台设备间使用网盘同步文件,不同发展时期、不同抽象层次,都有着各自的回答,用以解决特定的问题,无关对错。

在操作系统层面,程序与数据分离的做法更为普遍。通俗地说,当你使用Microsoft PowerPoint制作好PPT,通过U盘拷贝到会议室的电子屏,再用WPS Office打开它播放幻灯片,你已经在践行程序与数据分离的原则了。程序和数据分离伴有很多好处,例如Linux系统通常遵循Filesystem Hierarchy Standard (FHS)[2],将二进制可执行程序、配置文件、用户数据分别存储在不同目录,这样当系统更新时,不仅能保留用户文件,应用程序也可以延续先前的配置。

FHS提供了最基础的可维护性保障,但即便如此,面对长期运行的复杂系统,管理、升级和迁移工作仍是不小的挑战。市场期待着更加灵活便捷、易于操作的解决方案。

[1]EDVAC - Wikipedia: John Von Neumann's famous EDVAC monograph, First Draft of a Report on the EDVAC, proposed the main enhancement to its design that embodied the principal "stored-program" concept that we now call the Von Neumann architecture. This was the storing of the program in the same memory as the data.

[2]Filesystem Hierarchy Standard

容器的答卷

应用程序大规模部署对管理方案提出了极高的要求,而容器技术现已成为应用部署的事实标准,我们来看一看它是如何解决这些问题的。

如果了解过容器技术,或许对声明文件(Docker Compose file或Kubernetes manifest)、容器镜像(image)和持久卷(volume)这些概念并不陌生。容器镜像和持久卷沿袭了程序与数据分离的思路,程序作为无状态的只读基础设施包装在镜像里,设置和用户数据等“状态”则存储于持久卷;辅以在声明文件中显式挂载持久卷,有效地分隔了由程序状态造成的混乱与复杂。

声明式配置、不可变设施和持久化存储三者有机结合,构建出的高内聚低耦合结构,具有很高的灵活性和可维护性。操作系统不正是单节点应用部署吗?可否将这些设计运用到操作系统中呢?

操作系统现状

不可变系统

不可变操作系统(Immutable operating system)的主要特征是用户不能直接修改系统组件,应用程序也多以容器化方式安装,确保了良好的隔离性,便于各部分安全稳定地更新和回滚。目前越来越多的系统逐步采纳这一概念,如Fedora Silverblue和Ubuntu Core[3][4],以及为人熟知的Android[5]

immutable_os.png

[3]Why Fedora Silverblue? · J3RN's Blog

[4]Ubuntu Core as an immutable Linux Desktop base

[5]A/B (seamless) system updates  |  Android Open Source Project

Infrastructure as Code

Infrastructure as Code (IaC)通常译作“基础设施即代码”,典型的工具如Terraform和Ansible,赋予用户使用简短的文字说明来定义系统行为的能力,类似Dockerfile和Docker Compose之于容器,这种declarative(声明式)范式一定程度上解决了imperative(不知道咋翻译)系统的“状态漂移”、难以复现等问题[6]

[6]I've gone full Nix: Proxmox to NixOS + Incus | Bas Nijholt (Section "The Friction of Imperative Systems")

我全都要

不可变系统和IaC分别从两个角度尝试解决维护性问题,各有特点,互为补充。那有没有一种结合了所有优势的集大成者呢?经过一年多对NixOS的摸索与体验,也许,NixOS搭配Impermanence[7]就是一颗称手的银弹。

简要地说[8],NixOS与IaC相仿,通过声明文件架设操作系统,nix store则提供只读软件包作为不可变设施。另外,得益于独特的设计,NixOS允许使用易失性根文件系统,在重启时丢弃所有数据,配合Impermanence模块显式指明需要持久化保存的内容[7]。如此一来,便拼装出集“声明式配置”、“不可变设施”和“持久化存储”于一身,像容器一样灵活、整洁、易维护的操作系统。

[7]GitHub - nix-community/impermanence: Modules to help you handle persistent state on systems with ephemeral root storage [maintainer=@talyz] · GitHub: Lets you choose what files and directories you want to keep between reboots - the rest are thrown away.

[8]Nix和NixOS是一套庞大的体系,难以在较短的篇幅内阐述清楚,此处只聚焦它的部分特征。如果对NixOS和Impermanence感兴趣可以Google一下,网上有大量优质的教程和博客。