- 包管理器
- 操作系统
【免费下载链接】nixpkgs
Nix Packages collection & NixOS
NixOS 14.12(代号 "Caterpillar",发布于 2014/12/30)是 nixpkgs 仓库历史上的一个关键里程碑版本,它同步升级了 systemd、Nix、Glibc、KDE 与 Linux 内核等核心组件,并首次实现了用户/组账号的完全声明式管理(users.mutableUsers语义修正)。本文将基于 rl-1412.section.md 的官方发布说明,结合当前 nixpkgs 仓库源码,逐条解读该版本的亮点、新服务与升级时必须注意的破坏性变更,帮助读者理解 NixOS 声明式配置模型的演进脉络并安全完成升级。
版本概览
Release 14.12 在大量新增与升级软件包之外,官方发布说明列出了以下核心亮点:
- systemd 升级至 217,带来大量改进;
- Nix 升级至 1.8;
- NixOS 全面切换至 Glibc 2.20;
- KDE 升级至 4.14;
- 默认 Linux 内核升级至 3.14;
users.mutableUsers行为修正:启用该选项(默认值)时,声明式修改用户/组会正确地在nixos-rebuild时被落实——例如从configuration.nix中删除某个用户定义,实际账号会被删除;禁用该选项时则不再强制要求指定 UID/GID,缺省值将动态分配。
以下各节将围绕这些重点展开,并补充仓库源码中的实现细节作为佐证。
核心组件版本升级一览
systemd 217
systemd 217 是该版本系统初始化的基石升级。NixOS 对 systemd 的集成深度体现在 nixos/modules/system/boot/systemd.nix 等模块中,服务单元由 Nix 表达式声明式生成,升级 systemd 意味着单元语法、日志(journald)与 udev 行为同步演进。对于普通用户而言,本次升级主要影响服务管理行为与日志格式,建议升级后执行一次nixos-rebuild switch并检查systemctl输出是否正常。
Nix 1.8 与 Glibc 2.20
Nix 1.8 为包管理器自身带来新特性,而 Glibc 2.20 则意味着整个系统基础 C 库的更新,影响所有二进制包的动态链接行为。由于 NixOS 的全系统可复现构建特性,这两项升级通过重新构建依赖树即可平滑完成,无需像传统发行版那样进行原地覆盖升级。
KDE 4.14 与 Linux 内核 3.14
桌面环境 KDE 更新至 4.14 系列,默认内核切换为 3.14 长期维护分支。内核版本对应 NixOS 对硬件驱动的默认支持范围,Intel GPU 驱动在本次版本中也升级到了 3.x 预发布版本并启用 DRI3 支持(详见下文不兼容变更)。
声明式用户与组管理:users.mutableUsers的行为修正
本节是 14.12 发布说明中最重要的行为变更之一,它直接关系到 NixOS"一切皆声明式"的核心哲学在用户账号管理上的落地。
启用mutableUsers(默认)时的语义
发布说明指出:当users.mutableUsers启用(默认值)时,对用户或组声明的修改会在nixos-rebuild时被正确实现。例如,从configuration.nix中移除某个用户的声明,实际系统账号会被一并删除。
这一点在当前仓库的 nixos/modules/config/users-groups.nix 中有完整定义(选项声明位于第 681–704 行):
users.mutableUsers = mkOption { type = types.bool; default = true; description = '' If set to `true`, you are free to add new users and groups to the system with the ordinary `useradd` and `groupadd` commands. On system activation, the existing contents of the `/etc/passwd` and `/etc/group` files will be merged with the contents generated from the `users.users` and `users.groups` options. The initial password for a user will be set according to `users.users`, but existing passwords will not be changed. ... ''; };也就是说,在mutableUsers = true时,系统激活阶段会把/etc/passwd、/etc/group中已有的内容与users.users、users.groups声明生成的内容进行合并:声明中删除的用户会被清理,而通过useradd等命令手工添加的用户仍然保留;新用户的初始密码按声明设置,但已有密码不会被覆盖。
底层实现位于 nixos/modules/config/update-users-groups.pl,该 Perl 脚本在激活时读取当前/etc/passwd(第 131 行%usersCur),随后在第 270–285 行将现存用户与声明用户合并并重写/etc/passwd、触发 nscd 缓存失效。这正是"删除声明即删除账号"的机制来源。
禁用mutableUsers时的语义
当users.mutableUsers = false时,激活阶段会直接替换/etc/passwd与/etc/group的内容(而非合并),同时所有密码也会被重置为users.users中声明的值——任何手工passwd修改都会在下次激活时被还原。对应脚本第 274 行if (!$spec->{mutableUsers} || defined $declUsers{$name})的分支逻辑,以及第 299 行$sp_pwdp = "!" if !$spec->{mutableUsers}的密码处理,都印证了这一点。
发布说明特别强调:禁用该选项后不再强制要求指定 UID/GID,未指定的 UID/GID 将被动态分配。这意味着即使使用mutableUsers = false的严格声明模式,也无需为每个用户手工挑选固定 ID,降低了配置负担。
14.12 之前与之后的差异
发布说明将"删除用户声明会导致实际账号被删除"列为 14.12 的新行为,说明此前版本在合并逻辑上并不完善。从源码结构看,users-groups.nix 中第 1238 行与第 1253 行分别对应mutableUsers为 true 时追加的清理逻辑与覆盖顺序文本生成,二者协同保证"声明的最终状态"被准确落实到系统账号数据库中。
14.12 新增服务一览
自上一版本以来,NixOS 新增了以下系统服务(module),覆盖网络、存储、监控、容器、邮件、数据库与桌面等类别:
容器与集群:docker、docker-registry、kubernetes、etcd、fleet、chronos、mesos、hbase、zookeeper、lxc、openvswitch
监控与运维:collectd、consul、fail2ban、influxdb、opentsdb、riemann、scollector、bosun、thermald
网络与安全:dnscrypt-proxy、i2pd、strongswan、openntpd、nsd、siproxd、seeks、uhub、polipo
桌面与多媒体:bspwm、fluxbox、gdm、gnome3.gnome-documents、gnome3.gnome-online-miners、gnome3.gvfs、gnome3.seahorse、liquidsoap、mopidy、peerflix
邮件与协作:gitlab、gitolite、mailpile、mlmmj、radicale、redmine、prosody
其他:atftpd、cpuminer-cryptonight、crashplan、fcgiwrap、geoclue2、monetdb、neo4j、parallels-guest、phd、tcsd、teamspeak3、torque/mrom、torque/server、unifi、znc
这些服务均以 NixOS module 形式提供,可通过services.<name>.enable = true的方式在configuration.nix中启用(部分模块在当前仓库的 nixos/modules/services 目录中仍可找到对应实现,如docker、consul、etcd等)。
升级注意:不兼容变更清单
从旧版本升级到 14.12 时,以下破坏性变更需要逐项核对。
Apache httpd 默认版本切换至 2.4
默认 Apache httpd 版本由 2.2 变为 2.4。若在配置中通过services.httpd.extraConfig传递字面的 Apache 配置文本,可能需要按 2.4 的配置语法调整(如访问控制指令由Order/Allow/Deny改为Require)。
如需继续使用 httpd 2.2,在 NixOS 配置中加入:
{ services.httpd.package = pkgs.apacheHttpd_2_2; }从当前源码看,nixos/modules/services/web-servers/apache-httpd/default.nix 中services.httpd.package选项(第 532 行,mkPackageOption pkgs "apacheHttpd")支持替换任意 httpd 包;同时extraConfig选项(第 545–553 行)的说明明确写道:"配置行会被追加到生成的 Apache 配置文件中,当configFile被覆盖时该机制将不生效"。因此在 2.4 迁移期,应优先在extraConfig中只追加 2.4 兼容的指令,或改用configFile提供完整自定义配置文件。
PHP 5.3 移除
PHP 5.3 因上游停止支持而被移除,官方提供迁移指南。升级后 PHP 相关配置应迁移到受支持的版本。
容器虚拟以太网对命名变更
容器宿主端的 veth 接口名由c-container-name改为ve-container-name。若依赖容器网络接口名称编写脚本或防火墙规则,需要同步更新。
GNOME 3.12 成为默认
GNOME 3.10 支持被移除,默认 GNOME 版本切换至 3.12。
VirtualBox 升级至 4.3.20
- 可能需要手动清理临时文件:
rm -rf /tmp/.vbox*; - 旧式导入写法
imports = [ <nixpkgs/nixos/modules/programs/virtualbox.nix> ]不再需要,改用services.virtualboxHost.enable = true; - hardening 模式默认启用:除非要使用 USB 支持,否则不再需要加入
vboxusers组。
当前仓库中 nixos/modules/virtualisation/virtualbox-host.nix 保留了 vboxusers 组的声明(第 143 行)与设备文件规则(第 179–181 行,将/dev/vboxdrv、/dev/vboxnetctl的属组设为vboxusers并授权0660),可见该组在硬件访问层面仍存在,只是普通场景下不再强制要求成员资格。
Chromium 升级与命名调整
Chromium 更新至 39.0.2171.65,enablePepperPDF默认启用;由于上游移除 NSAPI 支持,chromium*Wrapper系列包不再存在;chromium-stable更名为chromium。
Python 打包覆盖方式变更
Python 打包文档已并入 nixpkgs 手册。自定义 Python 可用包的覆盖方式由pkgs.pythonFull.override改为pkgs.pythonFull.buildEnv.override。
boot.resumeDevice限制
boot.resumeDevice = "8:6"这类设备号写法不再支持;大多数用户应保持该选项未定义,系统会自动选择 swap 分区。同时新增求值断言(evaluation assertion),确保该字符串以/开头。
默认时区从 CET 改为 UTC
系统默认时区由CET改为UTC。如需自定义,在configuration.nix中配置:
{ time.timeZone = "Asia/Shanghai"; }当前实现位于 nixos/modules/config/locale.nix:time.timeZone选项声明在第 24 行,第 92–93 行会据此生成/etc/localtime的 zoneinfo 链接(localtime.source = "/etc/zoneinfo/${config.time.timeZone}")。可用的时区值列表以 tz database 为准。
GNU screen 4.2.1
GNU screen 更新至 4.2.1,旧版本创建的会话将无法再连接,升级后需新建会话。
Intel GPU 驱动更新
Intel GPU 驱动升级到 3.x 预发布版本(与多数发行版一致),并新增 DRI3 支持。
升级建议
- 升级前先在
configuration.nix中核对上述不兼容项:ApacheextraConfig语法、boot.resumeDevice、imports中的 virtualbox 模块、Chromium 包名、PythonbuildEnv.override写法等; - 执行
nixos-rebuild switch后检查users.mutableUsers相关账号是否按预期被添加/删除——若此前使用useradd手工维护账号,需确认合并语义符合预期; - 若系统时区依赖
CET默认值,务必显式设置time.timeZone,避免升级后时间偏移; - 容器环境注意 veth 接口名变化对脚本与防火墙规则的影响。
总体而言,NixOS 14.12 通过声明式用户管理的行为修正,进一步兑现了"配置即系统状态"的设计理念;而系统组件的大规模升级与破坏性变更清单,也为后续版本(如 15.09 及之后)奠定了更现代的默认配置基线。更早版本的发布说明可在 nixos/doc/manual/release-notes 目录中查阅对照。
- 包管理器
- 操作系统
【免费下载链接】nixpkgs
Nix Packages collection & NixOS
相关推荐
Pillow 5.0.0 版本升级指南:不兼容变更、解压炸弹防护与 API 演进全解析
Pillow 5.0.0 版本升级指南:不兼容变更、解压炸弹防护与 API 演进全解析 导读 本文以仓库内 docs/releasenotes/5.0.0.rs
图像处理计算机视觉NixOS 用户与用户组管理完全指南:声明式、命令式与 Userborn 现代方案
NixOS 用户与用户组管理完全指南:声明式、命令式与 Userborn 现代方案 NixOS 提供了声明式(Declarative)与命令式(Imperati
包管理器操作系统Vitess 8.0.0 版本发布全解析:VEP-3 升级新规、系统变量 SET 支持与不兼容变更指南
Vitess 8.0.0 版本发布全解析:VEP 3 升级新规、系统变量 SET 支持与不兼容变更指南 本文以 Vitess 官方 8.0.0 Release
数据库分布式数据库云原生后端数据存储
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考