备份dmesg日志必须先保存再清空,禁用-d或-C直接操作;安全命令为dmesg > /tmp/dmesg_$(date +%Y%m%d_%H%M%S).log;需扩容ring buffer防丢失,禁用journalctl替代。

备份 dmesg 日志前必须先保存,不能只依赖 -c 或 -C
直接运行 dmesg -c 会清空缓冲区并输出内容,但一旦终端意外中断或管道失败,就可能丢掉部分日志;dmesg -C 更危险——它不输出任何内容就清空,相当于“删库不跑路”。真实排障中,你永远不知道哪一行是关键线索。所以备份动作必须拆成两步:先完整保存,再考虑是否清空。
- 安全备份命令:
dmesg > /tmp/dmesg_$(date +%Y%m%d_%H%M%S).log - 若需带时间戳且兼容老内核(避免
-T不可用):dmesg -d | awk '{print strftime("%Y-%m-%d %H:%M:%S", systime()-$1), $0}' > /tmp/dmesg_raw.log - 确认写入成功后再清空:
sudo dmesg -C && echo "buffer cleared"(注意-C需 root)
Linux 内核日志本身不支持自动切割,得靠外部工具配合
dmesg 读取的是内核环形缓冲区(/dev/kmsg),它不是文件,没有路径、inode 和轮转机制。所谓“切割”,其实是把它的输出定期存为不同文件,并控制单个文件大小或保留天数。系统级方案只有两种可靠路径:
- 用
logrotate管理手动导出的日志:把dmesg > /var/log/dmesg-$(date +%F).log写进 cron,再配/etc/logrotate.d/dmesg定义 rotate 规则(daily、rotate 7、compress) - 用 systemd timer + script 替代 cron:更精准控制执行时机,避免多实例并发写同一文件;脚本里加
flock锁防止竞态 - 别碰
/var/log/dmesg文件本身:它是系统启动时的快照(由 init 进程 dump),后续运行中不会更新,对实时诊断无意义
高频日志场景下,ring buffer 太小会导致备份失效
看到 Some messages are lost. 就说明备份已经不可信了——旧日志被覆盖,你存下来的只是残片。默认 ring buffer 在 5.4+ 内核是 64KB,但在 NVMe 中断风暴或 USB 批量设备枚举时,几秒就满。这时候光备份没用,得先扩容:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 临时扩容(重启失效):
sudo dmesg -s 262144(设为 256KB) - 永久生效:改内核启动参数,在
/etc/default/grub的GRUB_CMDLINE_LINUX加log_buf_len=256K,然后sudo update-grub && sudo reboot - 验证是否生效:
cat /proc/sys/kernel/printk第四个数字是当前 loglevel,但 buffer 大小要看cat /proc/sys/kernel/dmesg_restrict是否为 0(普通用户可读)以及dmesg -s输出是否匹配预期
不要用 journalctl 或 syslog 替代 dmesg 备份
journalctl -k 看起来像 dmesg 的替代品,但它本质是转发:systemd-journald 从 /dev/kmsg 读取后缓存到二进制日志,中间有延迟(通常 100ms~2s),且默认不保存 boot 之前的早期消息。而 /var/log/kern.log 依赖 rsyslog 转发,更容易丢日志(尤其高负载时)。真正要抓 USB 插拔瞬间、NVMe reset、OOM killer 触发点,唯一零延迟入口就是 dmesg -w 直连内核缓冲区。
所以备份策略必须基于 dmesg 原生命令,而不是寄希望于日志服务“帮忙记住”。

















