dmesg 日志基本使用
不会。
dmesg 显示的是 Linux 内核环形缓冲区(kernel ring buffer) 中保存的日志,而环形缓冲区容量是有限的。
1. 时间戳显示什么含义
例如:
Shell
[ 0.000000] Linux version 6.6.0 ...
[ 12.345678] eth0: Link is Up
[ 125.678901] usb 1-1: new device found
方括号中的数字默认表示:
Plain Text
自系统启动以来经过的秒数
即:
Plain Text
timestamp = uptime
如果使用:
Shell
dmesg -T
则转换为人类可读时间:
Shell
[Sun Sep 20 08:55:13 2026] eth0: Link is Up
2. 是否会显示所有历史数据
不会。
原因:
环形缓冲区会覆盖旧数据
内核日志缓冲区类似一个循环队列:
Plain Text
+------------------+
| old log |
| old log |
| old log |
+------------------+
↓ 满了
+------------------+
| new log 覆盖旧log |
+------------------+
当新日志不断写入时:
Plain Text
最早的日志 → 被覆盖
最新的日志 → 保留
因此:
Shell
dmesg
只能看到:
Plain Text
当前 ring buffer 中还存活的数据
看不到:
Plain Text
很久以前已经被覆盖掉的日志
3. 如何查看缓冲区大小
Shell
dmesg | wc -l
查看当前日志条数。
或者:
Shell
cat /proc/sys/kernel/printk
查看 printk 配置。
查看 ring buffer 大小:
Shell
dmesg -s 1048576
或者:
Shell
journalctl -k | head
如果系统使用 systemd。
4. 系统重启后还能看到吗
仅 dmesg
重启后:
Plain Text
kernel ring buffer 被重新初始化
旧数据消失。
即:
Shell
dmesg
通常只能看到:
Plain Text
本次启动的内核日志
journalctl
如果启用了持久化日志:
Shell
journalctl -k
可以查看历史启动记录:
Shell
journalctl -k -b -1
上一轮启动:
Shell
journalctl -k -b -2
再上一轮启动。
例如:
Shell
journalctl --list-boots
显示所有历史 boot 的日志索引。
5. 时间戳会不会因为日志丢失而不连续
会。
例如:
Plain Text
[100.1] msg1
[100.2] msg2
...
缓冲区满后最前面的记录被覆盖,看到的可能变成:
Plain Text
[5000.1] msgA
[5000.2] msgB
这不代表系统刚启动 5000 秒时才开始记录,而是:
Plain Text
0~4999 秒期间的日志已经被覆盖
6. 如何确认是否丢失了 dmesg 日志
查看缓冲区大小:
Shell
journalctl -k | wc -l
dmesg | wc -l
如果 journalctl -k 比 dmesg 多很多,说明旧日志已经不在 ring buffer 中,而被 systemd-journald 保存了。
还可以查看:
Shell
dmesg | tail
如果日志产生速度很快(例如驱动异常刷屏),旧日志会非常快被覆盖。
总结:
dmesg时间戳默认是 系统启动后的秒数。dmesg不会显示所有历史内核日志。- 它只显示 当前内核 ring buffer 中尚未被覆盖的数据。
- 系统重启后,旧的 dmesg 数据通常丢失。
- 若系统启用了
systemd-journald持久化,可通过journalctl -k查看历史内核日志。
Time is like a fleeting show!
posted on 2026-09-20 10:54 ENGINEER-F 阅读(8) 评论(0) 收藏 举报
浙公网安备 33010602011771号