综合 systemd v259 升级运维清单:journal 默认落盘、HugeTLB 计入内存与 v260 的移除项

2026-11-13 21:06:11

systemd v259 升级运维清单:journal 默认落盘、HugeTLB 计入内存与 v260 的移除项

v259 于 2025-12-17 发布。有两处默认行为变化会直接影响现网机器的磁盘和内存口径,另外 v260 的移除项需要提前排查。

1. journal 默认 storage 从 auto 改为 persistent

以前 Storage=auto 的判定看目录:/var/log/journal 存在就持久化,不存在就写 volatile 的 /run/log/journal(重启即丢)。

v259 起默认改成 persistent,不再看目录是否存在——/var/log/journal 会被创建并开始写盘。发行版镜像里从没建过这个目录的机器,升级后日志会突然从小体量的 tmpfs 转到磁盘上持续增长,小容量 /var 分区、容器、只读 rootfs 这类环境要重点盯。

编译期默认值可用 -Djournal-storage-default= 改,那是打包侧的事,运维侧只能改配置文件。

先查现状:

journalctl --disk-usage
ls -ld /var/log/journal
grep -nE '^[#[:space:]]*(Storage|SystemMaxUse|SystemMaxFileSize|MaxRetentionSec|MaxFileSec)=' /etc/systemd/journald.conf

被注释掉的行同样代表默认值,别只看没注释的。

改回或限量:

# /etc/systemd/journald.conf
[Journal]
# 完全回到内存盘,重启丢失
Storage=volatile
# 或保留持久化但限死用量
# Storage=persistent
# SystemMaxUse=2G
# MaxRetentionSec=2week
systemctl restart systemd-journald
journalctl --disk-usage
journalctl --vacuum-size=200M   # 先回收已有文件,不必等重启

2. cgroup2 加上 memory_hugetlb_accounting

v259 起 cgroup2 以 memory_hugetlb_accounting 挂载(内核 6.6 起支持),HugeTLB 用量现在计入 cgroup memory controller 的整体用量。

后果很直接:用 hugepages 的进程(MySQL、Redis、Java、DPDK)此前预留的 hugepage 内存不体现在 memory.current 里,现在体现了。同样的 memory.max,可用余量变小,在 memory.max 上触发 OOM 的概率上升。需要把该 unit 独占的 hugepage 大小预留进 memory.max。

grep memory_hugetlb_accounting /proc/self/mountinfo
grep -i huge /proc/meminfo
cat /sys/fs/cgroup/system.slice/mysqld.service/memory.max
cat /sys/fs/cgroup/system.slice/mysqld.service/memory.current

memory.max = 应用堆 + 该 unit 独占的 hugepage 预留 + 余量。hugepage 池本身是系统级预留(vm.nr_hugepages),多个 cgroup 共享时按实际分配份额算。

3. OOMKills / ManagedOOMKills 直接查击杀次数

新增两个属性:OOMKills 统计内核 OOM killer 杀进程次数,ManagedOOMKills 统计 systemd-oomd 的击杀次数。以前只能翻 dmesg 或 journal,现在直接读单元属性:

systemctl show -p OOMKills -p ManagedOOMKills mysqld.service

D-Bus 侧用 busctl get-property 读同名属性,对象路径是 unit 名转义后的 /org/freedesktop/systemd1/unit/...。

4. 服务退出日志同时给 CPU 时间和墙钟时间

退出日志现在同时输出 CPU 时间与墙钟时间。墙钟远大于 CPU 说明进程大部分时间在阻塞(I/O、锁、网络),两者接近说明占满核在算。如果有日志解析或告警正则依赖旧格式,需要跟着改。

5. v260 之前要排掉的东西

System V 服务脚本支持将被移除:systemd-rc-local-generator、systemd-sysv-generator、systemd-sysv-install 一并消失。检查:

ls /etc/init.d/
test -x /etc/rc.local && echo "rc.local 存在"
ls /run/systemd/generator* 2>/dev/null   # 看有没有 sysv / rc-local 生成的单元

最低依赖同步提高,升级前对照:kernel 5.10、glibc 2.34、libxcrypt 4.4.0、util-linux 2.37、elfutils 0.177、openssl 3.0、cryptsetup 2.4、libseccomp 2.4、python 3.9。

uname -r; ldd --version | head -1
rpm -q util-linux elfutils-libelf openssl cryptsetup libseccomp python3

6. 同一版本里其它会影响现网的变更

  • systemd-networkd 与 systemd-nspawn 不再通过 iptables/libiptc 建 NAT 规则,只支持 nftables。纯 iptables 环境要确认 nft 可用。
  • systemd-boot / systemd-stub 移除 TPM 1.2,只保留 TPM 2.0。
  • systemd-repart 的 LUKS 卷标默认加 luks- 前缀,避免 /dev/disk/by-label 冲突,新增 VolumeLabel=。按卷标挂载的脚本要改。
  • Varlink IPC 扩展:Unit.List() 可按 cgroup 或 invocation ID 过滤,新增 Reload()、Reexecute();$LISTEN_FDS 支持 pidfd inode,新增 $LISTEN_PIDFDID。
  • 新增 RootDirectoryFileDescriptor=、UserNamespacePath=、ExecReloadPost=;job 激活事务有 64 位唯一 ID;TransactionsWithOrderingCycle D-Bus 属性暴露存在顺序环的事务。
  • linux audit、PAM、libacl、libblkid、libseccomp、libselinux、libmount 改为 dlopen 弱依赖;不再链接 libcap;引入 musl libc 实验性构建支持。
  • 稳定版后续有 v259.10(2026-10-17)、v259.11(2026-11-07)。v263 计划移除 /run/boot-loader-entries/ 与 systemd-sysupdated D-Bus API;Type=notify-reload 服务发 READY=1 时必须捕获或阻塞 ReloadSignal;udev 控制 legacy socket 移除,udevadm 全面走 Varlink。
复制全文 生成海报 systemd Linux 运维 升级

推荐文章

程序员茄子在线接单