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)**的支持,官方文档将其列为重要亮点,并给出了两条具体措施:
stdenv现在会设置环境变量SOURCE_DATE_EPOCH为一个确定性值;- 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.nix、fcitx.nix、ibus.nix、nabi.nix、uim.nix(输入法框架统一入口)programs/fish.nix(Fish shell)services/x11/hardware/libinput.nixservices/x11/window-managers/windowlab.nix
安全相关
security/acme.nix(Let's Encrypt ACME 证书)security/audit.nixsecurity/oath.nixservices/security/haka.nixservices/security/physlock.nix
邮件相关
services/mail/dspam.nixservices/mail/opendkim.nixservices/mail/postsrsd.nixservices/mail/rspamd.nixservices/mail/rmilter.nix
监控与硬件
services/monitoring/longview.nixservices/monitoring/hdaps.nixservices/monitoring/heapster.nixservices/hardware/irqbalance.nix
网络与文件系统
services/misc/autofs.nixservices/network-filesystems/netatalk.nixservices/network-filesystems/xtreemfs.nixservices/networking/autossh.nixservices/networking/dnschain.nixservices/networking/gale.nixservices/networking/miniupnpd.nixservices/networking/namecoind.nixservices/networking/ostinato.nixservices/networking/pdnsd.nixservices/networking/shairport-sync.nixservices/networking/supplicant.nix
应用与系统服务
services/misc/bepasty.nix、calibre-server.nix、cfdyndns.nix、gammu-smsd.nix、mathics.nix、matrix-synapse.nix、octoprint.nixservices/search/kibana.nixservices/web-apps/pump.io.nixsystem/boot/initrd-network.nix、initrd-ssh.nixsystem/boot/loader/loader.nixsystem/boot/networkd.nix、resolved.nixvirtualisation/lxd.nix、virtualisation/rkt.nix
其中i18n/input-method目录在今天的仓库中依然存在,位于 nixos/modules/i18n/input-method,已演进为包含default.nix、ibus.nix、fcitx5.nix、hime.nix、kime.nix、nabi.nix、uim.nix等模块的完整输入法子系统。对比可见:当年的fcitx如今已升级为fcitx5,并新增了hime、kime等输入法——这正是 16.03 为 NixOS 输入法框架打下的基础在后续版本中的延续。
破坏性变更与迁移指南
从旧版本升级到 16.03 时,需要关注以下不兼容变更。每一类都给出了当时的官方迁移建议,以下完整继承并展开。
平台与图形镜像
- 不再为
i686-linux生成图形 ISO 镜像和 VirtualBox 镜像,但仍提供最小化 ISO 镜像。32 位 x86 用户需要改用最小镜像安装。
浏览器打包方式变化:Firefox 默认被包装
Firefox 及类似浏览器现在默认以包装(wrapped)形式提供,包名与属性名变为普通的
firefox、midori等。虽然设置了向后兼容属性,但nix-env -u不会把已有的firefox-with-plugins自动更新为新版firefox,必须先卸载旧名再安装新名:nix-env -e firefox-with-plugins nix-env -i firefox
窗口管理器相关变动
wmiiSnap被wmii_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参数,改为两个独立参数:extraNvidiaDeviceOptions与extraNouveauDeviceOptions,分别用于为 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模块也获得多项改进:正确的目录访问权限、新增aliasFiles与mapFiles选项等。
文件系统 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.cupsdConf与services.printing.cupsdFilesConf被移除——它们过去允许覆盖 CUPS 在 NixOS 上运行所必需的配置变量。对大多数场景,services.printing.extraConf与新增的services.printing.extraFilesConf已足够;若仍不满足,请提交 bug。 - 同时新增
services.printing.gutenprint选项,用于自动更新 Gutenprint 的 PPM 文件;官方强烈建议启用它,而不是把gutenprint加入drivers列表。
显卡驱动包配置迁移
services.xserver.vaapiDrivers已被移除,改用hardware.opengl.extraPackages与hardware.opengl.extraPackages32,VDPAU 驱动也可通过它们指定。
ibus 输入法迁移到 i18n.inputMethod
programs.ibus迁移到i18n.inputMethod.ibus:programs.ibus.enable→i18n.inputMethod.enabledprograms.ibus.plugins→i18n.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(可取值ibus、fcitx5、nabi、uim、hime、kime等)配合enable = true使用,且设置enabled时配置求值会产生迁移警告。这正说明了 16.03 开创的i18n.inputMethod体系后来逐步走向模块化、类型化的过程。
udev 规则写入位置调整
services.udev.extraRules现在把规则写入99-local.rules而非10-local.rules,保证用户自定义规则最后生效、结果不会被其他规则覆盖。
services.gitlab 模块重写
services.gitlab模块大部分被重写,提供新的配置选项。其中stateDir改名为statePath,satellitesDir被移除。升级后请重新审视当前可用选项。
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/second、1/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.gpggpg-agent(1)手册页的 "EXAMPLES" 一节提供了更多相关细节。
其他值得关注的改进
除上述变更外,16.03 还包含以下改进:
ejabberd模块回归:重新引入并可在 NixOS 上正常工作。- 输入法支持增强:新增 fcitx、nabi、uim 三个 NixOS 模块;新增 fcitx 引擎 chewing、hangul、m17n、mozc、table-other;新增 ibus 引擎 hangul、m17n。
升级路径小结
综合本版发布说明,从旧版本升级到 16.03 时建议按以下顺序排查:
- 工具链层面:注意 GCC 5 的 C++ ABI 变化,全量重新编译本地依赖,避免混用不同编译器版本产出的对象文件;
- 配置语法层面:优先处理会被直接拒绝的写法——
fileSystems的options改为字符串列表、nginx 改用modules列表、bumblebee 改用拆分的两个extra*DeviceOptions、nsd zone data 去掉$转义、syncthingdataDir指向精确目录、显式 import Gitit 模块、使用i18n.inputMethod新式输入法配置; - 运行数据层面:确认 Postfix、CUPS 数据目录迁移结果,重新生成 Broadcom 配置,按新方式配置 gpg-agent;
- 安全默认值层面:接受
allowPing默认开启与Ctrl+Alt+Backspace默认关闭这两个新默认值,并按需通过pingLimit与enableCtrlAltBackspace调整。
这些变更中确立的诸多约定(如fileSystems选项列表化、i18n.inputMethod体系、allowPing默认开启、SOURCE_DATE_EPOCH确定性时间戳)都延续至今,因此 16.03 的发布说明不仅是历史档案,也是理解 NixOS 现行配置语义的重要参照。
【免费下载链接】nixpkgsNix Packages collection & NixOS项目地址: https://gitcode.com/GitHub_Trending/ni/nixpkgs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考