dmesg 日志基本使用

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 -kdmesg 多很多,说明旧日志已经不在 ring buffer 中,而被 systemd-journald 保存了。

还可以查看:

 
 
 
 
Shell
 
 
dmesg | tail

如果日志产生速度很快(例如驱动异常刷屏),旧日志会非常快被覆盖。


总结:

  • dmesg 时间戳默认是 系统启动后的秒数。
  • dmesg 不会显示所有历史内核日志。
  • 它只显示 当前内核 ring buffer 中尚未被覆盖的数据。
  • 系统重启后,旧的 dmesg 数据通常丢失。
  • 若系统启用了 systemd-journald 持久化,可通过 journalctl -k 查看历史内核日志。

posted on 2026-09-20 10:54  ENGINEER-F  阅读(8)  评论(0)    收藏  举报