Linux之dmesg命令查看系统开机日志
命令简介
Linux 内核是操作系统的核心,它控制着对系统资源的访问,例如 CPU,I/O 设备,物理内存和文件系统。引导过程中以及系统运行时,内核会将各种消息写入内核环形缓冲区。这些消息包括系统操作的各种信息。内核环形缓冲区是物理内存的一部分,用于保存内核的日志消息。它具有固定的大小,这意味着一旦缓冲区已满,较旧的日志记录将被覆盖。dmesg 命令是用于在 Linux / Unix 的操作系统中查看和控制内核环形缓冲区。对于检查内核启动消息和调试硬件相关的问题很有用。
Linux dmesg(英文全称:display message)命令用于显示开机信息。kernel 会将开机信息存储在 ring buffer中。您若是开机时来不及查看信息,可利用 dmesg 来查看。开机信息亦保存在 /var/log 目录中,名称为 dmesg 的文件里。
1 2 3 | [root@lhrxxt ~]# ll /var/log/dmesg -rw-r--r-- 1 root root 101522 Sep 26 09:10 /var/log/dmesg [root@lhrxxt ~]# |
使用语法及参数说明
1、使用语法
#dmesg [选项]
2、参数说明
参数选项 | 参数说明 |
---|---|
-C, --clear | 清除内核环形缓冲区(ring butter) |
-c, --read-clear | 读取并清除所有消息 |
-D, --console-off | 禁止向终端打印消息 |
-d, --show-delta | 显示打印消息之间的时间差 |
-e, --reltime | 以易读格式显示本地时间和时间差 |
-E, --console-on | 启用向终端打印消息 |
-F, --file <文件> | 用 文件 代替内核日志缓冲区 |
-f, --facility <列表> | 将输出限制为定义的设施 |
-H, --human | 易读格式输出 |
-k, --kernel | 显示内核消息 |
-L, --color | 显示彩色消息 |
-l, --level <列表> | 限制输出级别 |
-n, --console-level <级别> | 设置打印到终端的消息级别 |
-P, --nopager | 不将输出通过管道传递给分页程序 |
-r, --raw | 打印原生消息缓冲区 |
-S, --syslog | 强制使用 syslog(2) 而非 /dev/kmsg |
-s, --buffer-size <大小> | 查询内核环形缓冲区所用的缓冲区大小 |
-T, --ctime | 显示易读的时间戳(如果您使用了SUSPEND/RESUME 则可能不准) |
-t, --notime | 不打印消息时间戳 |
-u, --userspace | 显示用户空间消息 |
-w, --follow | 等待新消息 |
-x, --decode | 将设施和级别解码为可读的字符串 |
-h, --help | 显示此帮助并退出 |
-V, --version | 输出版本信息并退出 |
使用示例
1、查看命令版本
(base) [root@s186 ~]# dmesg -V
dmesg,来自 util-linux 2.23.2
2、获取命令帮助
(base) [root@s186 ~]# dmesg -help
用法:
dmesg [选项]选项:
-C, --clear 清除内核环形缓冲区(ring butter)
-c, --read-clear 读取并清除所有消息
-D, --console-off 禁止向终端打印消息
-d, --show-delta 显示打印消息之间的时间差
-e, --reltime 以易读格式显示本地时间和时间差
…
3、查看所有开机日志信息
(base) [root@s186 ~]# dmesg
[ 0.000000] microcode: microcode updated early to revision 0x25, date = 2018-04-02
[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Initializing cgroup subsys cpuacct
[ 0.000000] Linux version 3.10.0-957.5.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1
SMP Fri Feb 1 14:54:57 UTC 2019
[ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.10.0-957.5.1.el7.x86_64 root=UUID=062b2cf4-b789-4eb4-bc1a-4b48d8266d16 ro crashkernel=auto biosdev
name=0 rhgb quiet LANG=en_US.UTF-8
[ 0.000000] e820: BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d7ff] usable
…
4、过滤想查看信息
#建议使用-i参数过滤时忽略大小写
(base) [root@s186 ~]# dmesg |grep -i cpu
[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Initializing cgroup subsys cpuacct
[ 0.000000] ACPI: SSDT 00000000d8ffa810 00539 (v01 PmRef Cpu0Ist 00003000 INTL 20120711)
[ 0.000000] ACPI: SSDT 00000000d8ffad50 00AD8 (v01 PmRef CpuPm 00003000 INTL 20120711)
[ 0.000000] smpboot: Allowing 4 CPUs, 0 hotplug CPUs
[ 0.000000] setup_percpu: NR_CPUS:5120 nr_cpumask_bits:4 nr_cpu_ids:4 nr_node_ids:1
[ 0.000000] PERCPU: Embedded 38 pages/cpu @ffff99c25fa00000 s118784 r8192 d28672 u524288
[ 0.000000] pcpu-alloc: s118784 r8192 d28672 u524288 alloc=1*2097152
[ 0.000000] pcpu-alloc: [0] 0 1 2 3
[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[ 0.000000] RCU restricting CPUs from NR_CPUS=5120 to nr_cpu_ids=4.
[ 0.002975] mce: CPU supports 7 MCE banks
[ 0.002981] CPU0: Thermal monitoring enabled (TM1)
[ 0.039076] smpboot: CPU0: Intel® Core™ i3-4130 CPU @ 3.40GHz (fam: 06, model: 3c, stepping: 03)
[ 0.042323] NMI watchdog: enabled on all CPUs, permanently consumes one hw-PMU counter.
[ 0.044633] Brought up 4 CPUs
[ 0.070551] ACPI: SSDT ffff99c25fc62400 003D3 (v01 PmRef Cpu0Cst 00003001 INTL 20120711)
[ 0.341801] ACPI: Requesting acpi_cpufreq
[ 0.369369] cpuidle: using governor menu
[ 7.501018] cryptd: max_cpu_qlen set to 1000
5、便于阅读的方式显示日志日期和时间
(base) [root@s186 ~]# dmesg -d -T |grep -i Memory
[二 10月 5 13:21:05 2021 < 0.000000>] Base memory trampoline at [ffff99c040097000] 97000 size 24576
[二 10月 5 13:21:05 2021 < 0.000000>] Reserving 161MB of memory at 688MB for crashkernel (System RAM: 8110MB)
[二 10月 5 13:21:05 2021 < 0.000000>] Early memory node ranges
[二 10月 5 13:21:05 2021 < 0.000000>] Reserving Intel graphics memory at [mem 0xdd200000-0xdf1fffff]
[二 10月 5 13:21:05 2021 < 0.000000>] PM: Registered nosave memory: [mem 0x0009d000-0x0009dfff]
[二 10月 5 13:21:05 2021 < 0.000000>] PM: Registered nosave
…
6、实时监控查看日志末尾N行
实时查看日志末尾10行
1 | (base) [root@s186 ~]# watch “dmesg | tail -10” |
7、查看指定级别格式日志
(base) [root@s186 ~]# dmesg -l warn
[ 0.000000] ACPI: RSDP 00000000000f0490 00024 (v02 DELL )
[ 0.000000] ACPI: XSDT 00000000d8fee080 00084 (v01 DELL CBX3 01072009 AMI 00010013)
[ 0.000000] ACPI: FACP 00000000d8ffa468 0010C (v05 DELL CBX3 01072009 AMI 00010013)
[ 0.000000] ACPI: DSDT 00000000d8fee198 0C2CA (v02 DELL CBX3 00000014 INTL 20091112)
[ 0.000000] ACPI: FACS 00000000da7fe080 00040
#支持的日志级别(优先级):
emerg - 系统无法使用
alert - 操作必须立即执行
crit - 紧急条件
err - 错误条件
warn - 警告条件
notice - 正常但重要的条件
info - 信息
debug - 调试级别的消息
8、打印并清除内核环形缓冲区
(base) [root@s186 ~]# dmesg-c
…
(base) [root@s186 ~]# dmesg |more
(base) [root@s186 ~]#
9、直接查看dmesg日志信息
(base) [root@s186 log]# cat /var/log/dmesg |more
[ 0.000000] microcode: microcode updated early to revision 0x25, date = 2018-04-02
[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Initializing cgroup subsys cpuacct
[ 0.000000] Linux version 3.10.0-957.5.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1
SMP Fri Feb 1 14:54:57 UTC 2019
[ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.10.0-957.5.1.el7.x86_64 root=UUID=062b2cf4-b789-4eb4-bc1a-4b48d8266d16 ro crashkernel=auto biosdev
name=0 rhgb quiet LANG=en_US.UTF-8
dmesg 怎么方便查看时间戳
做为dba,除了查看数据库的日志,也要关注系统的开机日志。如最常见的dmesg。但是dmesg的时间戳貌似不直观。比如:
1 2 3 4 5 | [2869535.343309] docker0: port 1(veth0127f52) entered blocking state [2869535.344186] docker0: port 1(veth0127f52) entered disabled state [2869535.355223] device veth0127f52 entered promiscuous mode [2869535.356173] docker0: port 1(veth0127f52) entered blocking state [2869535.357013] docker0: port 1(veth0127f52) entered forwarding ort 2(veth16357a3) entered blocking state |
那有没有方式转化呢?当然有。如下方式,将1398324600转化为具体的时间戳。
1 2 | [root@aliyun ~]# date -d @1398324600 Thu Apr 24 15:30:00 CST 2014 |
大家可以试试以下2个命令。
1 2 | dmesg -T dmesg -Td |
dmesg 命令
dmesg命令的语法形式是 dmesg [OPTIONS]
,OPTIONS
是 dmesg
命令的选项,可选参数。
在指定任何选项运行 dmesg 命时,dmesg 命令将所有消息从内核环形缓冲区写到标准输出,也就是终端屏幕。
默认情况下,所有用户都可以运行 dmesg 命令。但是,在某些系统上,非 root 用户可能会限制对 dmesg 命令的访问。
在这种情况下,调用 dmesg 时,您将看到错误消息 dmesg: read kernel buffer failed: Operation not permitted。
1 2 | dmesg dmesg: read kernel buffer failed: Operation not permitted |
内核参数 kernel.dmesg_restrict
指定非 root 用户是否可以运行 dmesg 命令查看内核日志缓冲区的消息。
要禁用或者删除此限制,请将其设置为零。运行命令 sudo sysctl -w kernel.dmesg_restrict=0
。
1 | sudo sysctl -w kernel.dmesg_restrict=0 |
通常,dmesg
命令输出包含许多信息记录,因此只能看到输出的最后一部分。要一次查看一页。
请将 dmesg
命令的标准输出通过管道传送到 less
或 more
命令可分页查看 dmesg
命令打印的消息。运行命令 dmesg --color=always | less
。
1 | dmesg --color=always | less |
--color=always
选项用于保留颜色的输出。如果要过滤缓冲区消息,请使用 grep 命令对日志消息进行过滤。
例如,要仅查看与USB相关的消息,请运行命令 dmesg | grep -i usb
。
1 | dmesg | grep -i usb |
dmesg
命令从 /proc/kmsg
虚拟文件中读取内核生成的消息。该文件提供了到内核环形缓冲区的接口,并且只能由一个进程打开。
如果系统上正在运行 syslog
进程,并且您尝试使用 cat
或 less
命令读取文件,则命令将挂起等待 syslog
进程的结束。
syslog
守 护程序将内核消息转储到 /var/log/dmesg
,因此您也可以使用日志文件 /var/log/dmesg
查看内核消息。
1 | cat /var/log/dmesg |
dmesg 格式化输出
dmesg
命令提供了许多选项,可帮助您格式化和过滤输出。dmesg
命令中最常用的选项之一是 -H
/ --human
,dmesg
命令将以友好的阅读格式进行输出。
-H
/ --human
选项还将 dmesg
命令的输出通过管道传递到一个分页器。要打印可读格式的时间戳,请使用-T
/ --ctime
选项。
1 2 3 | dmesg -H dmesg -T [Mon Oct 14 14:38:04 2019] IPv6: ADDRCONF(NETDEV_CHANGE): wlp1s0: link becomes ready |
时间戳格式也可以使用 --time-format <format>
选项设置,可以是 ctime,reltime,delta,notime 或 iso。
例如,要使用增量格式,请运行命令 dmesg --time-format=delta
。您也可以组合两个或多个选项。
要实时查看 dmesg
命令的输出,请使用 -w
/ --follow
选项,例如命令 dmesg -H -T --follow
。
1 2 3 4 | dmesg --time-format=delta dmesg -H -T dmesg -H -T --follow |
dmesg 日志分类与级别
您可以将 dmesg
命令输出限制为指定的分类和等级。dmesg
命令支持分类消息包括。
kern
内核消息。user
用户级消息。mail
邮件系统。daemon
系统守护程序。auth
安全/授权消息。
syslog
内部 syslogd 消息。lpr
行式打印机子系统。news
网络新闻子系统。
dmesg
命令的 -f
/ --facility <list>
项允许您将输出限制为指定的分类。该选项接受一个或多个逗号分隔的分类。
例如,要仅打印内核和系统守护程序消息,可以运行命令 dmesg -f kern,daemon
。
1 | dmesg -f kern,daemon |
每条日志消息都与消息重要性的日志级别相关联。dmesg
命令支持的日志级别包括。
emerg
系统无法使用,alert
必须立即采取措施,crit
紧急情况,err
错误消息。
warn
警告条件。notice
正常但重要的条件。info
信息性。debug
调试级消息。
dmesg
命令的 -l
/ --level <list>
选项将输出限制为指定级别。该选项接受一个或多个逗号分隔的级别类型。
例如仅显示错误和严重消息,请运行命令 dmesg -l err,crit
。
1 | dmesg -l err,crit |
清除环形缓冲区
只有 root或具有 sudo 权限的用户才能清除缓冲区。要在清除之前缓冲区的内容,请使用 -c
/ --read-clear
选项。
如果要在清除文件之前将当前日志保存到文件中,请将 dmesg
命令的输出重定向到文件。
1 2 3 | dmesg > dmesg_messages sudo dmesg -C |
结论
dmesg
命令允许您查看和控制内核环形缓冲区。对内核或硬件问题进行故障排除时,它非常有用。
在终端中输入man dmesg
,获取所有可用于 dmesg
选项的信息。
如果您有任何问题或反馈,请随时发表评论。点击下方阅读原文获取更好排版格式。
参考
https://blog.csdn.net/carefree2005/article/details/120737841