在 Linux 中 dmesg 不显示日志,通常有下面几类原因,从最常见到较少见逐一说明,并给出对应解决办法。
从较新内核(约 4.4+)开始,普通用户默认不能读取 dmesg,需要 CAP_SYSLOG 权限。
现象
dmesg
Permission denied
解决
sudo dmesg
或永久放开限制:
sysctl -w kernel.dmesg_restrict=0
(写入 /etc/sysctl.conf 可持久化)
在使用 systemd 的发行版(Ubuntu / CentOS / Debian 等)中,内核日志可能只进 journald。
现象
dmesg
(空或很少)
解决
sudo journalctl -k
或:
sudo journalctl -k -b
quiet 启动参数GRUB 中如果加了:
quiet
内核不会把日志打印到控制台,但 dmesg 通常仍可看。
如果同时有:
loglevel=0
则几乎不记录。
检查
cat /proc/cmdline
早期启动日志可能被后续日志冲掉。
查看缓冲区大小
dmesg | wc -l
可增大
sudo dmesg -C # 清空
或调整内核参数:
log_buf_len=1M
/proc/kmsg 被占用dmesg 本质是读 /proc/kmsg,若被其他进程占用:
lsof /proc/kmsg
通常是 rsyslog / systemd-journald
检查:
zcat /proc/config.gz | grep DMESG
或:
grep CONFIG_PRINTK /boot/config-$(uname -r)
需要:
CONFIG_PRINTK=y
容器通常:
/dev/kmsgCAP_SYSLOG现象
dmesg
klogctl: Operation not permitted
结论 容器内一般看不到宿主机 dmesg,需要在宿主机查看。
sudo dmesg # 是否权限问题
sudo journalctl -k # systemd 环境
cat /proc/cmdline # 启动参数
sysctl kernel.dmesg_restrict
lsof /proc/kmsg
如果你愿意,可以告诉我:
sudo dmesg 的具体输出(或报错)我可以更精确地判断原因。