systemd v259 把 journal 默认存储改成 persistent:小盘、容器、只读根分区各会怎样
相关链接:
- systemd v259 release notes:https://github.com/systemd/systemd/releases/tag/v259
- LWN 报道:https://lwn.net/Articles/1051235/
- journald.conf 手册:https://www.freedesktop.org/software/systemd/man/latest/journald.conf.html
改了什么
v259 的 Feature Removals and Incompatible Changes 里有一条:
The default storage mode for the journal is now 'persistent'. Previously, the default was 'auto', so the presence or lack of /var/log/journal determined the default storage mode, if no overriding configuration was provided. The default can be changed with -Djournal-storage-default=.
也就是说,没有在 journald.conf 里显式写 Storage= 的机器,行为变了。编译期仍可用 -Djournal-storage-default= 改回别的默认值。
auto 以前的判定逻辑
Storage=auto 并不看磁盘剩余空间,只看目录在不在:
/var/log/journal存在 → 按 persistent 处理,日志落到磁盘;- 目录不存在 → 按 volatile 处理,日志写
/run/log/journal,也就是 tmpfs,重启即丢。
很多发行版安装时并不预创建这个目录,于是大量机器实际上一直跑在 volatile 上,只是没人注意到。这条变更把这个隐式行为改成了显式默认。
换成 persistent 之后
persistent 模式会自己创建 /var/log/journal//,不再依赖目录是否预先存在。影响按场景分:
小盘机器。 日志从此真正落盘。journal 的默认容量上限是文件系统大小的 10%、且不超过 4G(以 man journald.conf 为准),在一块 8G 的 eMMC 上就是几百 MB 的潜在占用,还要叠加 SystemKeepFree 的保留空间。以前这些空间根本没被用过,现在需要重新算。
容器。 容器里通常没有 /var/log/journal,根文件系统要么是 tmpfs,要么是只读 overlay,这正是过去 auto 一直退化成 volatile 的原因。升级后如果容器根目录可写,journald 会真的开始在容器内建目录并落盘,日志跟着容器生命周期走,还可能把镜像层或 volume 撑大。
只读根分区。 persistent 需要创建目录和文件,只读根上建不出来,实际仍会落到 /run/log/journal。但这种回落依赖的是运行期 fallback,不应作为预期配置——显式写 Storage=volatile 才是确定行为。
用 Storage= 和容量上限控住
统一在 /etc/systemd/journald.conf 或 drop-in 里显式声明,不要再依赖默认值。
固定落盘、但要收紧配额:
# /etc/systemd/journald.conf
[Journal]
Storage=persistent
SystemMaxUse=200M
SystemMaxFileSize=50M
SystemKeepFree=1G
容器或只读根,明确不要落盘,用 runtime 配额控制内存占用:
[Journal]
Storage=volatile
RuntimeMaxUse=64M
RuntimeMaxFileSize=16M
Storage=none 会直接关掉日志存储,只保留转发,一般只在把日志全部转给远端时才用。SystemMaxUse 管 /var/log/journal,RuntimeMaxUse 管 /run/log/journal,两个是分开的。
核对
确认实际生效的配置和落盘位置:
systemctl cat systemd-journald # 看主配置与 drop-in
journalctl --disk-usage # 当前占用
ls -d /var/log/journal/*/ /run/log/journal/*/ 2>/dev/null
--disk-usage 输出的路径直接反映当前是 persistent 还是 volatile;两个目录都列一下能确认是否发生了回落。清理用按大小或按时间回收:
journalctl --vacuum-size=200M
journalctl --vacuum-time=14d
同版本其他变更
同一份 release notes 里还有几条会影响部署的:
- cgroup2 以
memory_hugetlb_accounting挂载(内核 6.6+),HugeTLB 用量计入 cgroup 内存; systemd-networkd与systemd-nspawn不再用 iptables/libiptc 建 NAT 规则,只支持 nftables;systemd-boot/systemd-stub移除 TPM 1.2,仅保留 TPM 2.0;- XBOOTLDR 分区强制 VFAT;隐藏 disk image 默认只读;
systemd-repart的 LUKS volume label 默认加luks-前缀,新增VolumeLabel=;- 服务退出日志新增 wallclock 时间,与原有 CPU 时间并列;新增
OOMKills/ManagedOOMKills属性; - SysV 脚本支持弃用,v260 将移除
systemd-sysv-generator、systemd-rc-local-generator、systemd-sysv-install。
v259 于 2025-12-17 打 tag。