一、dmesg日志概述
dmesg(display message)是Linux系统中用于显示内核环形缓冲区(kernel ring buffer)消息的命令。这些消息在系统启动时由内核产生,包含了硬件检测、驱动程序加载、内核模块信息等重要内容。随着系统运行时间增加,dmesg日志会不断累积,可能占用大量内存空间。
dmesg日志的主要用途:
– 查看系统启动过程中的硬件检测信息
– 诊断硬件驱动问题
– 排查内核模块加载异常
– 监控系统运行时的事件和错误
– 分析USB、硬盘、网络等设备状态
dmesg日志存储位置:
– 内核环形缓冲区(kernel ring buffer)
– 内存中存储,重启后清空
– /var/log/dmesg 文件(系统启动时的快照)
二、查看dmesg日志
2.1 基本查看命令
# 查看所有dmesg日志
dmesg
# 分页查看
dmesg | less
# 查看最后20条
dmesg | tail -20
# 查看前30条
dmesg | head -30
# 实时监控新日志(类似tail -f)
dmesg -w
# 仅显示错误级别信息
dmesg -l err
# 显示指定级别的信息(emerg, alert, crit, err, warn, notice, info, debug)
dmesg -l warn,err
2.2 格式化输出
# 时间戳转换为人可读格式
dmesg -T
# 显示时间戳
dmesg -t
# 使用JSON格式输出
dmesg -J
# 简洁模式(只显示消息部分)
dmesg -s 8192
# 显示每条消息的级别
dmesg -x
2.3 过滤特定关键词
# 查找USB相关日志
dmesg | grep -i usb
# 查找硬盘相关日志
dmesg | grep -i "sda\|hda\|nvme"
# 查找网络相关日志
dmesg | grep -i eth
# 查找内存相关日志
dmesg | grep -i mem
# 查找错误信息
dmesg | grep -i error
# 查找警告信息
dmesg | grep -i warning
三、清理dmesg日志
3.1 清空当前dmesg缓冲区
# 方法1:清空环形缓冲区(需要root权限)
sudo dmesg -c
# 方法2:清除所有消息
sudo dmesg -C
# 方法3:清空并显示原有内容
sudo dmesg -c
# 查看清空后的状态
dmesg
3.2 使用journalctl清理
# 查看dmesg日志(通过journal)
journalctl -k
# 查看最近的dmesg日志
journalctl -k -n 50
# 清空dmesg日志(通过journalctl)
sudo journalctl --vacuum-time=1s -k
# 保留最近7天的dmesg日志
sudo journalctl --vacuum-time=7d -k
# 限制日志文件大小为50MB
sudo journalctl --vacuum-size=50M -k
3.3 清除/var/log/dmesg文件
# 查看文件大小
ls -lh /var/log/dmesg
# 清空文件内容(保留文件)
sudo truncate -s 0 /var/log/dmesg
# 删除并重建文件
sudo rm /var/log/dmesg
sudo touch /var/log/dmesg
sudo chmod 640 /var/log/dmesg
sudo chown root:adm /var/log/dmesg
3.4 清除历史dmesg日志
# 查找所有dmesg相关日志文件
sudo find /var/log -name "*dmesg*"
# 清空所有dmesg日志文件
sudo find /var/log -name "*dmesg*" -exec truncate -s 0 {} \;
# 删除旧的压缩日志
sudo find /var/log -name "*.dmesg*" -delete
四、限制dmesg日志大小
4.1 配置内核环形缓冲区大小
# 查看当前缓冲区大小(单位:字节)
cat /proc/sys/kernel/dmesg_restrict
# 查看默认缓冲区大小
cat /proc/sys/kernel/printk
# 临时修改缓冲区大小(单位:字节)
# 缓冲区大小必须是2的幂次方
sudo sysctl -w kernel.printk="4 4 1 7"
# 参数说明:控制台日志级别、最小控制台日志级别、
# 默认控制台日志级别、引导默认控制台日志级别
# 永久修改(添加到/etc/sysctl.conf)
echo "kernel.printk=4 4 1 7" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
4.2 配置文件系统权限
# 查看当前权限设置
cat /proc/sys/kernel/dmesg_restrict
# 允许非root用户查看dmesg(临时)
sudo sysctl -w kernel.dmesg_restrict=0
# 永久设置(添加到/etc/sysctl.conf)
echo "kernel.dmesg_restrict=0" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
4.3 配置systemd-journald
# 编辑journald配置
sudo nano /etc/systemd/journald.conf
添加或修改以下配置:
[Journal]
Storage=persistent
SystemMaxUse=500M
SystemMaxFileSize=50M
MaxRetentionSec=30day
Compress=yes
重启journald服务:
sudo systemctl restart systemd-journald
# 查看journald日志大小
journalctl --disk-usage
五、自动清理dmesg日志
5.1 使用cron定时清理
# 编辑crontab
sudo crontab -e
添加以下任务:
# 每天凌晨3点清空dmesg缓冲区
0 3 * * * /usr/bin/dmesg -C
# 每周日凌晨4点清理journald dmesg日志
0 4 * * 0 /usr/bin/journalctl --vacuum-time=7d -k
# 每月1日凌晨5点清空所有dmesg文件
0 5 1 * * /usr/bin/find /var/log -name "*dmesg*" -exec truncate -s 0 {} \;
5.2 使用systemd timer
创建清理服务:
sudo nano /etc/systemd/system/clear-dmesg.service
[Unit]
Description=Clear dmesg log buffer
[Service]
Type=oneshot
ExecStart=/usr/bin/dmesg -C
创建定时器:
sudo nano /etc/systemd/system/clear-dmesg.timer
[Unit]
Description=Clear dmesg log buffer daily
[Timer]
OnCalendar=daily
AccuracySec=1h
[Install]
WantedBy=timers.target
启用定时器:
sudo systemctl enable clear-dmesg.timer
sudo systemctl start clear-dmesg.timer
# 查看定时器状态
sudo systemctl list-timers | grep clear-dmesg
5.3 logrotate配置
sudo nano /etc/logrotate.d/dmesg
添加以下内容:
/var/log/dmesg {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 640 root adm
postrotate
/usr/bin/dmesg -C
endscript
}
测试配置:
sudo logrotate -d /etc/logrotate.d/dmesg
六、诊断与问题排查
6.1 分析dmesg中的常见错误
# 查找内存错误
dmesg | grep -i "memory\|oom\|page"
# 查找硬盘错误
dmesg | grep -i "error\|fail" | grep -i "sd\|hda\|nvme"
# 查找网络错误
dmesg | grep -i "eth\|net\|network" | grep -i "error\|fail"
# 查找USB错误
dmesg | grep -i "usb" | grep -i "error\|fail"
# 查找文件系统错误
dmesg | grep -i "ext4\|xfs\|btrfs" | grep -i "error"
6.2 保存诊断信息
# 保存完整dmesg输出
dmesg > ~/dmesg_full_$(date +%Y%m%d).log
# 保存带时间戳的dmesg
dmesg -T > ~/dmesg_$(date +%Y%m%d_%H%M%S).log
# 保存特定类型的日志
dmesg -l err > ~/dmesg_errors_$(date +%Y%m%d).log
# 压缩保存
dmesg | gzip > ~/dmesg_$(date +%Y%m%d).log.gz
6.3 常见问题处理
问题1:dmesg显示内存不足
# 查看OOM killer日志
dmesg | grep -i "oom\|out of memory"
# 查看内存状态
free -h
cat /proc/meminfo
问题2:硬盘I/O错误
# 查看硬盘错误日志
dmesg | grep -i "ata\|sda\|nvme" | grep -i "error\|fail"
# 检查SMART状态
sudo smartctl -a /dev/sda
问题3:网络驱动加载失败
# 查看网络驱动日志
dmesg | grep -i "eth\|network\|iwlwifi\|rtl"
# 检查网络接口状态
ip link show
ethtool eth0
七、dmesg日志高级应用
7.1 实时监控系统事件
#!/bin/bash
# monitor_dmesg.sh - 实时监控dmesg日志
echo "开始监控dmesg日志(Ctrl+C退出)..."
echo "========================================"
# 实时显示新日志
dmesg -w | while IFS= read -r line; do
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
# 高亮显示错误和警告
if echo "$line" | grep -qi "error\|fail\|critical"; then
echo -e "\033[0;31m[$timestamp] $line\033[0m" # 红色
elif echo "$line" | grep -qi "warn"; then
echo -e "\033[0;33m[$timestamp] $line\033[0m" # 黄色
else
echo "[$timestamp] $line"
fi
done
7.2 统计日志类型
#!/bin/bash
# analyze_dmesg.sh - 分析dmesg日志类型统计
echo "dmesg日志分析报告 - $(date '+%Y-%m-%d %H:%M:%S')"
echo "=========================================="
echo "日志总数: $(dmesg | wc -l)"
echo ""
echo "按级别统计:"
dmesg | sed 's/.*\[ *[0-9]*\.\([0-9]*\)\].*/\1/' | sort | uniq -c | sort -rn
echo ""
echo "错误数量: $(dmesg | grep -ci 'error\|fail')"
echo "警告数量: $(dmesg | grep -ci 'warn')"
echo "信息数量: $(dmesg | grep -ci 'info')"
7.3 自动告警脚本
#!/bin/bash
# dmesg_alert.sh - dmesg错误告警
ALERT_LOG="/var/log/dmesg_alert.log"
ERROR_THRESHOLD=5
# 获取最近的错误数量
ERROR_COUNT=$(dmesg | grep -ci 'error\|fail\|critical')
if [ $ERROR_COUNT -gt $ERROR_THRESHOLD ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 检测到 $ERROR_COUNT 个错误!" >> $ALERT_LOG
# 获取错误详情
dmesg | grep -i 'error\|fail\|critical' | tail -10 >> $ALERT_LOG
# 发送告警邮件(可选)
# echo "dmesg错误告警:检测到 $ERROR_COUNT 个错误" | mail -s "服务器告警" admin@example.com
fi
八、总结
Linux dmesg日志清理与优化是系统维护的重要环节:
- 查看日志:
dmesg、dmesg -T、journalctl -k - 清空缓冲区:
dmesg -C或dmesg -c - 清理文件:
truncate -s 0 /var/log/dmesg - 自动清理:cron定时任务、systemd timer
- 限制大小:sysctl配置、journald配置
- 问题诊断:过滤关键词、保存诊断信息
掌握这些技巧,可以有效管理dmesg日志空间,保持系统健康运行。
本文基于Ubuntu 22.04/CentOS 7+编写,适用于大多数Linux服务器环境。