systemd v259 升级后会踩到的默认值与行为变化
Release 页面:(2025-12-17 发布)
v259 中有几处改动属于“不改配置也会变”的类型:journald 的默认存储模式、cgroup2 的挂载选项、networkd 的 NAT 实现路径。另外这一版还公告了 v260 的移除计划。
v260 之前要处理掉的遗留
- SysV service 脚本支持已废弃,v260 移除。涉及组件:
systemd-rc-local-generator、systemd-sysv-generator、systemd-sysv-install(即systemctl enable/disable/is-enabled的 hook)。 - v260 计划抬高的最低依赖:Linux kernel >= 5.10(建议 >= 5.14)、glibc >= 2.34、libxcrypt >= 4.4.0(不再支持 glibc 内置 libcrypt)、util-linux >= 2.37、elfutils >= 0.177、openssl >= 3.0.0、cryptsetup >= 2.4.0、libseccomp >= 2.4.0、python >= 3.9.0。
RootImageOptions=以及ExtensionImages=/MountImages=的镜像挂载参数解析方式下一版会变:重复定义时以最后一个为准。
默认值与不兼容变更
journald 默认 storage=persistent
journal 的默认存储模式改为 persistent。此前默认是 auto,在没有覆盖配置的情况下,由 /var/log/journal 是否存在决定实际模式。也就是说,没建这个目录的机器升级后行为会变。默认值可以通过 -Djournal-storage-default= 编译选项修改。
检查当前实际生效的配置和占用:
journalctl --disk-usage
systemd-analyze cat-config systemd/journald.conf | grep -i '^storage'
cgroup2 挂载 memory_hugetlb_accounting
cgroup2 现在带 memory_hugetlb_accounting 挂载选项(内核 6.6 起支持)。HugeTLB 的内存用量会计入 cgroup 的整体内存用量,参与 memory 控制器统计与限制判断。跑 MySQL、Redis 这类使用大页的服务,尤其是在容器里,会最先感受到这条。
检查挂载参数与某个 cgroup 的内存计数:
grep cgroup2 /proc/mounts
cat /sys/fs/cgroup//memory.stat
networkd 与 nspawn 只支持 nftables
systemd-networkd 和 systemd-nspawn 不再通过 iptables/libiptc API 创建 NAT 规则,只支持 nftables。依赖 iptables 后端生成 NAT 的配置,升级后不会再有对应规则。
nft list ruleset
TPM 1.2 支持移除
systemd-boot 与 systemd-stub 移除对 TPM 1.2 的支持,只保留 TPM 2.0。
LUKS 卷标加 luks- 前缀
systemd-repart 设置的 LUKS 卷标不再默认与分区/文件系统标签相同,而是加上 luks- 前缀,避免 /dev/disk/by-label/ 下的符号链接冲突。新增 VolumeLabel= 可显式指定。
ls -l /dev/disk/by-label/
另外两条
- 镜像自动 dissection 时,XBOOTLDR 分区强制校验为 VFAT 类型(安全考虑)。只影响走自动 dissection 的场景,
/etc/fstab里显式写死的条目仍可用其他文件系统。 systemd-machined暴露的“隐藏”磁盘镜像(名字以点开头)默认以只读方式提供。
Service manager / PID1
- Varlink IPC 扩展较多:可读取 service 的执行设置;
Unit.List()支持按 cgroup 或 invocation ID 过滤。 - 新增
Reload()与Reexecute()两个 Varlink 调用,与 D-Bus 对应。 $LISTEN_FDS协议扩展:新增$LISTEN_PIDFDID环境变量,内容是目标进程 pidfd 的 inode ID,用来消除 PID 复用带来的歧义。- service 退出时的日志除 CPU 时间外,还会打印 wallclock 时间。
- service unit(以及其他会派生进程的 unit 类型)新增
OOMKills和ManagedOOMKills属性,分别统计被内核和 systemd-oomd 杀掉的次数。
systemctl show -p OOMKills -p ManagedOOMKills
- 临时 service unit 新增
RootDirectoryFileDescriptor=,作用同RootDirectory=但接收 fd。 - 新增
UserNamespacePath=,与已有的IPCNamespacePath=/NetworkNamespacePath=对应。 - 新增
ExecReloadPost=:在 service 配置 reload 完成后执行的命令。 - job 激活事务会分配一个系统内唯一的 64 位数字 ID,作为额外字段记入日志。
- service manager 会跟踪存在 ordering cycle 的事务,并通过
TransactionsWithOrderingCycleD-Bus 属性暴露。
systemd-vmspawn / systemd-nspawn
- vmspawn 把挂载的块设备 “serial” 字段初始化为宿主机上 backing 文件的名字,方便用
/dev/disk/by-id引用。 - nspawn 的
[Network]段新增NamespacePath=(指向 network namespace inode 的路径)。 - vmspawn 新增
--bind-user=/--bind-user-shell=(与 nspawn 对齐),两者都新增--bind-user-group=。 - vmspawn 在 swtpm 支持时给 vTPM 配置 RSA4096;以
--console=gui启动时通过org.qemu.guest_agent.0启用 qemu guest agent。
systemd-repart
repart.d/drop-in 新增TPM2PCRs=与KeyFile=。- repart 功能可通过 Varlink IPC 调用。
- 可以传设备节点路径
-,只用于计算所需的最小块设备大小。 - 新增
--defer-partitions-empty=yes与--defer-partitions-factory-reset=yes。 Subvolumes=的值可以加:nodatacow后缀。
systemd-udevd
- udev 规则新增
OPTIONS="dump-json",以 JSON 输出当前事件状态(类似udevadm test --json=short)。 net_idbuiltin 在 DeviceTree 系统上能为 WiFi 设备生成可预测的接口名。- udevd 与 repart 改用
BLKPGioctl() 而不是BLKRRPART重读分区表,实现按分区的增量添加/删除/扩容。 - 块设备新增 udev 属性
ID_BLOCK_SUBSYSTEM(loopback、DM、MD、zram)。 - 为 GPIO 设备生成
/dev/gpio/by-id/...符号链接。
TPM2
systemd-pcrlock不再默认锁定 PCR 12。- NvPCRs(用 TPM2 NV Index 在
TPM2_NT_EXTEND模式下实现的 PCR)用于缓解 PCR 数量不足。userspace 之前不可用;需要在 initrd 中由systemd-tpm2-setup.service完成显式的 “anchor” 初始化;信息会被 measure 到 PCR 9;base handle 可通过 meson 设置tpm2-nvpcr-base配置。 - 新增
systemd-pcrproduct.service,把产品 ID(SMBIOS/Devicetree)measure 进名为 “hardware” 的 NvPCR。 systemd-pcrlock会生成覆盖 NvPCRs 的 CEL event log 数据。
systemd-analyze
- 新增子命令
dlopen-metadata,显示 ELF 二进制通过 dlopen() 形成的弱依赖元数据。 - 新增子命令
nvpcrs,列出 NvPCR 的名称与值,形式与已有的pcrs一致。
systemd-analyze nvpcrs
systemd-run / run0
run0新增--empower:以提权方式启动新会话但不切换到 root——设置完整的 ambient capabilities 掩码(含CAP_SYS_ADMIN),并把会话进程加入新建的 “empower” 组。
其他
- systemd 不再链接 libcap,改为内部重新实现。
- 大量库改为 dlopen 加载:audit、PAM、libseccomp、libselinux、libmount、libacl、libblkid。
- 实验性的 musl libc 构建支持。
systemd-modules-load并行加载配置的内核模块。systemd-integrity-setup支持 HMAC-SHA256/PHMAC-SHA256。systemd-importd从 GNU tar 迁移到 libarchive。systemd-machined可作为 user service 运行。