systemd v262 升级前检查:Type=notify-reload 会启动失败,networkd 的 IPv6ProxyNDPAddress= 已改名
systemd v262 已发布,日期为 2026-09-22。官方 release notes 在 systemd v262,完整变更列表见 NEWS。下面按 release notes 的分类整理升级后容易踩到的破坏性变更,以及运维会用到的新选项。
未来版本将移除/不兼容的接口
- systemd-logind 与 UAPI.1 Boot Loader Specification 的集成,也就是
systemctl reboot --boot-loader-entry=依赖的部分,目前仍支持特殊目录/run/boot-loader-entries/,允许在 ESP/XBOOTLDR 分区之外定义 boot loader entries。v263 计划移除/run/boot-loader-entries/及相关接口。UAPI.1 支持会保留。 - 实验性的
systemd-sysupdatedD-Bus API 将在下一个版本 v263 中移除。客户端应改为直接通过 Varlink IPC 与systemd-sysupdate通信。updatectl工具会按这个方向重做。
功能移除与不兼容变更
systemd-resolved DNS-SD 注册生命周期
通过 systemd-resolved 的 D-Bus 方法 org.freedesktop.resolve1.Manager.RegisterService() 注册的 DNS-SD 服务,现在会在注册它的客户端断开 bus 时自动注销。此前因为 bug,客户端跟踪从未真正生效,这类服务会一直保持注册,直到 systemd-resolved 退出。
这意味着客户端必须在服务需要保持注册期间一直保持 bus 连接。通过 busctl 或 gdbus 做的一次性注册,会随着工具退出被撤销。若要让 DNS-SD 服务独立于客户端生命周期存在,应使用 *.dnssd 文件,见 systemd.dnssd(5)。
构建选项
以下 Meson 选项已移除:
-Dlibiptc=,v259 弃用-Dlibidn=-Drc-local=-Dsysvinit-path=-Dsysvrcnd-path=,v260 起弃用且无效果
静态/多调用构建的 Meson 兼容性也变了:-Dbuild-executor-shared=single 被 -Dsystemd-multicall-binary=true 取代,-Dstandalone-binaries= 现在接受逗号分隔的模式列表。使用旧选项的现有 Meson 构建目录需要重新创建。
unit 与启动语义
Type=notify-reload的服务在发送READY=1时,现在必须捕获或阻塞ReloadSignal=。如果两者都没做,服务会因协议错误启动失败。旧行为允许这类服务启动,但后续 reload 可能触发信号的默认动作并终止服务。UnsetEnvironment=现在在ExecStart=及相关命令行的环境变量展开之后应用。也就是说,列在UnsetEnvironment=里的变量仍可在Exec*=命令行中使用,但不会出现在传给被执行进程的环境里。依赖整词$VAR引用被丢弃的 unit 需要更新。- sd-event 的 rate-limit 定时器,以及 manager 定时器如
StartLimitIntervalSec=,现在使用CLOCK_BOOTTIME而不是CLOCK_MONOTONIC。挂起时间也计入 rate-limit 过期。升级或 reexec 后,旧 manager 已经序列化的 rate-limit 状态可能比过去提前一次过期。 journalctl现在拒绝-F/--field与 unit、boot、time、cursor 或 grep 过滤器同时使用。以前这些过滤器会被静默忽略。
repart、ukify、sysupdate
systemd-repart的MakeSymlinks=现在会展开符号链接目标中的%说明符。以前只在来源中展开。ukify inspect --json=对包含重复 PE section 和 profile 的 UKI 改变了机器可读输出。重复 section 现在输出为数组,多 profile UKI 会在新的_profiles数组下描述每个 profile 的 section。systemd-repart在 initrd 中不再识别旧版FactoryResetEFI 变量。较新的FactoryResetRequestEFI 变量仍受支持。systemd-sysupdate.service和systemd-sysupdate.timer已重命名为systemd-sysupdate-update.service和systemd-sysupdate-update.timer,并提供了兼容符号链接。systemd-sysupdate二进制从bindir移回libexecdir,并再次标记为实验性。systemd-sysupdated的DescribeFeature()方法以及systemd-sysupdate features命令返回的 JSON 中,name键改为id。documentation键现在是字符串数组。
信任、TPM 与凭据
- 默认 OpenPGP keyring 查找现在会合并
/usr/下的 vendor keyring 和/etc/下的 local keyring。如果部署依赖单一/etc/keyring 来排除 vendor 信任,应显式设置$SYSTEMD_OPENPGP_KEYRING。 - TPM 封存的凭据现在固定到 TPM 的 SRK,用于防止 MITM interposer 攻击。此变更之后生成的 TPM-bound 凭据不被旧版 systemd 识别;新版 systemd 仍接受此变更之前创建的凭据。
- systemd-cryptsetup 的 crypttab 选项
tpm2-measure-bank=已弃用且无效果。卷密钥测量改为通过 varlink 调用systemd-pcrextend,由它自动选择所有合适的 TPM2 PCR bank。
udev、sysext/confext 状态输出与 nspawn
- systemd-udevd 的旧控制 socket 已移除,
udevadm现在无条件使用 Varlink IPC。旧的 UNIX socket/run/udev/control被替换为指向 Varlink socket 的符号链接。 systemd-sysext status --json=和systemd-confext status --json=的extensions字段现在始终是数组。未合并的 hierarchy 报告空数组,而不是字符串"none"。人类可读表格中未合并显示为-,而不是none。- 在
.nspawn文件中,当PrivateUsers=为pick或managed时,PrivateUsersOwnership=现在默认auto。以前pick默认chown,managed默认off。
systemd 与 service manager
- manager 现在内嵌一组基础 unit 文件,包括
basic.target、sysinit.target、multi-user.target、reboot.target、shutdown.target、systemd-poweroff.service等。当磁盘上无法加载 unit 文件时会使用这些内嵌版本。磁盘上的 unit 文件和 mask 优先于内嵌回退。这样容器可以不安装任何 unit 文件,直接用 systemd 作为 PID 1 启动。 - systemd 现在可以通过 Meson 配置
--default-library=static --prefer-static -Dbuild-static=true -Dsystemd-multicall-binary=true构建成单个静态链接的 PID 1/executor 二进制,适合非常小的容器。这类构建不在运行时用dlopen()加载可选库,并使用简化的 passwd/group 文件查找替代 NSS。 - service unit 新增
RestartRandomizedDelaySec=,在RestartSec=和可选指数退避之上,为自动重启增加均匀分布的额外延迟。可用于打散同步发生的故障/重启风暴。 - slice unit 新增
ActivatingConcurrencyMax=,限制一个 slice 层级中同时处于 activating 状态的 unit 数量。更多激活会排队,并在槽位释放后自动启动。 - manager 新增 D-Bus 方法
EnqueueUnitJobMany(),可在一次事务中为多个 unit 排队 start/stop/restart/reload job。systemctl和portablectl在可用时会使用它。 io.systemd.UnitVarlink 的StartTransient()方法现在接受更多 transient-unit 属性,包括 users、groups、credentials、root images/directories、namespace paths、常见 sandboxing 布尔值、UMask=、OOMScoreAdjust=、CollectMode=,以及随 Varlink 调用传入的 stdin/stdout/stderr 文件描述符。SecureBits=现在识别no-cap-ambient-raise、exec-restrict-file、exec-deny-interactive及其-locked变体。NUMAPolicy=现在接受preferred-many和weighted-interleave。前者要求 Linux 5.15 或更新,后者要求 Linux 6.9 或更新。ConditionCPUFeature=现在支持通过 ELF hwcaps 报告的 arm64 特性,CPU 特性名可以加ARCH.FEATURE前缀,例如arm64.bti。- socket unit 的
MessageQueueMessageSize=现在接受带 IEC 前缀后缀的字节值,例如Ki、Mi、Gi。 - service unit 新增
LUOSession=,让 systemd 创建 Live Update Orchestrator 会话,并通过文件描述符存储接口传递。 - PID 1 新增 D-Bus 属性
KExecCount,表示自上次真实启动以来系统经历的 kexec reboot 次数。它还暴露上一个 kexec 周期的 shutdown 时间戳。systemd-analyze time用它们报告 kexec/live-update 计时。 RestrictFileSystemAccess=现在允许从 overlayfs 挂载执行文件,前提是文件数据位于经过签名和验证的 dm-verity 保护文件系统上,同时仍拒绝可写 upper layer 中的文件。这要求内核 v7.2 或更新;旧内核上仍然完全拒绝从 overlayfs 挂载执行。.socketunit 管理的 AF_UNIX socket 现在可以标记扩展属性。socket unit 新增XAttrEntryPoint=、XAttrListen=和XAttrAccept=辅助设置。这要求 Linux 内核 7.0 起提供的 socket inode xattr 支持。- 通用
io.systemd.serviceVarlink 接口新增GetLogLevel()。 - hostname 设置逻辑在配置主机名时支持一种新的通配字符,例如通过
/etc/hostname。除了已有的?通配符,现在还有$,它会通过哈希从词表文件中选出一个词来解析。默认随系统提供三个这样的词表。 - 新增内核命令行选项
systemd.credentials_boot_policy=,控制何时接受用null密钥加密的 boot credentials。可取strict(从不)、tofu(首次启动或无 TPM2)、relaxed(SecureBoot 禁用或无 TPM2,默认)和off(总是)。 - systemd 现在会从 initrd 的
/.extra/system_credentials/导入凭据,作为受信任的系统凭据。已有的/.extra/credentials/和/.extra/global_credentials/位置仍被视为不受信任的 boot-loader 凭据。
sd-varlink 与 varlinkctl
- Varlink socket inode 会打上
user.varlink=xattr 标记。 varlinkctl新增list-sockets命令。
systemd-boot、systemd-stub 与 bootctl
- random seed 处理现在遵守
read-only的 ESP/vFAT 文件标志。如果后端卷或/loader/random-seed文件被标记为只读,systemd-boot 会跳过更新 seed,并且不会把它计入内核熵池。 - 如果 boot entry 文件被标记为只读,boot counting 逻辑也会被禁用。
- systemd-stub 现在会设置所有检测到的控制台,而不是只设置最好的一个。
bootctl新增link-autoverb,在/usr/lib/systemd/uki/以及/run/、/var/中的类似目录发现要链接的 UKI 和资源。启用systemd-sysupdate-notify-bootctl.socketunit 后,该逻辑可在 systemd-sysupdate 完成更新时自动执行。
systemd-hostnamed
Describe()现在额外暴露解析后的 machine tag 列表,为新的MachineTags字段。systemd-machine-tag@.service和SYSTEMD_MACHINE_TAG=udev 属性允许设备在启动早期为主机添加 machine tag。- systemd-hostnamed 的 Varlink 接口新增 setter 方法,用于 transient、static、pretty hostname、icon name、chassis、deployment 和 location 字段。还新增
SetTags()和AddAndRemoveTags()。 - machine tag 现在可以写成
key=value对。
systemd-networkd
.link、.network和.netdev文件的[Match]节新增MachineTag=。.network文件[Network]节中的IPv6ProxyNDPAddress=已重命名为ProxyNeighbor=,旧名仍作为弃用别名接受。ProxyNeighbor=可以添加 IPv4 和 IPv6 地址。networkctl reload新增--no-reconfigure,可从磁盘重新加载.network和.netdev文件,而不重新配置已有 link。- networkd 还涉及
.netdev中的IPoIB=、IPVLAN=、IPVTAP=、MACsec=、MACVLAN=、MACVTAP=、Tunnel=、VLAN=、VXLAN=和Xfrm=等设置。