dmesg命令用于显示内核环形缓冲区中的开机信息和运行时日志,不能通过-S选项或直接命令修改缓冲区大小;调整需通过内核启动参数log_buf_len或动态写入/proc/sys/kernel/log_buf_len(若内核支持)。

Linux 中 dmesg 命令本身不提供 -S 选项,也**不能直接通过 dmesg 设置内核日志缓冲区大小**。所谓 “dmesg -S” 是常见误解,实际调整内核日志缓冲区需在内核启动阶段或运行时通过内核参数/接口修改。
确认当前缓冲区大小
内核日志环形缓冲区(log buffer)默认大小通常为 64KB(CONFIG_LOG_BUF_SHIFT=16,即 2¹⁶=65536 字节),但具体值取决于内核编译配置。可查看:
-
cat /proc/sys/kernel/log_buf_len—— 显示当前生效的缓冲区字节数(仅当内核支持动态调整且已启用 CONFIG_HAVE_LOG_BUF_DYNAMIC 时才可写) -
zcat /proc/config.gz | grep CONFIG_LOG_BUF_SHIFT(若存在 kernel config)—— 查看编译时设定的位数 -
dmesg -l err,warn | head -5—— 快速观察近期高频告警是否已挤掉关键早期日志
运行时增大缓冲区(有限制)
仅适用于启用了 CONFIG_HAVE_LOG_BUF_DYNAMIC=y 的内核(较新发行版如 RHEL 8.5+/CentOS Stream 9+、Ubuntu 22.04+ 默认开启)。操作步骤:
- 检查是否支持:
grep -q 'log_buf_len' /proc/sys/kernel/ && echo "dynamic supported" - 临时增大(重启失效):
echo 131072 > /proc/sys/kernel/log_buf_len(设为 128KB) - 注意:该值必须是 2 的幂(如 65536、131072、262144),且不能小于原值,也不能超过内核允许上限(一般 ≤ 2MB)
永久增大缓冲区(推荐方式)
通过内核启动参数 log_buf_len 固定分配更大空间,最稳定可靠:
- 编辑 GRUB 配置:
/etc/default/grub - 在
GRUB_CMDLINE_LINUX行末尾添加:log_buf_len=1048576(即 1MB) - 更新 GRUB:
sudo update-grub(Debian/Ubuntu)或sudo grub2-mkconfig -o /boot/grub2/grub.cfg(RHEL/CentOS/Fedora) - 重启系统后生效,
cat /proc/sys/kernel/log_buf_len将显示 1048576
配合高频告警的实用建议
单纯扩缓冲区治标不治本。高频内核告警(如驱动异常、硬件错误、OOM killer 触发)往往反映底层问题,应同步排查:
- 用
dmesg -T -l err,warn加时间戳筛选最近错误,定位源头模块 - 将
dmesg日志持续导出:while true; do dmesg -t -l err,warn >> /var/log/dmesg-warn.log; sleep 30; done &(仅作临时辅助) - 确保
rsyslog或systemd-journald已配置捕获 kernel messages(默认通常已启用):journalctl -k -p 3..4查看 error/warning 级别内核日志 - 对频繁触发的设备(如 NVMe、网卡),检查固件版本、驱动兼容性及 dmesg 中重复出现的 call trace
缓冲区调大能延缓日志覆盖,但无法替代根因分析。真正解决问题,才能让 dmesg 输出保持简洁、有效、可追溯。


















