跳转到内容
搜索 Rocky Linux 文档

    浏览当前文档目录

    Rocky 10:把 journald 日志从内存搬进磁盘

    测试环境是 PVE 上的 Rocky Linux 10.2 虚拟机,最小化安装(349 包),systemd 版本 257-23.el10_2.1.rocky.0.1。

    先看这台机器开箱时的三个事实:

    检查项结果
    /etc/systemd/journald.conf不存在(只有 /usr/lib 下的全注释模板)
    生效的 Storageauto
    /var/log/journal不存在 → 日志全部易失

    Storage=auto 是「目录在就持久、不在就易失」的简写。没有 /var/log/journal 时,journald 把数据写到 /run/log/journal/<machine-id>/,/run 是 tmpfs:

    $ journalctl --disk-usage
    Archived and active journals take up 5.6M in the file system.

    这 5.6M 重启即归零。很多「重启后日志查不到」的问题就出在这里,而不是 journalctl 用错。

    # 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=。

    Rocky Linux 10.2:建目录后 restart 仍打印 Runtime Journal(/run/log/journal)

    restart 不够,这一点要有心理准备

    Section titled “restart 不够,这一点要有心理准备”

    实测:写 Storage=persistent(drop-in 或主配置文件都试过)再 systemctl restart systemd-journald,journald 仍然打印 Runtime Journal (/run/log/journal/...),/var/log/journal 保持空目录;连续三次都是如此,清空 /run/log/journal 后重试也一样。

    重启系统后立即生效。所以部署脚本里那一步「改配置 → 重启服务」不足以完成切换,要么安排重启,要么等下次维护窗口。

    $ 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 缩小时间窗。

    $ journalctl --vacuum-size=2M
    Vacuuming 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-*。
    Terminal window
    journalctl --disk-usage
    ls -d /var/log/journal || echo "not persistent yet"
    sudo mkdir -p /var/log/journal
    sudo systemctl reboot

    重启后:

    Terminal window
    journalctl --disk-usage
    journalctl -u systemd-journald -b | grep "System Journal"
    ls -ld /var/log/journal/*

    检查:

    1. 重启前目录不存在、容量数字很小;
    2. 重启后出现 System Journal (/var/log/journal/...);
    3. 目录属主是 root:systemd-journal;
    4. 重启前的日志还能查到。

    常见问题

    Rocky 和 Alma 在这件事上有区别吗?

    同版本 systemd(257-23.el10_2.1)行为一致,只有打包后缀不同;本页结论对两者通用。

    能不能只针对某个服务持久化?

    不能。持久化是 journald 全局存储位置;单服务可用 rsyslog 规则或把日志写文件,再用 logrotate 管理。

    磁盘很小,默认 10% 会不会太大?

    可以用 SystemMaxUse= 固定上限,或 SystemKeepFree= 保证剩余空间;两者同时设置时更保守的那个生效。