综合 systemd v259 把 journal 默认存储改成 persistent:小盘、容器、只读根分区各会怎样

2026-11-08 21:06:18

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。

复制全文 生成海报 Linux systemd 运维

推荐文章

程序员茄子在线接单