dmesg是查看内核环形缓冲区日志的唯一原生接口,不依赖systemd或文件轮转,能直接捕获early-boot硬件初始化失败、内核oops、ACPI错误等关键事件;journalctl -k仅读取journald从/dev/kmsg捕获的子集,且默认不记录原始控制台输出。

直接看 dmesg 输出,它就是当前内核控制台日志的实时快照,不依赖文件轮转或 systemd 日志转发,最贴近开机后至今的底层事件。
为什么不用 journalctl 查控制台日志
journalctl 默认不记录原始控制台输出(比如内核 printk 消息),除非你显式启用了 ForwardToConsole=yes 并配置了 console 日志目标。大多数发行版默认关闭该选项,所以 journalctl -k 或 journalctl -p err 可能漏掉关键硬件初始化失败、驱动 panic 或 early-boot 阶段的打印。
-
journalctl -k实际读的是 journald 从/dev/kmsg捕获的子集,且受日志配额和过滤规则影响 - 某些嵌入式或 minimal 系统根本没启用 journald,
journalctl命令甚至不存在 - 控制台日志(如串口 console、tty1 上刷出的内容)本身是内核 ring buffer 的直接输出,
dmesg是唯一原生接口
dmesg 怎么用才不丢信息
默认 dmesg 输出可能被截断或混杂无关内容,关键是要加参数控制格式和范围:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 加
-T显示人类可读时间戳:dmesg -T | tail -n 20 - 只看错误和警告:
dmesg -l err,warn(注意不是error,而是err) - 过滤特定设备:
dmesg | grep -i "nvme\|usb\|eth0",避免用grep error这种宽泛匹配 - 清空缓冲区前先保存:
sudo dmesg > /tmp/dmesg-$(date +%s).log,再sudo dmesg -C(慎用) - 如果看到“
some lines dropped”,说明 ring buffer 溢出,需立即导出,不能只靠tail补救
哪些场景必须盯住控制台日志
当系统启动卡在 logo、SSH 连不上、USB 设备突然消失、磁盘 IO 挂起时,dmesg 往往比 /var/log/messages 或 journalctl 更早暴露问题:
- 内核 oops 或 panic 会直接刷屏,但未必写入文件日志(尤其没配 kdump)
- BIOS/UEFI 固件报错(如
ACPI Error)只出现在dmesg,不会进 syslog - 显卡驱动加载失败(
nouveau或i915)通常第一行就提示failed to load firmware - 内存 ECC 错误、CPU 温度超限等硬件告警,
dmesg是唯一来源
控制台日志的不可替代性在于它离内核最近——没有中间层解析、不依赖磁盘 I/O、不受日志服务是否存活影响。一旦发现异常,第一反应不是翻 /var/log/,而是敲 dmesg -T | tail -n 50。










