资讯 systemd v259 升级后会踩到的默认值与行为变化

2026-10-18 21:07:28

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 的事务,并通过 TransactionsWithOrderingCycle D-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_id builtin 在 DeviceTree 系统上能为 WiFi 设备生成可预测的接口名。
  • udevd 与 repart 改用 BLKPG ioctl() 而不是 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 运行。
复制全文 生成海报 Linux 运维 systemd

推荐文章

程序员茄子在线接单