<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Nix 与 NixOS 专题：声明式系统管理的函数式革命 on PlumePHP</title><link>https://plumephp.com/posts/nix/</link><description>Recent content in Nix 与 NixOS 专题：声明式系统管理的函数式革命 on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Mon, 28 Sep 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/posts/nix/index.xml" rel="self" type="application/rss+xml"/><item><title>Nix Flake 模板实战：从零搭建多语言项目脚手架</title><link>https://plumephp.com/nix-flake-templates/</link><pubDate>Mon, 28 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nix-flake-templates/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;每个新项目都要「从零配一遍环境」——语言版本、工具链、CI 配置，换个机器又得重来。&lt;strong&gt;Nix Flake 模板&lt;/strong&gt;把这些固化成一个可复用的 &lt;code&gt;flake init&lt;/code&gt; 模板：一条命令初始化出带 devShell、构建、检查、CI 的项目骨架。本文讲清模板体系、常用模板、以及如何自建团队的标准化模板。&lt;/p&gt;</description></item><item><title>NixOS 存储与文件系统：分区、LVM、Btrfs 与磁盘管理</title><link>https://plumephp.com/nixos-storage-filesystems/</link><pubDate>Mon, 28 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nixos-storage-filesystems/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;存储是系统的地基——分区错了、挂载选项不当、文件系统选错，都会在数据量与故障面前付出代价。NixOS 把存储也做成&lt;strong&gt;声明式&lt;/strong&gt;：分区、挂载、swap、LVM、文件系统选项全在配置里声明，&lt;code&gt;nixos-rebuild switch&lt;/code&gt; 统一生效。本文从分区讲到 Btrfs 快照与 ZFS，覆盖服务器最常见的存储场景。&lt;/p&gt;</description></item><item><title>NixOS 密钥管理实战：sops-nix、agenix 与声明式秘钥分发</title><link>https://plumephp.com/nix-secrets-management/</link><pubDate>Mon, 28 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nix-secrets-management/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;把数据库密码、API Key 写进 &lt;code&gt;configuration.nix&lt;/code&gt; 是最大的安全隐患——配置会进 git、会分享、会在 history 里裸奔。NixOS 生态给出&lt;strong&gt;声明式密钥管理&lt;/strong&gt;：密钥加密存储、部署时解密到内存/临时文件、可多主机分发、可轮换。本文以 &lt;strong&gt;sops-nix&lt;/strong&gt;（现代主流）为主线，对比 &lt;strong&gt;agenix&lt;/strong&gt;，讲清从加密到注入服务的完整链路。&lt;/p&gt;</description></item><item><title>NixOS 服务管理实战：systemd 声明、NixOS 容器与常用服务部署</title><link>https://plumephp.com/nixos-services-containers/</link><pubDate>Mon, 28 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nixos-services-containers/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;NixOS 上「部署一个服务」不是写 shell 脚本和 systemd unit 文件，而是&lt;strong&gt;在 configuration.nix 里声明它&lt;/strong&gt;——NixOS 会帮你生成 systemd unit、装好依赖、配好开机自启，全部可回滚。本文从声明一个 systemd 服务讲起，到 NixOS 原生容器和 nginx/postgres 等常用服务的标准部署。&lt;/p&gt;</description></item><item><title>NixOS 网络与防火墙配置：声明式网络管理实战</title><link>https://plumephp.com/nixos-network-firewall/</link><pubDate>Mon, 28 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nixos-network-firewall/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;NixOS 的网络配置和整个系统一样是&lt;strong&gt;声明式&lt;/strong&gt;的——所有网卡、地址、路由、防火墙规则都在 &lt;code&gt;configuration.nix&lt;/code&gt; 里写死，&lt;code&gt;nixos-rebuild switch&lt;/code&gt; 一次生效、可回滚。本文从接口配置讲到防火墙与 VPN，把 NixOS 网络管理的完整工具链给你，每步配可运行配置。&lt;/p&gt;</description></item><item><title>NixOS 运维实战：升级、回滚、GC 与日常维护</title><link>https://plumephp.com/nixos-operations-maintenance/</link><pubDate>Mon, 28 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nixos-operations-maintenance/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;NixOS 的运维能力是它区别于传统发行版的最大卖点：&lt;strong&gt;升级可回滚、世代可管理、store 可垃圾回收&lt;/strong&gt;。但「能回滚」不等于「会运维」——什么时候升级、怎么升级、磁盘怎么瘦身、坏了怎么恢复，本文给一套完整的 NixOS 日常运维手册。&lt;/p&gt;</description></item><item><title>交叉编译与 overlay：异构构建全攻略</title><link>https://plumephp.com/nix-cross-compilation-overlay/</link><pubDate>Sat, 26 Sep 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/nix-cross-compilation-overlay/</guid><description>&lt;h2 id="1-交叉编译为什么难nix-为什么能做好"&gt;1. 交叉编译为什么难，Nix 为什么能做好&lt;/h2&gt;
&lt;p&gt;传统交叉编译的痛点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;工具链混乱：&lt;code&gt;arm-linux-gnueabihf-gcc&lt;/code&gt;、&lt;code&gt;aarch64-linux-gnu-gcc&lt;/code&gt; 各种前缀，依赖库也要为 target 编译&lt;/li&gt;
&lt;li&gt;依赖地狱：一个库的交叉编译依赖链很长，手工管理必然出错&lt;/li&gt;
&lt;li&gt;环境漂移：编译机的 glibc/内核头文件影响产物&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nix 的两大机制让它成为交叉编译的最优解：&lt;/p&gt;</description></item><item><title>可复现开发环境：devenv.sh、devShells 与 direnv</title><link>https://plumephp.com/nix-devenv-reproducible-dev/</link><pubDate>Sat, 26 Sep 2026 13:00:00 +0800</pubDate><guid>https://plumephp.com/nix-devenv-reproducible-dev/</guid><description>&lt;h2 id="1-开发环境的最后一公里难题"&gt;1. 开发环境的「最后一公里」难题&lt;/h2&gt;
&lt;p&gt;包可以复现、构建可以缓存，但&lt;strong&gt;开发者的 shell 环境&lt;/strong&gt;仍然充满非确定性：&lt;code&gt;node --version&lt;/code&gt; 是 18 还是 20？&lt;code&gt;PYTHONPATH&lt;/code&gt; 指向哪？&lt;code&gt;pre-commit&lt;/code&gt; 装的钩子版本对吗？换台机器、换个同事，环境就漂移。&lt;/p&gt;</description></item><item><title>NixOS 模块系统：options 声明与模块合并语义</title><link>https://plumephp.com/nixos-module-system/</link><pubDate>Sat, 26 Sep 2026 12:00:00 +0800</pubDate><guid>https://plumephp.com/nixos-module-system/</guid><description>&lt;h2 id="1-模块系统解决什么问题"&gt;1. 模块系统解决什么问题&lt;/h2&gt;
&lt;p&gt;普通配置文件（INI/YAML/TOML）的问题是**「覆盖」是隐式的**：A 配置里写了 &lt;code&gt;port = 8080&lt;/code&gt;，B 配置里写了 &lt;code&gt;port = 9090&lt;/code&gt;，最终谁赢取决于加载顺序，且无法表达「合并」或「条件生效」。&lt;/p&gt;</description></item><item><title>Nix 构建与 CI：GitHub Actions 集成与 Cachix 缓存</title><link>https://plumephp.com/nix-ci-cachix/</link><pubDate>Sat, 26 Sep 2026 11:00:00 +0800</pubDate><guid>https://plumephp.com/nix-ci-cachix/</guid><description>&lt;h2 id="1-为什么-ci-里用-nix"&gt;1. 为什么 CI 里用 Nix？&lt;/h2&gt;
&lt;p&gt;传统 CI（apt/yarn/pip 安装依赖）的问题：&lt;strong&gt;每次跑都是重新下载、版本漂移、缓存不可控&lt;/strong&gt;。Nix 改变这一切的核心在于：&lt;/p&gt;</description></item><item><title>Flakes 最佳实践：企业级布局与模块化拆分</title><link>https://plumephp.com/nix-flakes-best-practices/</link><pubDate>Sat, 26 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nix-flakes-best-practices/</guid><description>&lt;h2 id="1-从能用到可维护"&gt;1. 从「能用」到「可维护」&lt;/h2&gt;
&lt;p&gt;https://plumephp.com/nix-flakes/ 讲解了 flake.nix 的基本结构与命令；本文解决的是更高一层的问题：&lt;strong&gt;当 flake 从一个人练习变成多人、多项目、跨团队的共享基础设施时，怎么组织才不会烂掉？&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Nix 语言深度：函数、惰性求值与模块化抽象</title><link>https://plumephp.com/nix-language-deep-dive/</link><pubDate>Sat, 26 Sep 2026 09:00:00 +0800</pubDate><guid>https://plumephp.com/nix-language-deep-dive/</guid><description>&lt;h2 id="1-为什么还要深挖语言本身"&gt;1. 为什么还要深挖语言本身？&lt;/h2&gt;
&lt;p&gt;Nix 不是「一门附属于包管理器的配置格式」，而是一门图灵完备的&lt;strong&gt;纯函数式、惰性求值&lt;/strong&gt;语言。https://plumephp.com/nix-language-basics/ 覆盖了语法入门；但当你开始编写复杂的 &lt;code&gt;overlay&lt;/code&gt;、&lt;code&gt;lib.fix&lt;/code&gt;、&lt;code&gt;override&lt;/code&gt; 时，很快会撞上几个令人困惑的现象：&lt;/p&gt;</description></item><item><title>Home Manager 用户级配置</title><link>https://plumephp.com/nix-home-manager/</link><pubDate>Tue, 22 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nix-home-manager/</guid><description>&lt;h2 id="1-home-manager-的定位"&gt;1. Home Manager 的定位&lt;/h2&gt;
&lt;p&gt;Home Manager 是 Nix 生态系统中管理用户级配置的利器。它填补了 NixOS 系统级配置管理的一个空白——普通用户的个人环境配置。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决的问题&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dotfiles 管理&lt;/strong&gt;：&lt;code&gt;~/.bashrc&lt;/code&gt;、&lt;code&gt;~/.vimrc&lt;/code&gt;、&lt;code&gt;~/.config/&lt;/code&gt; 等配置文件散落各处，换机器或重装时需要数小时重新配置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户级包管理&lt;/strong&gt;：不需要 root 权限就能安装和管理个人工具&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨发行版一致&lt;/strong&gt;：无论在使用 Ubuntu、macOS、Arch 还是 NixOS，个人环境可以完全一致&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;版本控制&lt;/strong&gt;：所有配置以代码形式存储，变更可追溯、可回滚&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Home Manager 与 NixOS 的关系是互补的：NixOS 管理整个系统（系统服务、网络、硬件），Home Manager 管理用户个人环境（Shell 配置、编辑器设置、用户级包）。在 NixOS 上两者可以协同工作，在非 NixOS（如 Ubuntu 或 macOS）上 Home Manager 可以独立运行。&lt;/p&gt;</description></item><item><title>Nix Flakes 现代包管理</title><link>https://plumephp.com/nix-flakes/</link><pubDate>Tue, 22 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nix-flakes/</guid><description>&lt;h2 id="1-为什么需要-flakes"&gt;1. 为什么需要 Flakes？&lt;/h2&gt;
&lt;p&gt;在 Flakes 引入之前，Nix 面临几个长期困扰：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不可追踪的依赖&lt;/strong&gt;：&lt;code&gt;import &amp;lt;nixpkgs&amp;gt;&lt;/code&gt; 依赖于系统上配置的 nixpkgs 通道，不同机器上的通道版本可能不同&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;版本锁定缺失&lt;/strong&gt;：没有内置机制锁定外部依赖的确切版本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;命令不统一&lt;/strong&gt;：&lt;code&gt;nix-build&lt;/code&gt;、&lt;code&gt;nix-shell&lt;/code&gt;、&lt;code&gt;nix-env&lt;/code&gt; 等命令各有一套参数和行为&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可发现性差&lt;/strong&gt;：社区共享的 Nix 表达方式（如 GitHub 上的表达式）难以便捷引用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Flakes 通过以下设计解决了这些问题：&lt;/p&gt;</description></item><item><title>Nix Shell 开发环境</title><link>https://plumephp.com/nix-shell-development/</link><pubDate>Tue, 22 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nix-shell-development/</guid><description>&lt;h2 id="1-可复现开发环境的痛点"&gt;1. 可复现开发环境的痛点&lt;/h2&gt;
&lt;p&gt;传统开发环境管理面临诸多挑战：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&amp;ldquo;在我机器上能跑&amp;rdquo;&lt;/strong&gt;：不同开发者安装的开发工具版本不同，导致构建失败或行为不一致&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;依赖版本冲突&lt;/strong&gt;：项目需要 &lt;a href="https://plumephp.com/posts/python/"&gt;Python&lt;/a&gt; 3.9，但系统默认是 Python 3.11，全局安装会破坏其他项目&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新员工入职&lt;/strong&gt;：需要数天安装和配置开发工具链，文档往往过时&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://plumephp.com/posts/devops/"&gt;CI/CD&lt;/a&gt; 漂移&lt;/strong&gt;：本地构建通过但 CI 失败，因为 CI 环境用了不同的工具版本&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nix Shell 通过声明式配置解决了这些问题：开发环境配置以代码形式存储在项目仓库中，新成员只需运行一个命令即可获得完全一致的开发环境。&lt;/p&gt;</description></item><item><title>Nix 包管理实战</title><link>https://plumephp.com/nix-package-management/</link><pubDate>Tue, 22 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nix-package-management/</guid><description>&lt;h2 id="1-nix-包管理的核心理念"&gt;1. Nix 包管理的核心理念&lt;/h2&gt;
&lt;p&gt;传统的包管理器（如 apt、yum、pacman）在全局文件系统上安装软件包，这种方式面临几个根本性问题：依赖冲突、难以回滚、构建不可复现。Nix 包管理器通过以下创新解决了这些问题：&lt;/p&gt;</description></item><item><title>Nix 构建 Docker 镜像</title><link>https://plumephp.com/nix-nix-docker/</link><pubDate>Tue, 22 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nix-nix-docker/</guid><description>&lt;h2 id="1-传统-dockerfile-的痛点"&gt;1. 传统 &lt;a href="https://plumephp.com/posts/docker/"&gt;Dockerfile&lt;/a&gt; 的痛点&lt;/h2&gt;
&lt;p&gt;Docker 容器化彻底改变了软件部署方式，但 Dockerfile 本身存在几个根本性问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不稳定的构建&lt;/strong&gt;：&lt;code&gt;apt-get update &amp;amp;&amp;amp; apt-get install&lt;/code&gt; 的结果取决于构建时远程仓库的状态，今天构建和明天构建可能产生不同的镜像&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;层缓存陷阱&lt;/strong&gt;：不当的指令排序导致缓存失效，Dockerfile 越写越长、越来越复杂&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;图像膨胀&lt;/strong&gt;：&lt;code&gt;ubuntu:22.04&lt;/code&gt; 基础镜像已有 77MB，加上 &lt;a href="https://plumephp.com/posts/python/"&gt;Python&lt;/a&gt;、&lt;a href="https://plumephp.com/posts/nodejs/"&gt;Node&lt;/a&gt; 等运行时，最终镜像动辄数百 MB，而实际业务代码可能只有几十 MB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重复依赖&lt;/strong&gt;：10 个微服务都用了不同版本的 &lt;code&gt;node:18-alpine&lt;/code&gt;，每个镜像独立重复存储依赖&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全问题&lt;/strong&gt;：&lt;code&gt;apt-get install&lt;/code&gt; 引入的依赖包数量不可控，漏洞扫描发现大量并不需要的库&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nix 通过纯函数式构建和精确依赖追踪，从根本上解决了这些问题。&lt;/p&gt;</description></item><item><title>Nix 语言基础</title><link>https://plumephp.com/nix-language-basics/</link><pubDate>Tue, 22 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nix-language-basics/</guid><description>&lt;h2 id="1-nix-语言简介"&gt;1. Nix 语言简介&lt;/h2&gt;
&lt;p&gt;Nix 表达式语言（Nix Expression Language）是一门专门为软件包管理和系统配置设计的纯函数式编程语言。它的核心设计目标是实现&lt;strong&gt;可复现性&lt;/strong&gt;（Reproducibility）和&lt;strong&gt;声明式配置&lt;/strong&gt;（Declarative Configuration）——给定相同的 Nix 表达式，无论在何时何地求值，都会得到完全相同的结果。&lt;/p&gt;</description></item><item><title>NixOS 系统配置管理</title><link>https://plumephp.com/nixos-configuration/</link><pubDate>Tue, 22 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nixos-configuration/</guid><description>&lt;h2 id="1-nixos-的设计哲学"&gt;1. NixOS 的设计哲学&lt;/h2&gt;
&lt;p&gt;NixOS 与其他 &lt;a href="https://plumephp.com/posts/linux/"&gt;Linux&lt;/a&gt; 发行版最根本的区别在于它是&lt;strong&gt;完全声明式&lt;/strong&gt;的。传统的 Linux 系统是通过一系列命令和文件编辑逐步构建的，系统状态是命令序列的累积结果。而 NixOS 将系统的所有配置集中在 &lt;code&gt;configuration.nix&lt;/code&gt; 中——这个文件描述了整个系统的&amp;quot;目标状态&amp;quot;，NixOS 通过评估这个文件并将系统推进到该状态来工作。&lt;/p&gt;</description></item><item><title>NixOS 远程部署工具</title><link>https://plumephp.com/nix-deployment-tools/</link><pubDate>Tue, 22 Sep 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/nix-deployment-tools/</guid><description>&lt;h2 id="1-为什么需要专门的部署工具"&gt;1. 为什么需要专门的部署工具？&lt;/h2&gt;
&lt;p&gt;NixOS 的系统重建命令 &lt;code&gt;nixos-rebuild switch&lt;/code&gt; 设计初衷是在本地运行。但在以下场景中，需要在远程机器上执行配置更新：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;服务器集群管理&lt;/strong&gt;：几十台生产服务器需要统一更新 Nginx 配置或安全补丁&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;边缘节点部署&lt;/strong&gt;：树莓派集群、IoT 设备需要在不物理接触的情况下更新&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://plumephp.com/posts/devops/"&gt;CI/CD&lt;/a&gt; 集成&lt;/strong&gt;：&lt;a href="https://plumephp.com/posts/github-actions/"&gt;Git&lt;/a&gt; 提交后自动部署到测试环境和生产环境&lt;/li&gt;
&lt;li&gt;** secrets 管理**：配置中包含 API 密钥、证书等敏感数据，需要安全地传递到目标主机&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;手动 SSH 到每台服务器运行 &lt;code&gt;nixos-rebuild switch&lt;/code&gt; 显然不可扩展。Nix 社区开发了多种专用工具来解决这些需求。&lt;/p&gt;</description></item></channel></rss>