一、dmesg 命令核心用法详解
dmesg 是内核环形缓冲区日志查看工具,主要记录系统启动过程、硬件驱动加载、内核事件等关键信息,是硬件诊断与系统问题排查的核心工具。
1. 基础查看与人性化显示
内核日志默认存储在环形缓冲区,需通过工具查看或处理,常用基础操作如下:
案例:刚插入 U 盘后,快速查看识别过程
# 用标准时间戳显示最近10条日志,可直接看到U盘挂载路径(如/dev/sdb)
dmesg -T | tail -10
2. 缓冲区操作与实时监控
内核缓冲区默认大小为 16KB(可通过-s调整),支持清空、实时跟踪等操作:
清空缓冲区(需 root 权限):
sudo dmesg -C # 直接清空缓冲区(清空后新事件会继续记录)
sudo dmesg -c # 先显示当前日志,再清空(兼容旧版系统)
实时监控新日志(内核 3.5.0 + 支持):
# 类似`tail -f`,动态跟踪新事件(如拔插USB设备时会实时显示)
sudo dmesg -w
案例:调试 USB 设备频繁断开问题
# 实时监控USB相关事件,可捕捉设备断开的错误信息(如"USB disconnect")
sudo dmesg -w | grep -i usb
3. 按日志级别与设施过滤
内核日志按 "级别" 和 "设施" 分类,可精准过滤关键信息:
(1)按日志级别过滤
级别从严重到轻微依次为:emerg > alert > crit > err > warn > notice > info > debug
# 仅显示错误和警告(排查硬件故障核心命令)
dmesg -l err,warn
# 仅显示系统崩溃级事件(如内核panic)
dmesg -l emerg
案例:快速定位硬盘错误
# 只看错误级日志中的硬盘sda相关信息(如I/O错误)
dmesg -l err | grep -i sda
(2)按设施过滤
"设施" 指日志来源(如内核、守护进程等),常用选项:
# 显示内核和守护进程日志
dmesg -f kern,daemon
# 仅显示内核消息(排除用户空间日志,更纯粹)
dmesg -k
4. 高级分析与输出管理
(1)时间分析工具
# 显示相邻消息的时间间隔(秒),用于分析启动卡顿节点
dmesg -d
# 显示本地时间+相对时间(如"2024-05-20 14:30:22 (5min ago)")
dmesg -e
案例:分析系统启动耗时
# 查看初始化过程中各步骤的间隔时间,定位耗时环节
dmesg -d | grep -i "init"
(2)日志持久化与统计
dmesg 缓冲区在重启后会清空,需手动保存或结合持久化工具:
# 保存错误日志到文件
dmesg -l err,warn > /var/log/kernel_errors_$(date +%F).log
# 统计错误类型频率(找出最频繁的错误)
dmesg -l err | cut -d']' -f2- | sort | uniq -c | sort -nr
(3)与 systemd 日志互补
systemd 系统中,journalctl可查看持久化内核日志(重启后不丢失):
# 查看所有内核日志(包括历史)
journalctl -k
# 查看上一次启动的内核日志(-b -1表示上一次启动)
journalctl -k -b -1
二、硬件信息查询与诊断命令
结合 dmesg 与硬件专用工具,可全面排查硬件驱动、设备状态等问题,适配 Ubuntu(DEB)和 RockyLinux(RHEL)主流发行版。
1. 通用硬件查看命令(全发行版适用)
(1)网卡驱动信息
网卡是服务器 / 桌面端核心硬件,需确认驱动加载状态:
# 方法1:通过ethtool查看(需安装)
sudo ethtool -i eth0 # 替换eth0为实际网卡名(如ens33),输出含驱动名、版本
# 安装:
Ubuntu
sudo apt install ethtoo
RockyLinux
sudo dnf install ethtool
# 方法2:通过PCI设备列表查看
lspci -k | grep -A 3 -i ethernet # 显示网卡型号及绑定的驱动模块(如e1000、igb)
案例:排查网卡驱动未加载问题
# 先看dmesg中是否有网卡错误
dmesg -l err | grep -i "eth0"
# 若有输出但无驱动,需手动加载
sudo modprobe e1000
# 再查PCI设备是否识别
lspci | grep -i ethernet
(2)硬盘与存储设备
# 显示所有硬盘型号及驱动(如sd驱动对应SATA,nvme对应NVMe)
lsblk -d -o NAME,MAJ:MIN,RM,MODEL,DRIVER # 查看硬盘驱动及识别状态
# 查看SATA/NVMe驱动加载
lsmod | grep -i sd # SATA/SCSI驱动(sd_mod)
lsmod | grep -i nvme # NVMe驱动(nvme_core)
案例:NVMe 硬盘不识别排查
# 步骤1:用dmesg看是否有识别错误
dmesg | grep -i nvme
# 步骤2:检查驱动是否加载
lsmod | grep nvme # 若无输出,手动加载:sudo modprobe nvme
# 步骤3:查看PCI总线是否识别设备
lspci | grep -i nvme # 若设备存在但无驱动,可能是内核版本过低
(3)USB 设备与 PCI 设备
查看USB设备及驱动
lsusb -v | grep -i "driv" # 显示USB设备对应的驱动(如usbhid、usb-storage)
# 查看所有PCI设备及驱动
lspci -k # 每行显示设备型号及绑定的驱动模块
(4)通过命令查看服务器硬件信息
# 方法1:通过dmidecode查看(需root权限)
sudo dmidecode -t baseboard # 显示主板厂商/型号/SN
sudo dmidecode -t bios # 显示BIOS版本/日期
sudo dmidecode -t system # 显示系统SN/UUID
# 方法2:BMC信息(需ipmitool)
sudo ipmitool mc info # 显示BMC固件版本
sudo ipmitool fru print # 显示FRU信息(含主板SN)
# 安装:
Ubuntu: sudo apt install ipmitool
RockyLinux: sudo dnf install ipmitool
(5)通过命令查看服务器内存和故障信息
# 查看内存配置
sudo dmidecode -t memory | grep -A16 "Memory Device" # 显示每条内存的Size/Type/Speed
sudo lshw -short -C memory # 快速查看内存总量及插槽占用
# 查看内存错误日志(需edac-utils)
sudo edac-util --status # 显示可纠正错误(CE)和不可纠正错误(UE)
sudo cat /var/log/mcelog # 查看详细内存错误记录
# 安装:
Ubuntu: sudo apt install edac-utils mcelog
RockyLinux: sudo dnf install edac-utils mcelog
(6)监控硬件错误信息
# 实时监控硬件错误
journalctl -f -k | grep -E "MCERR|MCE|EDAC" # 监控内核内存错误事件
ipmitool sel list # 查看BMC系统事件日志(硬件告警_sel日志)
2. 发行版专属工具与安装
不同包管理系统(DEB/RPM)的工具安装命令存在差异,关键工具如下:
3. 驱动模块深度查询
内核模块是硬件驱动的载体,需确认模块是否加载、版本是否匹配:
# 查看指定驱动模块信息(如SATA驱动ahci)
modinfo ahci # 显示驱动版本、支持的硬件型号、依赖模块等
# 查看网卡驱动文件路径
readlink -f /sys/class/net/eth0/device/driver/module # 输出如/lib/modules/5.4.0-xx/kernel/drivers/net/ethernet/intel/e1000e.ko
# 手动加载/卸载驱动模块
sudo modprobe e1000e # 加载Intel网卡驱动
sudo rmmod e1000e # 卸载驱动(需先禁用网卡:sudo ifdown eth0)
案例:更新驱动后验证是否生效
# 卸载旧驱动并加载新驱动
sudo rmmod e1000e && sudo modprobe e1000e
# 用dmesg确认加载成功
dmesg | grep -i "e1000e.*loaded" # 若显示"e1000e: module loaded"则成功
三、实战场景:从日志到解决方案
结合 dmesg 与硬件工具,解决常见系统与硬件问题。
1. 场景一:外接 USB 设备不识别
症状:插入 U 盘 / 移动硬盘后无反应,文件管理器不显示。
排查步骤:
用 dmesg 实时监控 USB 事件:
# 插设备时观察输出
sudo dmesg -w | grep -i usb
若显示"usb 1-2: new high-speed USB device number x using xhci_hcd",说明设备被识别,但可能未挂载(需检查lsblk)。
若显示"usb 1-2: device descriptor read/64, error -110",可能是 USB 接口供电不足或设备损坏。
检查 USB 控制器驱动:
lspci -k | grep -A 2 -i "usb controller" # 确认xhci_hcd/ehci_hcd驱动是否加载
2. 场景二:服务器启动后硬盘未挂载
症状:df -h看不到预期硬盘,应用报错 "找不到存储设备"。
排查步骤:
用 dmesg 查看硬盘识别日志:
# 假设预期硬盘为sdb
dmesg -T | grep -i sdb
若显示"sd 2:0:0:0: [sdb] Attached SCSI disk",说明硬盘被识别但未挂载(检查/etc/fstab)。
若显示"I/O error, dev sdb, sector xxxxx",可能是硬盘物理损坏,需进一步检测:
# 查看SMART报告,关注"Reallocated_Sector_Ct"(重映射扇区数)
sudo smartctl -a /dev/sdb
检查硬盘驱动:
# 确认SATA驱动是否加载,未加载则用`sudo modprobe sd_mod`
lsmod | grep sd_mod
3. 场景三:内核崩溃(Oops/Panic)排查
症状:系统突然重启或冻结,屏幕显示内核错误信息。
排查步骤:
查看 dmesg 中的崩溃日志:
# Oops为非致命错误,Panic为致命崩溃
dmesg | grep -i "Oops\|Panic"
结合持久化日志分析(systemd 系统):
# 查看内核错误级日志,定位崩溃前的异常事件(如内存溢出、驱动冲突)
journalctl -k -p err
检查内核版本与驱动兼容性:
# 查看内核版本
uname -r
# 若显示"tainted",说明存在非官方驱动(可能导致冲突)
dmesg | grep -i "module.*tainted"
四、注意事项与最佳实践
权限问题:dmesg 默认可查看大部分日志,但清空缓冲区、查看完整调试信息需 root 权限(加sudo)。
日志持久化:dmesg 缓冲区在重启后丢失,建议定期保存关键日志:
# 每天凌晨3点保存内核错误日志(添加到crontab)
echo "0 3 * * * root dmesg -l err,warn >> /var/log/kernel_daily_$(date +\%F).log" | sudo tee -a /etc/crontab
设备名差异:
网卡名:传统命名(eth0)、Systemd 命名(ens33)、PCI 拓扑命名(enp0s3),可用ip link确认实际名称。
硬盘名:SATA/SCSI 设备为sda/sdb,NVMe 设备为nvme0n1/nvme1n1。
通过 dmesg 与硬件工具的组合,可覆盖 90% 以上的 Linux 硬件诊断场景。遇到复杂问题时,建议结合内核文档(/usr/share/doc/linux-doc/)和硬件厂商驱动说明进一步分析。