查磁盘底层链路问题,dmesg核心是抓设备行为异常而非“error”字眼,需先用dmesg -l err,warn过滤级别,再结合sd/nvme/ata等设备关键词及link down、phy status changed等物理层信号定位,最后通过smartctl、lspci、journalctl交叉验证。

查磁盘底层链路问题,dmesg不是看有没有“error”字眼,而是抓设备行为异常、匹配硬件上下文、再交叉验证。它反映的是内核看到的物理事实,比如线松了、供电不稳、固件卡死——这些在文件系统层根本看不到。
聚焦真实链路信号,别被启动信息干扰
默认 dmesg 输出里 90% 是设备识别 info,真正链路中断往往藏在 err/warn 级别里。先压噪音:
- dmesg -l err,warn 只保留错误和警告,跳过大量 probe 成功日志
- 加设备关键词缩小范围:dmesg -l err,warn | grep -E -i "(sd[a-z]|nvme[0-9]n[0-9]|ata[0-9]|mmcblk|usb-storage)"
- 注意不带 error 却很关键的信号:比如 "link down"、"PHY status changed"、"no carrier",它们直接说明物理链路断开
识别三类典型链路中断模式
同一报错,不同设备含义完全不同:
-
SATA/ATA 设备 出现
softreset failed或link is slow:优先查电源线是否虚接、数据线是否弯折、主板 SATA 口是否老化;再用 smartctl -a /dev/sda 看UDMA_CRC_Error_Count(高说明线路干扰)和Reallocated_Sector_Ct -
NVMe 设备 报
Device not ready或反复reset controller:可能是 PCIe 插槽灰尘/松动、散热触发控制器降频、或固件 Bug;运行 lspci -vv -s 01:00.0 查 AER 错误计数,确认是否 PCIe 链路重训练频繁 -
USB 存储或 eMMC 出现
probe failed with error -5或blk_update_request: I/O error, dev mmcblk0:多因供电不足(尤其 USB HUB)、接触氧化、或芯片寿命耗尽;拔插时用 dmesg -w | grep -i "usb\|mmc" 实时盯住枚举过程
确保看到完整、及时、可回溯的日志
环形缓冲区小、易覆盖,瞬态链路中断一眨眼就没了:
- 排查前先存档:dmesg > /tmp/dmesg-before.log,再执行 dmesg -c 清空缓冲区(它会先输出再清,不丢线索)
- 复现问题时用实时监控:dmesg -w | grep -i "sd\|nvme\|ata\|link.*down\|phy",避免翻历史漏掉关键行
- 时间不准?别信 dmesg -T,改用 dmesg --time-format=iso(Linux 5.4+),或老内核用 dmesg -H 倒序+稳定时间戳
- 日志被截断?检查 cat /proc/sys/kernel/printk 第四位数字(控制台 loglevel),必要时临时提级:sudo dmesg -n 8
查到线索后必须交叉验证
dmesg 是起点,不是结论:
- 看到
I/O error, dev sda,立刻跑 sudo smartctl -a /dev/sda,重点看Current_Pending_Sector和Offline_Uncorrect是否增长 - 怀疑 NCQ 兼容问题?查是否启用:cat /sys/block/sda/device/queue_depth,再试 echo 'libata.noacpi=1' >> /etc/default/grub 临时禁用 ACPI 干预
- 虚拟机里报错?同步查宿主机:journalctl -k --since "1 hour ago" | grep -i "sda\|nvme",并确认 Ceph/NFS/LVM 后端状态
- 报错成簇出现(如连续 timeout + reset)?基本可排除单点坏块,指向链路不稳定,应优先处理线材、插槽、供电











