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

发布时间:2026/9/23 2:20:06
NixOS 16.03 “Emu“ 发布说明全解读:核心升级、新增模块与破坏性变更迁移指南
NixOS 16.03 Emu 发布说明全解读核心升级、新增模块与破坏性变更迁移指南【免费下载链接】nixpkgsNix Packages collection NixOS项目地址: https://gitcode.com/GitHub_Trending/ni/nixpkgsNixOS 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.21Binutils 2.26此前为 2.23.1Perl 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 pythons 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.nixFacetime 高清摄像头i18n/input-method/default.nix、fcitx.nix、ibus.nix、nabi.nix、uim.nix输入法框架统一入口programs/fish.nixFish shellservices/x11/hardware/libinput.nixservices/x11/window-managers/windowlab.nix安全相关security/acme.nixLets 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 选项。CtrlAltBackspace 默认不再杀死 X serverCtrlAltBackspace组合键默认不再终止 X server这是有意的安全改动避免误触导致数据丢失。如需恢复该行为设置services.xserver.enableCtrlAltBackspace true;该选项在今天的仓库中依然存在见 nixos/modules/services/x11/xserver.nixenableCtrlAltBackspace mkOption { type types.bool; default false; description Whether to enable the DontZap option, which binds CtrlAltBackspace 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 compresslzo 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.extraPackages32VDPAU 驱动也可通过它们指定。ibus 输入法迁移到 i18n.inputMethodprograms.ibus迁移到i18n.inputMethod.ibusprograms.ibus.enable→i18n.inputMethod.enabledprograms.ibus.plugins→i18n.inputMethod.ibus.enginesi18n.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改名为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; }; }防火墙默认允许 pingnetworking.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默认开启与CtrlAltBackspace默认关闭这两个新默认值并按需通过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),仅供参考