Linux Kernel 会将开机信息存储在 ring buffer 中,我们可以从中获得诸如系统架构、CPU、挂载的硬件,RAM 等多个运行级别的大量的系统信息。可利用 dmesg 来查看系统的启动信息。开机信息也会保存在 /var/log/dmesg。
当计算机启动时,系统内核会被加载到内存中。在加载的过程中会显示很多的信息,在这些信息中我们可以看到内核检测硬件设备。因此我们可以利用 dmesg 进行设备故障的诊断。
内核进行硬件的连接或断开连接操作时,在 dmesg 命令的帮助下,我们可以看到硬件的检测或者断开连接的信息。
1.dmesg命令说明
命令行格式为:dmesg <options>
具体支持以下options
-C, --clear
清除内核环形缓冲区(ring butter)。
-c, --read-clear
读取并清除所有消息。
-D, --console-off
禁止向终端打印消息。
-d, --show-delta
显示打印消息之间的时间差。
-e, --reltime
以易读格式显示本地时间和时间差。
-E, --console-on
启用向终端打印消息。
-F, --file <file>
用文件代替内核日志缓冲区。
-f, --facility <list>
将输出限制为定义的设施。
-H, --human
易读格式输出。
-k, --kernel
显示内核消息。
-L, --color
显示彩色消息。
-l, --level <list>
限制输出级别。
-n, --console-level <level>
设置打印到终端的消息级别。
-P, --nopager
不将输出通过管道传递给分页程序。
-r, --raw
打印原生消息缓冲区。
-S, --syslog
强制使用系统调用 syslog(2) 而非 /dev/kmsg 去读取内核信息,因为从 kernel 3.5.0 开始,默认使用 /dev/kmsg。
-s, --buffer-size <size>
查询内核环形缓冲区所用的缓冲区大小。
-T, --ctime
显示易读的时间戳(如果您使用了 SUSPEND/RESUME 则可能不准)。
-t, --notime
不打印消息时间戳。
-u, --userspace
显示用户空间消息。
-w, --follow
等待新消息。
-x, --decode
将设施和级别解码为可读的字符串。
-h, --help
显示此帮助并退出。
-V, --version
输出版本信息并退出。
2.使用案例
以下是常用的使用场景。
2.1.输出特定类型的信息
命令如下:
# 输出守护进程信息
dmesg --facility=daemon
facility有8种选项:kern、user、mail、daemon、auth、syslog、lpr、news
2.2.输出特定级别的信息
命令如下:
# 只要error和warn的信息
dmesg --level=err,warn
level选项共有8个枚举值:emerg、alert、crit、err、warn、notice、info、debug
2.3.输出时间戳和详细日志信息
命令如下:
dmesg -Tx
输出如下所示:
kern :warn : [Thu Jul 4 16:08:17 2024] kauditd_printk_skb: 14 callbacks suppressed
kern :notice: [Thu Jul 4 16:08:17 2024] audit: type=1106 audit(1720080497.387:4190050): pid=3811950 uid=0 auid=1001 ses=35 msg='op=PAM:session_close grantors=pam_limits,pam_limits,pam_systemd,pam_unix acct="root" exe="/usr/bin/sudo" hostname=? addr=? terminal=? res=success'
第一列是类型,第二列是输出级别,第三列是时间,第四列是输出模块,之后的是输出的具体消息。