必须显式设置Storage=persistent并创建权限正确的/var/log/journal目录,否则auto模式会因目录缺失或权限错误静默回退至volatile内存存储,导致重启后日志丢失。

要让 systemd-journald 的日志在重启后不丢失,并支持按需隔离(比如区分系统日志与运行时日志),关键在于正确配置 Storage 属性并配合目录结构与权限控制。
核心目标有两个:
一是启用持久化(日志写入磁盘、跨重启保留);
二是实现存储隔离(避免 /run/log/journal/ 和 /var/log/journal/ 混用,防止 volatile 与 persistent 日志互相干扰)。
明确 Storage 取值含义与选择依据
Storage= 在 /etc/systemd/journald.conf 中有三个合法值:
-
volatile:只写入/run/log/journal/(内存文件系统),重启即清空 -
persistent:强制写入/var/log/journal/,即使目录不存在也会尝试创建(但不保证权限正确) -
auto(默认):仅当/var/log/journal/目录存在且可写时才启用持久化;否则退回到volatile
⚠️ 注意:auto 看似省事,实则不可靠——它依赖目录“恰好存在且权限正确”,稍有偏差就静默回退到内存模式,导致日志丢失。
✅ 推荐做法:显式设为 persistent,并手动确保 /var/log/journal/ 就位。
创建持久化目录并完成权限隔离
/var/log/journal/ 不是 systemd 自动创建的“普通目录”,它需要特定所有权和 setgid 权限,否则 journald 主动拒绝写入。
执行以下命令(顺序不能错):
-
创建目录:
sudo mkdir -p /var/log/journal
-
用 systemd 原生工具初始化(比
chown+chmod更稳妥):sudo systemd-tmpfiles --create --prefix /var/log/journal
该命令会自动设置:
- 所有者:
root:systemd-journal - 权限:
2755(含 SGID 位,确保子目录/文件继承systemd-journal组)
验证是否生效:
ls -ld /var/log/journal
应看到类似输出:
drwxr-sr-x 2 root systemd-journal 4096 May 26 11:00 /var/log/journal
此时 /run/log/journal/ 仍存在,但 journald 会优先使用 /var/log/journal/(因 Storage=persistent 强制覆盖路径逻辑),实现自然隔离。
修改 journald.conf 并启用持久化
编辑配置文件:
sudo nano /etc/systemd/journald.conf
在 [Journal] 小节中,找到或添加以下行:
[Journal] Storage=persistent Compress=yes SyncIntervalSec=5m
说明:
-
Storage=persistent:关闭 auto 模式,杜绝歧义 -
Compress=yes:启用 LZ4 压缩,降低磁盘占用(约节省 60–70%) -
SyncIntervalSec=5m:每 5 分钟强制刷一次内存缓冲到磁盘,平衡可靠性与 I/O 压力
其他可选但推荐的容量控制项(防磁盘占满):
SystemMaxUse=2G SystemKeepFree=500M MaxRetentionSec=1month
保存后,必须重启服务使新配置加载:
sudo systemctl restart systemd-journald
验证持久化与隔离是否生效
-
查看当前日志路径是否已切换:
journalctl --disk-usage
输出应显示
/var/log/journal/占用空间(非/run/log/journal/) -
检查持久化目录是否有 journal 文件生成:
ls /var/log/journal/*/system.journal 2>/dev/null | head -n 1
若返回一个
.journal文件路径,说明落地成功 -
验证跨重启保留能力:
logger "test-persistence-$(date +%s)" sudo reboot
重启后执行:
journalctl -n 20 --since "1 hour ago" | grep "test-persistence"
能查到记录,即持久化生效
-
隔离性确认:
journalctl --list-boots
应显示多条历史启动记录(不止当前 boot),且
/run/log/journal/下的文件不再增长(journald 已忽略该路径)。
不复杂但容易忽略。

















