NixOS 16.03 “Emu“ 发布说明全解读:核心升级、新增模块与破坏性变更迁移指南
2026/9/23 2:19:57 网站建设 项目流程

NixOS 16.03 "Emu" 发布说明全解读:核心升级、新增模块与破坏性变更迁移指南

【免费下载链接】nixpkgsNix Packages collection & NixOS项目地址: https://gitcode.com/GitHub_Trending/ni/nixpkgs

NixOS 16.03(代号 "Emu",发布于 2016/03/31)是 NixOS 历史版本周期中的一次重要迭代,本文基于仓库内原始发布说明 rl-1603.section.md 展开,系统梳理该版本的工具链升级、可复现构建进展、新增服务模块,以及从旧版本升级时必须处理的全部破坏性变更与对应迁移写法。读完本文,你将能完整掌握 16.03 版本文档中所规定的 NixOS 模块新路径、新配置语法与升级路径,并可从当前仓库源码中对照验证这些机制至今的演进脉络。

版本概览:代号 "Emu" 与发布时间

NixOS 16.03 发布于 2016/03/31,代号 "Emu"。这一版本的总体基调是"大量新增与升级软件包":系统基础组件全面换代,新增了一大批系统服务模块,同时引入了若干在升级时不可忽视的不兼容变更。本文档在仓库中的位置为 nixos/doc/manual/release-notes/rl-1603.section.md,属于 NixOS 手册 release-notes 系列的一部分,可结合同目录下其他版本说明(如 rl-2505.section.md、rl-2511.section.md)对照阅读版本演进脉络。

核心升级亮点:系统组件全面换代

16.03 对底层系统组件进行了一轮集中升级,这是该版本最直观的变化:

  • Systemd 229(此前为 217):带来大量上游改进,包括对 socket、service 单元解析与设备管理的多项增强;
  • Linux 4.4(此前为 3.18):内核主线推进两个大版本;
  • GCC 5.3(此前为 4.9):需要特别注意的是,GCC 5 以不兼容的方式改变了 C++ ABI,如果尝试链接由不同版本 GCC 编译的目标文件,可能会出现问题。这正是官方文档明确提示的风险点;
  • Glibc 2.23(此前为 2.21);
  • Binutils 2.26(此前为 2.23.1);
  • Perl 5.22

这一组合说明 16.03 是一次覆盖编译器、C 库、链接器、内核与初始化系统全链路的"换代型"版本,对使用 C/C++ 生态的开发者而言,升级后应重新编译所有依赖,避免混用不同 ABI 的对象文件。

可复现构建:SOURCE_DATE_EPOCH 与构建确定性

16.03 大幅加强了对**按位可复现构建(bitwise reproducible builds)**的支持,官方文档将其列为重要亮点,并给出了两条具体措施:

  1. stdenv现在会设置环境变量SOURCE_DATE_EPOCH为一个确定性值;
  2. Nix 1.11 新增一个选项,可让同一构建重复执行多次以检验构建的确定性。

这一机制的长期目标是实现完全可复现:让二进制产物可以被独立验证——例如,用户可以只信任出现在三个独立二进制缓存中的二进制。这可以视为后来 Nix 生态中广泛讨论的"信任根由缓存与来源验证共同决定"理念的早期落地。

从当前仓库源码可以进一步印证SOURCE_DATE_EPOCH的实现细节。在 pkgs/stdenv/generic/setup.sh 中:

# Set a fallback default value for SOURCE_DATE_EPOCH, used by some build tools # to provide a deterministic substitute for the "current" time. Note that # 315532800 = 1980-01-01 12:00:00. We use this date because python's wheel # implementation uses zip archive and zip does not support dates going back to # 1970. export SOURCE_DATE_EPOCH : "${SOURCE_DATE_EPOCH:=315532800}"

这段代码揭示了两个关键事实:

  • SOURCE_DATE_EPOCH的兜底默认值是315532800,对应1980-01-01 12:00:00
  • 之所以不选更早的 1970 时间戳,是因为 Python 的 wheel 打包实现基于 zip 归档,而 zip 格式不支持早于 1970 的日期。

也就是说,即使构建工具在未显式传递时间信息时,也会拿到一个确定的基准时间,而不是"当前时间",从而使输出中嵌入的时间戳具备确定性。这一默认值机制在今天的 stdenv 中依然保留,可见 16.03 确立的可复现构建基础延续至今。

新增服务模块一览

16.03 一次性引入了大量新服务模块。这些模块路径均为相对nixos/modules的路径,按类别整理如下:

输入法与桌面程序

  • hardware/video/webcam/facetimehd.nix(Facetime 高清摄像头)
  • i18n/input-method/default.nixfcitx.nixibus.nixnabi.nixuim.nix(输入法框架统一入口)
  • programs/fish.nix(Fish shell)
  • services/x11/hardware/libinput.nix
  • services/x11/window-managers/windowlab.nix

