dmesg

dmesg的数据

dmesg 并不是从 /var/log/dmesg 文件中读取数据,而是直接从内核的 ring buffer 中直接读取,并输出最近的N个消息。当主机启动过程最后, dmesg 发起一个将启动信息写入 /var/log/dmesg 。一旦在系统中运行了 syslogd rsyslogd ( rsyslog服务 ) 或者 syslog-ng服务 ,这些syslog服务就会从内核缓存(kernel buffer)中读取数据并写入 /var/log/kern.log 这样的文件(基于发行版不同,可能会有其他文件)。只要系统能够写入磁盘,在系统crash之前,日志服务会不断将buffer中信息刷入磁盘日志文件,也就是能够从这些日志中获取系统信息。

常用dmesg命令

  • 默认没有任何参数时, dmesg 将输出所有在 kernel ring buffer 中的消息:

    dmesg
    
  • 为了方便查看,可以结合 less 命令:

    dmesg | less
    
  • 为了显示有关内存,硬盘,usb以及唇口信息,可以分别使用如下命令:

    dmesg | grep -i memory
    dmesg | grep -i dma
    dmesg | grep -i usb
    dmesg | grep -i tty
    

或者合并上述命令:

dmesg | grep -E "memory|dma|ubs|tty"
  • 如果要在读取之后清理掉dmesg日志,可以使用 -C 参数:

    dmesg -C
    

不过,一般没有必要

  • 有用的技巧 : 显示彩色输出信息 -L 参数:

    dmesg -L
    

这个命令参数对于查看错误信息非常有用,特别会看到错误信息或者关键信息使用红色标记出来,非常醒目

  • 只查看 daemon 相关信息:

    dmesg --facility=daemon
    

就能够看到很多和 Systemd进程管理器 相关服务信息,便于集中排查服务问题

上述 --facility 支持的参数有:

  • kern

  • user

  • mail

  • daemon

  • auth

  • syslog

  • lpr

  • news

  • 查看指定级别的信息也是排查问题非常有用的参数,例如 --level=err,warn

    dmesg --level=err,warn
    
  • 时间戳参数 -T 可以显示易于阅读的消息:

    dmesg -T
    

此外,有一个 x 参数结合起来更为方便:

dmesg -Tx

可以看到不同级别信息,例如:

kern  :notice: [Wed Mar 23 15:32:02 2022] RPC: fragment too large: 1949507633
kern  :notice: [Wed Mar 23 15:32:02 2022] RPC: fragment too large: 1949507633
kern  :warn  : [Wed Mar 23 15:32:08 2022] net_ratelimit: 15 callbacks suppressed
kern  :info  : [Wed Mar 23 15:32:08 2022] TCP: tcp_parse_options: Illegal window scaling value 123 > 14 received
kern  :notice: [Wed Mar 23 15:32:32 2022] RPC: fragment too large: 50331667
kern  :notice: [Wed Mar 23 15:32:32 2022] RPC: fragment too large: 50331691
kern  :info  : [Wed Mar 23 15:32:40 2022] TCP: tcp_parse_options: Illegal window scaling value 123 > 14 received
kern  :info  : [Wed Mar 23 15:33:33 2022] TCP: tcp_parse_options: Illegal window scaling value 123 > 14 received
kern  :err   : [Fri Mar 25 11:57:55 2022] ata1.00: exception Emask 0x0 SAct 0x10000000 SErr 0x0 action 0x6 frozen
kern  :err   : [Fri Mar 25 11:57:55 2022] ata1.00: failed command: READ FPDMA QUEUED
kern  :err   : [Fri Mar 25 11:57:55 2022] ata1.00: cmd 60/08:e0:c8:70:11/00:00:20:00:00/40 tag 28 ncq dma 4096 in
                                                   res 40/00:00:00:4f:c2/00:00:00:00:00/00 Emask 0x4 (timeout)
kern  :err   : [Fri Mar 25 11:57:55 2022] ata1.00: status: { DRDY }
kern  :info  : [Fri Mar 25 11:57:55 2022] ata1: hard resetting link
kern  :info  : [Fri Mar 25 11:57:55 2022] ata1: SATA link up 6.0 Gbps (SStatus 133 SControl 300)
kern  :info  : [Fri Mar 25 11:57:55 2022] ata1.00: configured for UDMA/133
kern  :info  : [Fri Mar 25 11:57:55 2022] ata1: EH complete
kern  :info  : [Fri Mar 25 11:57:55 2022] ata1.00: Enabling discard_zeroes_data
kern  :err   : [Fri Mar 25 11:59:30 2022] ata1.00: exception Emask 0x0 SAct 0x1000000 SErr 0x0 action 0x6 frozen
kern  :err   : [Fri Mar 25 11:59:30 2022] ata1.00: failed command: READ FPDMA QUEUED
kern  :err   : [Fri Mar 25 11:59:30 2022] ata1.00: cmd 60/08:c0:40:65:5a/00:00:00:00:00/40 tag 24 ncq dma 4096 in
                                                   res 40/00:01:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
kern  :err   : [Fri Mar 25 11:59:30 2022] ata1.00: status: { DRDY }
  • 实时系统信息输出,可以使用参数 --follow ,结合上面的 -Tx 参数,对于观察不断输出的系统日志非常方便:

    dmesg -Tx --follow
    

参考