dmesg -t 仅输出内核日志快照,不支持实时监控;需结合 grep 过滤、轮询脚本、aer/nvme 硬件状态检查及 journalctl 实现 nvme 物理链路异常的持续观测与超时报错留存。

dmesg -T 本身不支持“实时监控”或“自动记录超时报错日志”,它只是以可读时间格式(带时区)打印内核环形缓冲区(ring buffer)的当前快照。要实现对 NVMe 物理链路健康(如 PCIe 链路降速、AER 错误、超时、reset、link down/up)的持续观测和超时报错日志留存,需结合 dmesg -T 与其它机制协同使用。
抓取并过滤关键 NVMe 链路错误事件
NVMe 的物理层异常(如 PCIe link training failure、correctable/uncorrectable errors、timeout reset)会由内核驱动(nvme、pcieport)记录到 dmesg。可用以下命令即时筛查:
- dmesg -T | grep -i -E "(nvme|pcie|aer|timeout|reset|link.*down|link.*up|training|correctable|uncorrectable)"
- 加
--since "1 hour ago"可限定最近一小时(需 systemd 环境):
dmesg -T --since "1 hour ago" | grep -i "timeout\|nvme.*reset\|pcie.*err" - 注意:NVMe 超时通常表现为
nvme nvme0: I/O 1234 timeout或触发nvme nvme0: resetting controller,后续常伴随PCIe Bus Error或AER: Corrected error等上游提示
建立轻量级轮询日志捕获(无需第三方工具)
用 shell 脚本定期 dump 新增 dmesg 并提取 NVMe 相关错误,写入时间戳文件:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 创建脚本
/usr/local/bin/nvme-dmesg-watch.sh:
#!/bin/bash LOG_DIR="/var/log/nvme-dmesg" mkdir -p "$LOG_DIR" LAST_SEQ=$(cat "$LOG_DIR/.last_seq" 2>/dev/null || echo 0) CURRENT_SEQ=$(dmesg -r | tail -n1 | cut -d']' -f1 | tr -d '[' 2>/dev/null || echo 0) <p>if [ "$CURRENT_SEQ" -gt "$LAST_SEQ" ]; then dmesg -T -l err,warn | grep -i -E "(nvme|pcie|aer|timeout|reset|link.<em>down|link.</em>up)" >> "$LOG_DIR/$(date +\%Y\%m\%d).log" echo "$CURRENT_SEQ" > "$LOG_DIR/.last_seq" fi</p>
- 配合 cron 每分钟执行一次:
* * * * * /usr/local/bin/nvme-dmesg-watch.sh - 该方式避免重复记录,只捕获新增的 warn/error 级别且含关键词的日志
补充验证:直接读取 PCIe AER 和 NVMe 控制器状态
dmesg 是间接线索,还需主动检查硬件层状态:
- 查看 PCIe AER 错误计数(需 root):
sudo setpci -s $(lspci | grep -i nvme | head -n1 | awk '{print $1}') ECAP_AER+0x10.w(读 Uncorrectable Error Status) - 检查 NVMe 控制器健康与错误信息:
sudo nvme smart-log /dev/nvme0n1 | grep -E "(health|error|warning|critical)"
sudo nvme error-log /dev/nvme0n1(显示最近 64 条错误条目,含 timeout 类型) - 观察 PCIe 链路宽度/速率是否降级:
sudo lspci -vv -s $(lspci | grep -i nvme | head -n1 | awk '{print $1}') | grep -A5 "LnkSta:"(关注Speed和Width是否低于标称值)
进阶建议:用 journalctl 替代纯 dmesg(推荐 systemd 系统)
journalctl 更可靠,支持持久化、结构化查询和按优先级过滤:
- 启用 dmesg 日志持久化(若未开启):
sudo mkdir -p /var/log/journal && sudo systemctl restart systemd-journald - 实时跟踪新出现的 NVMe/PCIe 错误:
journalctl -k -f -p 3 | grep -i -E "(nvme|pcie|aer|timeout)"(-p 3 = err 级别) - 导出过去 24 小时所有相关错误:
journalctl -k --since "24 hours ago" -p 3 | grep -i "nvme.*timeout\|pcie.*err" > /tmp/nvme-errors.log










