Rocky 10:把 journald 日志从内存搬进磁盘
测试环境是 PVE 上的 Rocky Linux 10.2 虚拟机,最小化安装(349 包),systemd 版本 257-23.el10_2.1.rocky.0.1。
先看这台机器开箱时的三个事实:
| 检查项 | 结果 |
|---|---|
/etc/systemd/journald.conf | 不存在(只有 /usr/lib 下的全注释模板) |
生效的 Storage | auto |
/var/log/journal | 不存在 → 日志全部易失 |
易失意味着什么
Section titled “易失意味着什么”Storage=auto 是「目录在就持久、不在就易失」的简写。没有 /var/log/journal 时,journald 把数据写到 /run/log/journal/<machine-id>/,/run 是 tmpfs:
$ journalctl --disk-usageArchived and active journals take up 5.6M in the file system.这 5.6M 重启即归零。很多「重启后日志查不到」的问题就出在这里,而不是 journalctl 用错。
切换:目录优先,重启生效
Section titled “切换:目录优先,重启生效”# mkdir -p /var/log/journal# systemctl reboot重启后 journald 会在自身日志里报告落点:
$ journalctl -u systemd-journald -b --no-pager | grep "Journal ("System Journal (/var/log/journal/c9bf91c1c75e4ff192415c3b38a521c3) is 12.5M, max 894.4M, ...目录权限不用手工设,journald 会补成:
drwx-sr-x+ root systemd-journal (drwxr-sr-x+, 2755)max 894.4M 是 SystemMaxUse 缺省值 = 根文件系统容量的 10%。要固定上限,在 /etc/systemd/journald.conf.d/ 里写 SystemMaxUse=。

restart 不够,这一点要有心理准备
Section titled “restart 不够,这一点要有心理准备”实测:写 Storage=persistent(drop-in 或主配置文件都试过)再 systemctl restart systemd-journald,journald 仍然打印 Runtime Journal (/run/log/journal/...),/var/log/journal 保持空目录;连续三次都是如此,清空 /run/log/journal 后重试也一样。
重启系统后立即生效。所以部署脚本里那一步「改配置 → 重启服务」不足以完成切换,要么安排重启,要么等下次维护窗口。
三种最常用的过滤
Section titled “三种最常用的过滤”$ journalctl --list-boots --no-pager | tail -2 # 有哪些启动$ journalctl -u sshd -n 2 --no-pager # 某个 unit 最近两条$ journalctl -p err -b --no-pager | tail -2 # 本次启动的错误级排障顺序通常是:先 -b 锁定本次启动,再 -u 收敛到服务,最后 -p err 或 --since 缩小时间窗。
清理用 vacuum,不要 rm
Section titled “清理用 vacuum,不要 rm”$ journalctl --vacuum-size=2MVacuuming done, freed 0B of archived journals from /run/log/journal.Vacuuming done, freed 0B of archived journals from /var/log/journal/c9bf91c1c75e4ff192415c3b38a521c3.输出按目录分行,且正在写的 system.journal 不会被删——所以 freed 0B 是正常结果,不是命令失效。要按时间清:
# journalctl --vacuum-time=7d- 把
journalctl能看到的历史当成「已持久化」——那可能只是本次启动的缓冲; - 只改
Storage=忘了建目录,日志继续留在内存; - 改
/usr/lib/systemd/journald.conf:包升级会被覆盖,且不影响已运行的实例; - 直接
rm -rf /var/log/journal/*:索引与数据可能不一致,统一走--vacuum-*。
练习:把易失改成持久
Section titled “练习:把易失改成持久”journalctl --disk-usagels -d /var/log/journal || echo "not persistent yet"sudo mkdir -p /var/log/journalsudo systemctl reboot重启后:
journalctl --disk-usagejournalctl -u systemd-journald -b | grep "System Journal"ls -ld /var/log/journal/*检查:
- 重启前目录不存在、容量数字很小;
- 重启后出现
System Journal (/var/log/journal/...); - 目录属主是
root:systemd-journal; - 重启前的日志还能查到。
常见问题
Rocky 和 Alma 在这件事上有区别吗?
同版本 systemd(257-23.el10_2.1)行为一致,只有打包后缀不同;本页结论对两者通用。
能不能只针对某个服务持久化?
不能。持久化是 journald 全局存储位置;单服务可用 rsyslog 规则或把日志写文件,再用 logrotate 管理。
磁盘很小,默认 10% 会不会太大?
可以用 SystemMaxUse= 固定上限,或 SystemKeepFree= 保证剩余空间;两者同时设置时更保守的那个生效。
- 文本日志轮转:/log-rotation/
- 仓库与包源:/repos/
- 日志与监控:/ops-monitoring/