dmesg 的功能:喷kernel log
dmesg 是一个用于显示系统内核环形缓冲区(ring buffer)中的信息的命令工具。它可以输出内核在启动过程中或运行过程中产生的各种消息,这些消息通常用于调试、诊断系统问题、查看硬件设备状态和跟踪内核日志。dmesg 输出的信息包括内核启动时的各种事件、硬件设备的加载、驱动程序的初始化、内核模块的加载、错误、警告信息等。
dmesg 的常用选项
dmesg -C:清空内核缓冲区。
dmesg -c:清空缓冲区并显示当前的内核消息。
dmesg -H:输出具有时间戳的内核消息。
dmesg -T:将时间戳转换为可读格式,通常以 YYYY-MM-DD HH:MM:SS 形式显示。
dmesg -l level:显示指定级别的日志消息(例如 -l err 只显示错误消息)。
dmesg | grep <pattern>:结合 grep 使用,过滤出与特定模式匹配的日志信息。
平时最常用的是dmesg -w,它会不断地输出新的内核日志条目
dmesg 输出内容解释
dmesg 输出的每一行通常包含以下几部分内容:
时间戳:表示消息发生的时间,通常是内核启动后的时间(秒)。可以通过 -T 选项将其转换为可读的日期格式。
示例:[ 0.000000] 表示消息在系统启动后的第 0 秒。
消息级别:包括不同的日志级别,如信息(INFO)、警告(WARNING)、错误(ERROR)等。
内核消息内容:内核生成的详细信息,如硬件检测、驱动加载、内存分配、错误日志等。
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 5.4.0-42-generic (buildd@lamiak) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #46-Ubuntu SMP Thu Jul 16 09:29:24 UTC 2020
[ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-5.4.0-42-generic root=UUID=42f1f90c-8e5f-4f0e-8a2d-b76bbf1e6247 ro quiet splash
[ 0.000000] Kernel command line: BOOT_IMAGE=/vmlinuz-5.4.0-42-generic root=UUID=42f1f90c-8e5f-4f0e-8a2d-b76bbf1e6247 ro quiet splash
[ 0.030000] printk: console [tty0] enabled
[ 0.070000] ACPI: Core revision 20190912
[ 0.070000] ACPI: All ACPI Tables successfully acquired
dmesg.c简化版demo
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <time.h>
#define KMSG_PATH "/dev/kmsg"
int main(int argc, char *argv[]) {
int fd;
char buf[4096];
ssize_t len;
// 打开内核消息缓冲区
fd = open(KMSG_PATH, O_RDONLY);
if (fd == -1) {
perror("Failed to open /dev/kmsg");
return 1;
}
// 从内核消息缓冲区中读取数据并输出
while ((len = read(fd, buf, sizeof(buf) - 1)) > 0) {
buf[len] = '\0'; // 确保字符串以 '\0' 结尾
printf("%s", buf); // 输出读取到的内核日志
}
if (len == -1) {
perror("Failed to read from /dev/kmsg");
}
close(fd); // 关闭文件描述符
return 0;
}