安全相关

  • security/acme.nix(Let's Encrypt ACME 证书)
  • security/audit.nix
  • security/oath.nix
  • services/security/haka.nix
  • services/security/physlock.nix

邮件相关

  • services/mail/dspam.nix
  • services/mail/opendkim.nix
  • services/mail/postsrsd.nix
  • services/mail/rspamd.nix
  • services/mail/rmilter.nix

监控与硬件

  • services/monitoring/longview.nix
  • services/monitoring/hdaps.nix
  • services/monitoring/heapster.nix
  • services/hardware/irqbalance.nix

网络与文件系统

  • services/misc/autofs.nix
  • services/network-filesystems/netatalk.nix
  • services/network-filesystems/xtreemfs.nix
  • services/networking/autossh.nix
  • services/networking/dnschain.nix
  • services/networking/gale.nix
  • services/networking/miniupnpd.nix
  • services/networking/namecoind.nix
  • services/networking/ostinato.nix
  • services/networking/pdnsd.nix
  • services/networking/shairport-sync.nix
  • services/networking/supplicant.nix

应用与系统服务

  • services/misc/bepasty.nixcalibre-server.nixcfdyndns.nixgammu-smsd.nixmathics.nixmatrix-synapse.nixoctoprint.nix
  • services/search/kibana.nix
  • services/web-apps/pump.io.nix
  • system/boot/initrd-network.nixinitrd-ssh.nix
  • system/boot/loader/loader.nix
  • system/boot/networkd.nixresolved.nix
  • virtualisation/lxd.nixvirtualisation/rkt.nix

其中i18n/input-method目录在今天的仓库中依然存在,位于 nixos/modules/i18n/input-method,已演进为包含default.nixibus.nixfcitx5.nixhime.nixkime.nixnabi.nixuim.nix等模块的完整输入法子系统。对比可见:当年的fcitx如今已升级为fcitx5,并新增了himekime等输入法——这正是 16.03 为 NixOS 输入法框架打下的基础在后续版本中的延续。

破坏性变更与迁移指南

从旧版本升级到 16.03 时,需要关注以下不兼容变更。每一类都给出了当时的官方迁移建议,以下完整继承并展开。

平台与图形镜像

  • 不再为i686-linux生成图形 ISO 镜像和 VirtualBox 镜像,但仍提供最小化 ISO 镜像。32 位 x86 用户需要改用最小镜像安装。

浏览器打包方式变化:Firefox 默认被包装

  • Firefox 及类似浏览器现在默认以包装(wrapped)形式提供,包名与属性名变为普通的firefoxmidori等。虽然设置了向后兼容属性,但nix-env -u不会把已有的firefox-with-plugins自动更新为新版firefox,必须先卸载旧名再安装新名:

    nix-env -e firefox-with-plugins nix-env -i firefox

窗口管理器相关变动

  • wmiiSnapwmii_hg取代services.xserver.windowManager.wmii.enable已同步更新,因此只有显式安装过wmiiSnap的用户才受影响。
  • wmiimenu被移除,因为上游开发者已删除该项目;请改用wmii-hg包中的wimenu

jobs选项移除

  • NixOS 的jobs选项已被移除。它此前充当 Upstart job 与 Systemd service 之间的兼容层,随着所有服务重写为systemd.services,该兼容层不再需要。

Gitit 不再自动加入模块列表

  • Gitit 不再自动注册进 NixOS 模块列表,因此不会再生成对应的 manual 条目。如需使用,必须在 NixOS 配置中显式imports

    { imports = [ <nixpkgs/nixos/modules/services/misc/gitit.nix> ]; }

    这样才会包含 Gitit 服务的全部配置选项。

nginx 模块参数化

  • nginx不再接受用于启用/禁用模块的标志参数,改为接受modules参数(要编译进 nginx 的模块列表)。所有模块统一放在nginxModules集合中:

    nginx.override { modules = [ nginxModules.rtmp nginxModules.dav nginxModules.moreheaders ]; }

包移除与替换

  • s3sync移除:上游已停止开发约 4 年,且仅支持 ruby 1.8。官方建议改用仍在活跃开发的tarsnap等替代方案。
  • ruby_1_8移除:上游不再支持,且大概率存在安全问题。
  • tidy-html5包移除:上游在开发阶段只提供(lib)tidy5,如今又改回(lib)tidy作为原长期无人维护包的替代品。可直接改用已更新到该新上游稳定版的html-tidy包。

bumblebee 的 X11 选项拆分

  • bumblebee包不再接受extraDeviceOptions参数,改为两个独立参数:extraNvidiaDeviceOptionsextraNouveauDeviceOptions,分别用于为 nvidia 与 nouveau 驱动设置额外的 X11 选项。

Ctrl+Alt+Backspace 默认不再杀死 X server

  • Ctrl+Alt+Backspace组合键默认不再终止 X server(这是有意的安全改动,避免误触导致数据丢失)。如需恢复该行为,设置:

    services.xserver.enableCtrlAltBackspace = true;

    该选项在今天的仓库中依然存在,见 nixos/modules/services/x11/xserver.nix:

    enableCtrlAltBackspace = mkOption { type = types.bool; default = false; description = '' Whether to enable the DontZap option, which binds Ctrl+Alt+Backspace to forcefully kill X. This can lead to data loss and is disabled by default. ''; };

    其默认值从 16.03 起一直是false(禁用),并在 xserver.nix 第 980 行 处映射为 X 配置中的Option "DontZap":启用时为"off"、禁用时为"on",即通过 X 的 DontZap 机制实现。

emacsPackagesNg 扩容

  • emacsPackagesNg现在包含 ELPA、MELPA 与 MELPA Stable 三个仓库中的全部包。

Postfix 数据目录迁移

  • Postfix MTA 的数据目录从/var/postfix迁移到/var/lib/postfix,旧配置会自动迁移。service.postfix模块也获得多项改进:正确的目录访问权限、新增aliasFilesmapFiles选项等。

文件系统 options 改为字符串列表

  • 文件系统的options现在应配置为字符串列表,而非逗号分隔的字符串。旧写法仍可用但会打印警告,并将在 16.09 版本移除。新写法示例:

    { fileSystems."/example" = { device = "/dev/sdc"; fsType = "btrfs"; options = [ "noatime" "compress=lzo" "space_cache" "autodefrag" ]; }; }

    这一约定延续至今:在 nixos/modules/tasks/filesystems.nix 中,fileSystems.*.options的声明为type = types.nonEmptyListOf nonEmptyStr,默认值为[ "defaults" ],与mount(8)的挂载选项和fstab(5)fs_mntops字段一一对应。

CUPS 数据目录迁移与配置选项调整

  • services.printing模块安装的 CUPS,数据目录现位于/var/lib/cups。旧的/etc/cups配置会自动迁移过去,但可能存在迁移不完整的问题。
  • 配置选项services.printing.cupsdConfservices.printing.cupsdFilesConf被移除——它们过去允许覆盖 CUPS 在 NixOS 上运行所必需的配置变量。对大多数场景,services.printing.extraConf与新增的services.printing.extraFilesConf已足够;若仍不满足,请提交 bug。
  • 同时新增services.printing.gutenprint选项,用于自动更新 Gutenprint 的 PPM 文件;官方强烈建议启用它,而不是把gutenprint加入drivers列表。

显卡驱动包配置迁移

  • services.xserver.vaapiDrivers已被移除,改用hardware.opengl.extraPackageshardware.opengl.extraPackages32,VDPAU 驱动也可通过它们指定。

ibus 输入法迁移到 i18n.inputMethod

  • programs.ibus迁移到i18n.inputMethod.ibus
    • programs.ibus.enablei18n.inputMethod.enabled
    • programs.ibus.pluginsi18n.inputMethod.ibus.engines
  • i18n.inputMethod.enabled应设置为所使用的输入法名称,ibus 对应"ibus"

新写法:

{ i18n.inputMethod.enabled = "ibus"; i18n.inputMethod.ibus.engines = with pkgs.ibus-engines; [ anthy mozc ]; }

等价于旧写法:

{ programs.ibus.enable = true; programs.ibus.plugins = with pkgs; [ ibus-anthy mozc ]; }

这一子系统在今天已进一步演进。在 nixos/modules/i18n/input-method/default.nix 中可以看到:enabled选项已被标记为deprecated,改为推荐type(可取值ibusfcitx5nabiuimhimekime等)配合enable = true使用,且设置enabled时配置求值会产生迁移警告。这正说明了 16.03 开创的i18n.inputMethod体系后来逐步走向模块化、类型化的过程。

udev 规则写入位置调整

  • services.udev.extraRules现在把规则写入99-local.rules而非10-local.rules,保证用户自定义规则最后生效、结果不会被其他规则覆盖。

services.gitlab 模块重写

  • services.gitlab模块大部分被重写,提供新的配置选项。其中stateDir改名为statePathsatellitesDir被移除。升级后请重新审视当前可用选项。

nsd zone data 不再转义$

  • services.nsd.zones.<name>.data不再把美元符号($)解释为 shell 变量,因此无需再转义。如下 zone data:

    $ORIGIN example.com. $TTL 1800 @ IN SOA ns1.vpn.nbp.name. admin.example.com. (

    应修改为 nsd 实际期望的文件内容(去掉转义后的\$):

    $ORIGIN example.com. $TTL 1800 @ IN SOA ns1.vpn.nbp.name. admin.example.com. (

syncthing 的 dataDir 语义收紧

  • service.syncthing.dataDir现在必须指向 syncthing 实际写入数据的那个文件夹,示例:

    { services.syncthing = { enable = true; dataDir = "/home/somebody/.syncthing"; user = "somebody"; }; }

防火墙默认允许 ping

  • networking.firewall.allowPing现在默认启用。官方建议用户为自己的机器配置适当的速率限制,可以:

    • 通过内核接口配置:/proc/sys/net/ipv4/icmp_ratelimit/proc/sys/net/ipv6/icmp/ratelimit
    • 或直接使用 NixOS 选项networking.firewall.pingLimit

    该行为与当前仓库源码一致:在 nixos/modules/services/networking/firewall.nix 中,allowPing的默认值为true,且文档指出 ICMPv6 ping 始终允许(因为 IPv6 更大的地址空间使网络扫描效率更低)。pingLimit默认null,可设置为限速规则字符串,例如 iptables 风格--limit 1/minute --limit-burst 5,或 nftables 风格2/second1/minute burst 5 packets

Broadcom 无线网卡配置生成问题

  • 部分 Broadcom 网卡此前生成的配置不再被接受。若遇到类似错误:

    error: path ‘/nix/store/*-broadcom-sta-*’ does not exist and cannot be created

    应重新运行nixos-generate-config,或在/etc/nixos/hardware-configuration.nix中把"${config.boot.kernelPackages.broadcom_sta}"手动替换为config.boot.kernelPackages.broadcom_sta。相关讨论详见当时 nixpkgs 的 PR #12595。

startGnuPGAgent 移除与 gpg-agent 新式配置

  • services.xserver.startGnuPGAgent选项被移除。原因是 GnuPG 2.1.x 改变了 gpg-agent 的工作方式,新的方案不再需要(也不再支持)NixOS 旧实现中"把所有东西作为 agent 子进程启动"的做法。

为 X 会话配置 gpg-agent,请把以下内容加入~/.bashrc或 shell 启动时会被 source 的文件:

GPG_TTY=$(tty) export GPG_TTY

若还要让 gpg-agent 承担 SSH 的 agent 角色,则在会话初始化处(例如displayManager.sessionCommands)添加:

gpg-connect-agent /bye unset SSH_AGENT_PID export SSH_AUTH_SOCK="''${HOME}/.gnupg/S.gpg-agent.ssh"

并确保~/.gnupg/gpg-agent.conf中包含:

enable-ssh-support

之后需要用ssh-add重新添加 SSH 密钥。如果 gpg 对私钥的新格式自动转换失败,还需要重新导入私钥环:

gpg --import ~/.gnupg/secring.gpg

gpg-agent(1)手册页的 "EXAMPLES" 一节提供了更多相关细节。

其他值得关注的改进

除上述变更外,16.03 还包含以下改进:

  • ejabberd模块回归:重新引入并可在 NixOS 上正常工作。
  • 输入法支持增强:新增 fcitx、nabi、uim 三个 NixOS 模块;新增 fcitx 引擎 chewing、hangul、m17n、mozc、table-other;新增 ibus 引擎 hangul、m17n。

升级路径小结

综合本版发布说明,从旧版本升级到 16.03 时建议按以下顺序排查:

  1. 工具链层面:注意 GCC 5 的 C++ ABI 变化,全量重新编译本地依赖,避免混用不同编译器版本产出的对象文件;
  2. 配置语法层面:优先处理会被直接拒绝的写法——fileSystemsoptions改为字符串列表、nginx 改用modules列表、bumblebee 改用拆分的两个extra*DeviceOptions、nsd zone data 去掉$转义、syncthingdataDir指向精确目录、显式 import Gitit 模块、使用i18n.inputMethod新式输入法配置;
  3. 运行数据层面:确认 Postfix、CUPS 数据目录迁移结果,重新生成 Broadcom 配置,按新方式配置 gpg-agent;
  4. 安全默认值层面:接受allowPing默认开启与Ctrl+Alt+Backspace默认关闭这两个新默认值,并按需通过pingLimitenableCtrlAltBackspace调整。

这些变更中确立的诸多约定(如fileSystems选项列表化、i18n.inputMethod体系、allowPing默认开启、SOURCE_DATE_EPOCH确定性时间戳)都延续至今,因此 16.03 的发布说明不仅是历史档案,也是理解 NixOS 现行配置语义的重要参照。

【免费下载链接】nixpkgsNix Packages collection & NixOS项目地址: https://gitcode.com/GitHub_Trending/ni/nixpkgs

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询