1.查看日志保存路径
方法1
看 systemd-journald 进程,可以看到日志保存到哪里了,异常的是没有相关信息
bash
systemctl status systemd-journald
● systemd-journald.service - Journal Service
Loaded: loaded (/lib/systemd/system/systemd-journald.service; static)
Active: active (running) since Mon 2024-11-18 18:22:33 CST; 1 year 6 months ago
TriggeredBy: ● systemd-journald-dev-log.socket
● systemd-journald-audit.socket
● systemd-journald.socket
Docs: man:systemd-journald.service(8)
man:journald.conf(5)
Main PID: 40179 (systemd-journal)
Status: "Processing requests..."
Tasks: 1 (limit: 49151)
Memory: 692.4M
CPU: 5h 46min 58.519s
CGroup: /system.slice/systemd-journald.service
└─40179 /lib/systemd/systemd-journald
Notice: journal has been rotated since unit was started, output may be incomplete.
正常的应该输出日志保存目录,如下:
bash
systemctl status systemd-journald
● systemd-journald.service - Journal Service
Loaded: loaded (/lib/systemd/system/systemd-journald.service; static)
Active: active (running) since Fri 2026-06-05 14:53:45 CST; 1h 44min ago
TriggeredBy: ● systemd-journald.socket
● systemd-journald-audit.socket
● systemd-journald-dev-log.socket
Docs: man:systemd-journald.service(8)
man:journald.conf(5)
Main PID: 219993 (systemd-journal)
Status: "Processing requests..."
Tasks: 1 (limit: 49151)
Memory: 21.5M
CPU: 4.926s
CGroup: /system.slice/systemd-journald.service
└─219993 /lib/systemd/systemd-journald
Jun 05 14:53:45 m2 systemd-journald[219993]: Journal started
Jun 05 14:53:45 m2 systemd-journald[219993]: System Journal (/var/log/journal/3f782b3abe994c79ab4e2449a839cc04) is 1.0G, max 997.9M, 0B free.
方法2
说明:该方法是直接查看目录是否存在,以及目录下是否有东西,不一定准确。
如下目录下有 system.journal 就代表日志放路径是该目录(不一定准确,因为你完全可以手动创建个该目录)
bash
ls /var/log/journal/$(cat /etc/machine-id)
system.journal
2.ubuntu journal为啥使用的是 /run/log/journal 目录
在 Ubuntu(以及大多数使用 systemd 的 Linux 发行版)中,你看到的 /run/log/journal 目录其实代表着一种临时、内存中的日志存储机制。
Ubuntu 之所以在这里存放日志,主要涉及 Linux 的系统架构设计、启动流程以及存储介质的寿命保护。以下是核心原因:
1. 临时存储(volatile)与持久化存储的区别
systemd-journald(负责管理系统日志的服务)有两种日志存储模式:
-
内存模式(Volatile): 日志存放在
/run/log/journal。 -
持久化模式(Persistent): 日志存放在
/var/log/journal。
/run 目录在现代 Linux 中是一个 tmpfs(内存文件系统)。这意味着存放在 /run/log/journal 中的日志全部保存在内存中,系统重启后就会消失。
2. 为什么 Ubuntu 默认或在特定情况下使用它?
原因一:系统启动早期的"无盘"阶段
在 Linux 刚刚连上电源、内核刚加载的启动早期,硬盘的根目录 / 往往处于只读状态,或者硬盘根本还没有挂载成功。
-
此时系统已经开始产生大量的启动日志。
-
因为硬盘不可写,
journald只能把日志先写到初始化阶段就能使用的内存目录------也就是/run/log/journal中。 -
当后面硬盘成功挂载且变成"可读写"后,
journald才会把日志从内存"刷新"(flush)到硬盘的/var/log/journal中。
原因二:保护嵌入式设备或闪存寿命
如果你的 Ubuntu 运行在树莓派、SD 卡、或某些固态硬盘(SSD)上,频繁的日志写入会急剧消耗闪存的擦写寿命(TBW)。
- 默认将日志放在内存的
/run中,可以大幅减少对硬盘的写操作。
原因三:Ubuntu 的配置策略(Storage=auto)
在 /etc/systemd/journald.conf 配置文件中,有一个关键参数叫 Storage,它的默认值通常是 auto。
Storage=auto的逻辑是:如果系统发现存在
/var/log/journal这个目录,它就会把日志持久化到硬盘上;如果不存在 这个目录,它就乖乖地把日志留在内存的/run/log/journal中,重启即擦除。
💡 如何让日志永久保存到硬盘?
如果你发现你的 Ubuntu 每次重启后以前的日志就看不到了(因为它们在 /run 里),你可以通过以下两种方法将其改为持久化存储:
方法 A:手动创建持久化目录(最推荐,利用 auto 机制)
直接为它建个硬盘上的家,journald 发现后会自动切换:
bash
# 1. 确保物理目录存在且权限正确(非常重要)
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
# 2. 重启服务加载新配置
sudo systemctl restart systemd-journald
# 3. 核心命令:强制将内存日志刷入硬盘
sudo journalctl --flush
方法 B:修改配置文件
-
打开配置文件:
Bash
sudo nano /etc/systemd/journald.conf -
找到
#Storage=auto,取消注释并改为persistent:Storage=persistent -
保存退出后,重启日志服务:
sudo systemctl restart systemd-journald
修改为持久化后,你就会发现日志文件转移到了 /var/log/journal/ 目录中,重启系统后历史日志也不会丢失了。
3.sudo systemd-tmpfiles --create --prefix /var/log/journal 作用
这条命令的核心作用是:按照系统预设的规则,为 /var/log/journal 目录安全地初始化权限、属主和 ACL(访问控制列表)。
简单来说,它不是一个简单的 mkdir,而是为了满足 systemd-journald 服务严苛的安全需求,给这个目录打上正确的"防伪标签"和"通行证"。
具体拆解如下:
1. 为什么不能直接用 mkdir?
systemd-journald 作为一个底层核心服务,为了防止日志被恶意篡改或越权读取,对 /var/log/journal 目录的权限要求极其苛刻。
如果你只用 sudo mkdir /var/log/journal,创建出来的目录默认属主是 root:root,权限通常是 755。
- 后果:
journald服务(通常以特定系统用户权限运行)会因为权限不足而拒绝写入,导致持久化失败,日志继续缩回内存。
2. 这个命令具体做了什么?
当你运行 sudo systemd-tmpfiles --create --prefix /var/log/journal 时,系统会去读取预设的配置文件(通常在 /usr/lib/tmpfiles.d/systemd.conf 中)。
它会针对 /var/log/journal 强行执行以下特殊操作:
-
设置正确的属主与属组: 将目录交还给
root:systemd-journal。 -
设置特殊的权限位(SGID): 赋予
2755(即drwxr-sr-x) 权限。这个s代表 SGID 位,意味着未来在这个目录下创建的任何新日志文件,都会自动继承systemd-journal属组,确保日志服务永远有权读写。 -
配置 ACL(访问控制列表): 赋予特定的系统组(如
adm和wheel)免密读取日志的权限,这样普通管理员不用切换到 root 也能通过journalctl看日志。
3. 参数详细拆解
-
systemd-tmpfiles:这是 systemd 自带的通用工具,专门用来管理(创建、清理、删除)系统中的临时文件和目录。 -
--create:字面意思,告知工具"请根据配置文件,创建缺失的目录,或者修正已存在目录的权限"。 -
--prefix /var/log/journal:这是一个安全限制参数 。意思是"只处理路径以/var/log/journal开头的规则",防止系统去扫描和重建其他无关的临时目录,提高执行效率。
总结
在修改日志持久化时,这一步是承上启下 的关键。它建好了完美的"容器",并贴上了 systemd 认可的权限标签。
现在你运行 ls -ld /var/log/journal,应该能看到类似下面的输出:
Plaintext
drwxr-sr-x+ 3 root systemd-journal 4096 Jun 5 01:40 /var/log/journal
那个 s 和 + 号,就是这条命令为你注入的"灵魂",有了它们,journald 才会放心地把日志从内存刷到硬盘里。