目录
- 1 dmesg命令
- 1.1 简介
- 1.2 说明
- 1.3 案例
- 1、显示所有内核消息
- 2、实时监控新消息
- 3、显示特定级别的消息
- 4、将消息输出到文件
- 5、搜索包含特定字符串的被检测到的硬件
- 6、将开机信息发邮件
- 7、打印并清除内核环形缓冲区
- 总结
1 dmesg命令
1.1 简介
dmesg 命令在 Linux 系统中用于显示和控制内核的环形缓冲区,内核在启动过程中会将信息存储在这个缓冲区中。使用 dmesg 可以有效诊断机器硬件故障或者添加硬件出现的问题。另外,使用 dmesg 可以确定服务器安装了哪些硬件。每次系统重启,系统都会检查所有硬件并将信息记录下来。
执行/bin/dmesg 命令可以查看该记录,开机信息会保存在/var/log/dmesg文件里。
1.2 说明
使用:
dmesg [options]
dmesg --clear
dmesg --read-clear [options]
dmesg --console-level level
dmesg --console-on
dmesg --console-off
常用参数:
- -C, --clear:清除环形缓冲区。
- -c, --read-clear:在首次打印其内容后,清除环形缓冲区。
- -D, --console-off:禁用向控制台打印消息。
- -d, --show-delta显示时间戳以及消息之间的时间差。如果与 --notime 一起使用,则只打印时间差而不打印时间戳。
- -E, --console-on:启用向控制台打印消息。
- -e, --reltime:以人类可读的格式显示本地时间和时间差。需要注意的是,转换为本地时间可能不准确
- -F, --file file:从给定的文件中读取syslog消息。注意,-F不支持kmsg格式的消息,仅支持旧的syslog格式。
- -f, --facility list:限制输出到给定的(逗号分隔)设施列表。例如:dmesg --facility=daemon 仅打印来自系统守护进程的消息。
- -H, --human:启用人类可读的输出。
- -k, --kernel:打印内核消息。
- -L, --color[=when]:为输出添加颜色。可选参数when可以是auto、never或always。如果省略when参数,则默认为auto。颜色可以被禁用。
- -l, --level list:限制输出到给定的(逗号分隔)级别列表。例如:dmesg --level=err,warn 仅打印错误和警告消息。
- -n, --console-level level:设置向控制台打印消息的级别。级别可以是一个级别编号或级别名称的缩写。例如,-n 1或-n emerg将阻止除紧急(panic)消息外的所有消息出现在控制台上。所有级别的消息仍然写入/proc/kmsg,因此syslogd(8)仍然可以用来控制内核消息的确切显示位置。当使用-n选项时,dmesg不会打印或清除内核环形缓冲区。
- -P, --nopager:不将输出通过分页器。对于–human输出,分页器是默认启用的。
- -p, --force-prefix:为每条多行消息添加设施、级别或时间戳信息。
- -r, --raw:打印原始的消息缓冲区,即不删除日志级别前缀,但所有不可打印的字符仍然会进行转义。
- -S, --syslog:强制dmesg使用syslog(2)内核接口来读取内核消息。自内核3.5.0以来,默认使用/dev/kmsg而不是syslog(2)。
- -s, --buffer-size size:使用指定大小的缓冲区来查询内核环形缓冲区。默认值是16392。(默认的内核syslog缓冲区大小最初是4096,自1.3.54版本起是8192,自2.1.113版本起是16384。)如果已将内核缓冲区设置为大于默认值,则可以使用此选项来查看整个缓冲区。
- -T, --ctime:打印人类可读的时间戳。
- –until time:显示直到指定时间为止的记录。时间可以以绝对方式指定,也可以通过相对符号(例如’1 hour ago’)指定。请注意,时间戳可能不准确,并参见–ctime以获取更多详细信息。
- -t, --notime:不打印内核的时间戳。
- –time-format format:使用给定的格式打印时间戳,可以是ctime、reltime、delta或iso。前三种格式是特定时间格式选项的别名。
- -u, --userspace:打印用户空间消息。
- -w, --follow:等待新消息。此功能仅支持具有可读/dev/kmsg的系统(自内核3.5.0起)。
- -W, --follow-new:等待并仅打印新消息。
- -x, --decode:将设施和级别(优先级)的数字解码为人类可读的前缀。
- -V, --version:显示版本信息并退出。
- -h, --help:显示帮助文本并退出。
1.3 案例
1、显示所有内核消息
dmesg
######## 下面是日志中的一条信息
[ 8992.951812] e1000: ens33 NIC Link is Down
### 参数解释:
[ 8992.951812]:时间戳,表示从系统启动开始到这条消息被记录的时间。在这个例子中,系统已经运行了大约 8999 秒(超过 2 个小时和 28 分钟),然后记录了这条消息。
e1000:驱动程序的名称,e1000 是 Intel PRO/1000 网络适配器系列的内核驱动程序。这表明日志消息与 Intel PRO/1000 系列网卡相关。
ens33:网络接口的名称,通常在 Linux 系统中,ens 开头的接口表示系统上的一个或多个以太网适配器。数字 33 表示这是系统中的第 33 个网络接口,或者它是系统中的第二个接口(因为数字通常从 0 开始计数)。
NIC Link is Down:NIC(网络接口卡)的 "Link" 状态是 "Down",意味着网络连接没有建立。这可能是由于物理连接问题(如网线未插好)、网络配置问题、或者网络设备(如交换机或路由器)的故障。
2、实时监控新消息
dmesg -w
# 持续运行,不会立马退出
3、显示特定级别的消息
dmesg -l err
# 只显示错误级别消息
[ 7.922021] piix4_smbus 0000:00:07.3: SMBus Host Controller not enabled!
[ 8.886949] sd 32:0:0:0: [sda] Assuming drive cache: write through
[ 8.895433] sd 32:0:1:0: [sdb] Assuming drive cache: write through
[ 18.545139] [drm:drm_crtc_commit_wait [drm]] *ERROR* flip_done timed out
[ 18.545223] [drm:drm_atomic_helper_wait_for_dependencies [drm_kms_helper]] *ERROR* [CRTC:38:crtc-0] commit wait timed out
[ 28.783596] [drm:drm_crtc_commit_wait [drm]] *ERROR* flip_done timed out
[ 28.783676] [drm:drm_atomic_helper_wait_for_dependencies [drm_kms_helper]] *ERROR* [PLANE:34:plane-0] commit wait timed out
4、将消息输出到文件
dmesg > a
# 将消息保存到文件a中
5、搜索包含特定字符串的被检测到的硬件
#查看硬盘的运行模式
dmesg | grep DMA
##### 输出
[ 8.341751] ata31: SATA max UDMA/133 abar m4096@0xfd5be000 port 0xfd5bef00 irq 56
# 解释:
## ata31:这是第一个 SATA 控制器的设备标识。
# SATA max UDMA/133:表示该 SATA 控制器支持最大 UDMA(Ultra DMA)模式 133,这是 SATA 1.0 标准的一部分,支持最高传输速率 1.5 Gbps。
# abar m4096@0xfd5be000:表示该设备的基地址寄存器(abar)被映射到物理内存地址 0xfd5be000,映射大小为 4096 字节。
# port 0xfd5bef00:表示该控制器的端口地址是 0xfd5bef00。
irq 56:表示该设备使用中断请求(IRQ)号 56。[ 8.666784] ata4.00: ATAPI: VMware Virtual SATA CDRW Drive, 00000001, max UDMA/33
# ata4.00:这是连接到第一个 SATA 控制器的第一个设备的设备标识。
# ATAPI:表示该设备是一个 ATAPI(Advanced Technology Attachment Packet Interface)设备,通常用于 CD/DVD 驱动器。
# VMware Virtual SATA CDRW Drive:表明这是一个 VMware 虚拟机中的虚拟 SATA CD-RW 驱动器。
# 00000001:设备的固件或硬件修订号。
# max UDMA/33:表示该设备支持最大 UDMA 模式 33,这是一个较旧的标准,最高传输速率为 33 Mbps。[ 8.667335] ata4.00: configured for UDMA/33
# 这条消息表明 ata4.00 设备已被配置为使用 UDMA 模式 33# 查看以太网的连接信息
dmesg | grep eth
#######
[ 9.032667] e1000 0000:02:01.0 ens33: renamed from eth0[ 134.563225] br-b2a8a00701d0: port 1(vetha52f8ac) entered disabled state
# br-b2a8a00701d0:这通常是一个网桥设备的标识符,br 表示它是网桥(bridge)设备。
# port 1:表示这是网桥设备的第一个端口。
# (vetha52f8ac):这是与网桥端口关联的虚拟以太网设备(veth)的标识符。
# entered disabled state:表示 vetha52f8ac 设备已经进入了禁用状态,可能是因为网络配置更改或其他原因导致设备不再传输数据。[ 134.563843] device vetha52f8ac entered promiscuous mode
# device vetha52f8ac:再次提到了之前禁用的虚拟以太网设备。
# entered promiscuous mode:表示 vetha52f8ac 设备进入了混杂模式(promiscuous mode)。在混杂模式下,网络设备会接收所有经过的数据包,而不仅仅是发往本机地址的数据包。这通常用于网络监控或路由设备[ 137.655590] eth0: renamed from veth15bd933
# 这条消息表明原来的虚拟以太网设备 veth15bd933 被重命名为 eth0
# 这些日志消息通常出现在虚拟化环境中,如使用 Docker 或 Kubernetes 等容器化技术时。在这些环境中,虚拟网络设备(如 veth 对)用于在宿主机和容器之间或容器与容器之间创建网络连接。#查看硬盘设备
dmesg | grep sda
######
[ 51.829348] EXT4-fs (sda3): mounted filesystem with ordered data mode. Opts: (null). Quota mode: none.
# EXT4-fs (sda3):表示系统正在处理名为 sda3 的 EXT4 文件系统。sda 是指系统中的第一个 SATA 硬盘,3 表示硬盘上的第三个分区。
# mounted filesystem:表示文件系统正在被挂载。
# with ordered data mode:这是指文件系统挂载时使用的特定挂载模式。在这种模式下,文件系统的元数据(如目录结构和文件属性)将在数据之前被写入磁盘,这有助于防止数据损坏和确保文件系统的一致性。
# Opts: (null):表示没有额外的挂载选项被使用。
# Quota mode: none:表示文件系统没有启用磁盘配额功能,即没有限制用户或组可以使用的磁盘空间量。[ 53.146690] EXT4-fs (sda3): re-mounted. Opts: (null). Quota mode: none.
# 这条消息表明 sda3 分区被重新挂载。这可能发生在系统启动过程中,或者在系统运行时由于某些原因(如系统升级或维护操作)导致的文件系统卸载和重新挂载。
# 其余信息与第一条消息相同,表明挂载选项和配额模式没有变化。
[ 55.910052] EXT4-fs (sda2): mounted filesystem with ordered data mode. Opts: (null). Quota mode: none.
# 类似于第一条消息,这条消息描述了 sda2 分区的挂载过程,它也是使用有序数据模式挂载,没有额外的挂载选项,并且没有启用磁盘配额。#查看串口的相关信息
dmesg | grep ttyS*
######
[ 0.906478] printk: console [tty0] enabled
# printk:这是 Linux 内核的日志打印功能。
# console [tty0]:表示系统控制台输出被配置为 tty0 设备。在 Linux 系统中,tty0 通常是指第一个虚拟控制台,它在物理控制台上提供文本模式登录。
# enabled:表示控制台输出已经被启用,系统日志和启动信息将会显示在物理控制台上。[ 2.472713] 00:05: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
# 00:05:这是设备在系统总线上的位置标识,通常用于标识 PCI 设备。
# ttyS0:表示这是一个串行端口设备,通常用于串行通信。ttyS0 通常是系统中的第一个串行端口。
# at I/O 0x3f8:表示该串行端口在系统的 I/O 地址空间中位于 0x3f8 地址。
# irq = 4:表示该串行端口使用中断请求(IRQ)号 4。
# base_baud = 115200:表示串行端口的基础波特率设置为 115200。波特率是数据传输速率的度量,这里表示每秒传输 115200 个信号单位。
# is a 16550A:表示该串行端口遵循 16550A 标准,这是一种常见的串行通信接口标准,提供了更高的性能和更多的功能。#查看内存状况
dmesg | grep -i memory
######
[ 0.575944] Memory: 2887444K/3145204K available (16393K kernel code, 4395K rwdata, 10880K rodata, 3352K init, 18716K bss, 257500K reserved, 0K cma-reserved)
# Memory: 2887444K/3145204K available:表示系统当前有大约 2887444KB(约 2.72 GB)的内存可用,总共有 3145204KB(约 2.96 GB)的内存,其中一部分已经被占用。
# 16393K kernel code:内核代码占用了大约 16393KB(约 16.06 MB)的内存。
# 4395K rwdata:可读写数据段占用了大约 4395KB(约 4.25 MB)的内存。
# 10880K rodata:只读数据段占用了大约 10880KB(约 10.55 MB)的内存。
# 3352K init:初始化数据占用了大约 3352KB(约 3.21 MB)的内存。
# 18716K bss:未初始化的数据段(bss)占用了大约 18716KB(约 18.08 MB)的# 内存。
# 257500K reserved:保留内存大约 257500KB(约 248.53 MB),这部分内存被标记为不可用,通常用于硬件设备或其他系统需求。
# 0K cma-reserved:没有内存被保留给 CMA(Contiguous Memory Allocator),这是一个用于分配大块连续内存的内核特性。
[ 0.941328] Freeing SMP alternatives memory: 44K
# 这条消息表明系统释放了 44KB 的内存,这些内存原本是为了对称多处理(SMP)系统中的备用处理器准备的。
[ 0.986220] x86/mm: Memory block size: 128MB
# 这表示系统内存管理中的一个内存块大小为 128MB。
[ 7.223828] Freeing initrd memory: 107100K
# initrd 是初始内存盘(initramdisk),用于系统启动时加载必要的驱动和服务。这条消息表明系统释放了 107100KB(约 103.68 MB)的 initrd 内存。[ 7.375331] Freeing unused kernel image (rodata/data gap) memory: 1408K
# 这条消息表明系统释放了 1408KB(约 1.37 MB)未使用的内核镜像内存,这可能是由于内核的只读数据段和数据段之间存在间隙。
[ 8.131759] [TTM] Zone kernel: Available graphics memory: 1501844 KiB
# TTM(Translation Table Maps)是内核中用于管理图形内存的系统。这条消息表明有大约 1501844KiB(约 1446.14 MB)的图形内存可用。
[ 8.132277] vmwgfx 0000:00:0f.0: [drm] Legacy memory limits: VRAM = 4096 kB, FIFO = 256 kB, surface = 0 kB
# vmwgfx 是 VMware 的虚拟图形设备。这条消息表明,对于这个设备,传统的内存限制设置为:视频随机存取内存(VRAM)为 4096 kB(约 4 MB),FIFO(先进先出缓冲区)为 256 kB(约 0.25 MB),表面(surface)内存为 0 kB。
# 这些限制是图形硬件用来存储帧缓冲区、命令缓冲区和其他图形相关数据的内存区域。
[ 8.132328] vmwgfx 0000:00:0f.0: [drm] Maximum display memory size is 262144 kiB
# 这条消息表明,使用 DRM(Direct Rendering Manager)系统的 vmwgfx 设备的最大显示内存大小为 262144 kiB(约 256 MB)。#查看usb接口
dmesg | grep -i usb
#######
[ 9.999485] usbcore: registered new interface driver usbhid
[ 10.001329] usbhid: USB HID core driver
[ 10.068290] input: VMware VMware Virtual USB Mouse as /devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-1/2-1:1.0/0003:0E0F:0003.0001/input/input5
[ 10.071315] hid-generic 0003:0E0F:0003.0001: input,hidraw0: USB HID v1.10 Mouse [VMware VMware Virtual USB Mouse] on usb-0000:02:00.0-1/input0
[ 55.252967] usbcore: registered new interface driver btusb#探测系统内核模块,检测ACPI的加载情况
dmesg |egrep -i "(apm|acpi)"
######
[ 1.929479] ACPI: PCI: Interrupt link LNKD configured for IRQ 7
[ 1.958956] ACPI: bus type USB registered
[ 1.965893] PCI: Using ACPI for IRQ routing
[ 2.113252] pnp: PnP ACPI init
[ 2.143049] pnp: PnP ACPI: found 7 devices
[ 2.180417] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns
[ 2.442210] ACPI: AC: AC Adapter [ACAD] (on-line)
[ 2.443001] ACPI: button: Power Button [PWRF]
6、将开机信息发邮件
dmesg >boot.messages
mail -s "Boot Log of Linux Server" admin@local.com <boot.messages
7、打印并清除内核环形缓冲区
dmesg -c
总结
以上的案例及案例中的输出内容只是内核信息中的一小部分,更多内容需要我们继续深入学习。