温馨提示×

dmesg为何不显示启动信息

小樊
51
2026-10-24 02:00:02
栏目: 编程语言

dmesg 不显示启动信息(boot messages),通常不是命令本身的问题,而是内核日志缓冲区或系统日志机制的变化导致的。下面按常见原因逐一说明。


一、最常见原因:ring buffer 已被覆盖

dmesg 显示的是 内核环形缓冲区(kernel ring buffer),它大小有限。

如果系统运行时间较长、日志很多:

  • 早期的启动信息会被新日志覆盖
  • 你再用 dmesg 就看不到开机阶段的内容

✅ 验证方式:

dmesg | head

如果开头不是 Booting Linux、BIOS、ACPI 之类,说明已被覆盖。

✅ 解决思路:

  • 看 持久化日志(见下文)
  • 或重启后立即执行 dmesg

二、使用了 systemd-journald(现代 Linux 常态)

在 systemd 系统中:

  • 启动早期日志由 systemd-journald 接管
  • dmesg 只显示当前内核缓冲区

即使 dmesg 没有,journal 里通常还有。

✅ 查看完整启动日志:

journalctl -b

查看本次启动的早期内核日志:

journalctl -b -k

三、内核参数关闭了早期 printk

某些系统或云镜像会设置:

quiet

或更极端的:

loglevel=0

这会:

  • 抑制控制台输出
  • 减少 ring buffer 中的启动信息

✅ 检查:

cat /proc/cmdline

✅ 解决: 编辑 GRUB,去掉 quiet,例如:

linux /boot/vmlinuz root=... quiet

改为:

linux /boot/vmlinuz root=...

然后:

update-grub   # 或 grub2-mkconfig

四、dmesg 权限不足(看不到全部)

某些发行版限制 dmesg:

dmesg
# 无输出或报错

✅ 检查:

sysctl kernel.dmesg_restrict

若为 1:

sudo sysctl -w kernel.dmesg_restrict=0

或直接使用:

sudo dmesg

五、容器 / 虚拟机环境限制

在以下环境:

  • Docker 容器
  • 某些云函数
  • 嵌套虚拟化

dmesg 可能:

  • 完全为空
  • 或只显示当前 namespace 的日志

这是预期行为,不是故障。


六、系统未真正“冷启动”

如果你看到的是:

  • 休眠恢复(suspend/resume)
  • 热重启(kexec)

启动信息可能不完整。


推荐排查顺序(实用)

# 1. 是否有权限
sudo dmesg | head

# 2. 是否已被覆盖
dmesg | head

# 3. 看 journal
journalctl -b -k

# 4. 看启动参数
cat /proc/cmdline

总结一句话

dmesg 不显示启动信息,绝大多数情况是因为“日志已被覆盖”或“由 journald 接管”,而不是 dmesg 坏了。

如果你愿意,可以告诉我:

  • 发行版(Ubuntu / CentOS / Arch 等)
  • 物理机 / 虚拟机 / 容器
  • dmesg 实际输出内容

我可以更精确地判断是哪一种原因。

0 踩