dmesg 是什么
dmesg 读取内核环形缓冲区,里面记录着内核启动过程、硬件探测、驱动加载、磁盘与文件系统错误、网络链路变化,以及 OOM 击杀事件。它与其他日志的根本区别在于来源:这不是应用写的日志,而是内核自己的记录,因此很多「应用无端消失」「磁盘突然只读」的现场只有这里才有。缓冲区容量有限,旧的记录会被新记录挤掉,重要报错要及时看。
基本信息
| 适用平台 | Linux(util-linux 的 dmesg);部分发行版出于安全考虑限制普通用户读取(kernel.dmesg_restrict) |
|---|---|
| 命令语法 | dmesg [选项] |
| 常用选项 | -T 把时间戳转为可读时间、--level 按级别过滤(emerg、alert、crit、err、warn、notice、info、debug)、-w 持续跟随、-H 人类友好输出、-c 读取后清空缓冲、-n 设置输出级别、-d 只显示两次读取之间的新消息 |
| 相关命令 | journalctl -k 读取同样的内核消息,但带持久化与启动轮次(-b) |
| 缓冲区 | 容量由内核参数 log_buf_len 决定,常见为几百 KB 到数 MB,写满后环形覆盖旧内容 |
典型使用场景
- 进程被 OOM 击杀:确认是被内核回收还是自行退出,dmesg 会记录进程名与内存信息
- 磁盘与文件系统异常:I/O error、只读重挂载、坏块与文件系统修复信息都在这里
- 网卡与链路问题:链路 up/down、驱动加载失败、网卡重置记录
- 开机硬件识别:确认磁盘、网卡、多了多少内存是否被正确识别
- 服务自动重启前的现场:应用日志只有退出记录时,内核日志能补上原因
- 内核参数与安全模块:确认加载了哪些模块、有无审计或 LSM 相关提示
常用示例
常用示例
dmesg -T | tail -n 50
dmesg -T --level=err,warn | tail -n 50
dmesg -T | grep -i -E 'oom|killed process|out of memory'
dmesg -T | grep -i -E 'i/o error|remounting filesystem read-only'
dmesg -H --level=err,warn # 人类友好输出
dmesg -w # 持续跟随新消息
journalctl -k -b -n 100 # 持久化的内核日志,可按启动轮次查
journalctl -k -p err --since '1 hour ago'常见内核消息
| 关键字 | 含义 | 下一步 |
|---|---|---|
| Out of memory / Killed process | 内存不足触发了 OOM 击杀 | 核对被杀的进程与当时的 available,查内存泄漏或限额 |
| I/O error | 磁盘读写错误 | 检查 SMART、dmesg 中的设备名与阵列状态 |
| remounting filesystem read-only | 文件系统错误后被迫只读 | 立刻备份数据,再排查存储与文件系统 |
| link up / link down | 网卡链路状态变化 | 核对网线、光模块与交换机端口 |
| segfault | 用户进程发生段错误 | 结合应用日志与 core dump 定位代码问题 |
| Tainted kernel | 内核被标记为受污染(加载了非官方模块等) | 影响厂商支持与问题定位,需查历史原因 |
dmesg 的时间戳默认是自开机以来的秒数,跨天排查时很难与业务日志对齐,所以几乎总该加 -T(或 -H)转成可读时间。要长期保留内核日志,需要把 journald 配置为持久化存储(/var/log/journal 存在),否则重启后只有当前启动轮次的记录。
普通用户读不到 dmesg 时通常是内核参数 kernel.dmesg_restrict=1 在起作用,这是出于安全考虑的限制(缓冲区里可能包含地址等敏感信息),改用 sudo 或通过 journalctl -k 读取;判断当前设置可以查 /proc/sys/kernel/dmesg_restrict。
看到 I/O error 或文件系统被重挂载为只读时,首要动作是保护数据而不是重启:先把关键数据复制到其他设备,再评估是否做文件系统检查。反复重启可能让坏块扩散或让 fsck 在无人值守的情况下做危险操作。