文章目录
1. dmesg 命令
一. 介绍
dmesg
(display message 或 display driver message 的缩写)是 Linux 和类 Unix 操作系统中的一个命令行工具,用于显示和控制内核环形缓冲区中的消息。这些消息是由内核在系统启动和运行过程中生成的,包含了关于硬件检测、驱动程序加载、系统资源分配、设备错误以及其他内核级别事件的详细信息。
内核环形缓冲区是 Linux 操作系统内核中用于存储系统消息的一种数据结构。这些消息通常包括系统启动信息、硬件检测状态、驱动程序加载情况、系统运行时发生的警告或错误等关键信息。dmesg
命令是显示和控制内核环形缓冲区中消息的主要工具。
内核环形缓冲区的特点
- 环形结构:环形缓冲区具有固定的有限大小,当新的消息到来时,如果缓冲区已满,则会覆盖最旧的消息。这种结构保证了在有限的内存空间中,能够持续记录新的系统消息。
- 索引管理:环形缓冲区通常使用两个索引来管理消息的存储和读取。一个索引(通常称为“head”)用于指示生产者(即内核)将新消息插入缓冲区的位置;另一个索引(通常称为“tail”)用于指示消费者从缓冲区中读取消息的位置。
- 高效性:由于环形缓冲区的大小是2的幂次方,因此可以使用位运算来快速计算索引的位置,从而提高消息存储和读取的效率。
二. 主要功能
-
显示内核消息:
dmesg
可以显示内核环形缓冲区中的所有消息。这些消息对于了解系统启动过程、硬件识别和配置、驱动程序行为等方面非常有用。 -
过滤和搜索消息:通过结合使用
grep
等文本搜索工具,用户可以轻松过滤和搜索特定的内核消息,以便快速定位感兴趣的信息。 -
显示时间戳:使用
-T
选项,dmesg
可以为每条消息添加时间戳,帮助用户了解消息发生的时间顺序。 -
设置日志级别:通过
-n
选项,用户可以设置dmesg
显示的日志级别,从而只查看特定级别的消息(如错误、警告等)。 -
清空内核消息:使用
-C
选项,dmesg
可以清空内核环形缓冲区中的所有消息。但请注意,这通常只在调试或特定情况下使用,因为清空消息后,将无法再查看之前的信息。
三. dmesg 使用
查询tty相关信息
sudo dmesg -T | grep tty
2. 查看kmsg文件
在 Linux 操作系统中,/dev/kmsg
是一个特殊的设备文件,它提供了一个接口来访问内核环形缓冲区中的消息。与 dmesg
命令不同,/dev/kmsg
通常用于更底层或更持续的内核消息访问。
/dev/kmsg
的用途
-
实时访问内核消息:
/dev/kmsg
允许用户空间程序(如日志守护进程或调试工具)实时读取内核生成的消息。- 这对于需要持续监控内核日志的系统管理员或开发人员来说非常有用。
-
持久化内核消息:
- 在系统启动过程中,
/dev/kmsg
可以被用作初始化日志记录的目标,直到更高级的日志系统(如syslog
)完全启动。 - 通过将
/dev/kmsg
的输出重定向到文件或其他日志系统,可以确保内核消息在系统启动期间也被持久化。
- 在系统启动过程中,
-
调试和故障排除:
- 在调试内核问题或硬件问题时,
/dev/kmsg
提供了一个直接访问内核日志的接口。 - 通过读取
/dev/kmsg
,开发人员可以获取关于系统启动、硬件检测、驱动程序加载等关键事件的详细信息。
- 在调试内核问题或硬件问题时,
使用 /dev/kmsg
-
读取消息:
- 可以使用
cat
、tail -f
或其他文件读取命令来查看/dev/kmsg
中的内容。 - 例如,
tail -f /dev/kmsg
会实时显示内核消息,类似于dmesg -w
。
- 可以使用
-
写入消息:
- 通常,用户空间程序不会直接写入
/dev/kmsg
,因为这是内核消息的输出接口。 - 然而,在某些情况下(如内核调试),可能会通过特定的内核机制(如
printk
)向/dev/kmsg
写入消息。
- 通常,用户空间程序不会直接写入
-
权限:
- 访问
/dev/kmsg
通常需要超级用户权限,因为它包含敏感的内核信息。 - 使用
sudo
或以 root 用户身份运行命令是访问/dev/kmsg
的常见方式。
- 访问
与 dmesg
的关系
dmesg
命令实际上是通过读取/dev/kmsg
来获取内核消息的。dmesg
提供了对内核消息的更高层次封装和格式化输出,使其更易于阅读和理解。- 相比之下,
/dev/kmsg
提供了更原始和底层的访问方式,适用于需要直接处理内核消息的场景。
总之,/dev/kmsg
是 Linux 操作系统中一个重要的接口,它允许用户空间程序实时访问内核环形缓冲区中的消息。这对于系统管理员、开发人员和故障排除人员来说是一个非常有价值的工具。
3. 内核日志消息的打印行为
/proc/sys/kernel/printk
是 Linux 内核中一个重要的文件,它用于控制内核日志消息的打印行为。这个文件包含了四个整数值,这些值定义了内核日志消息的优先级、默认级别以及控制台日志级别的限制。
以下是这四个值的详细解释:
-
控制台日志级别(Console Log Level):
- 这个值决定了哪些优先级的日志消息可以被打印到控制台(即终端或屏幕)。
- 只有优先级高于或等于此值的消息才会被显示。
- 数值越小,优先级越高,表示只有更紧急或更严重的消息才会被打印。
-
默认的消息日志级别(Default Message Log Level):
- 当使用
printk
函数打印日志消息且未指定优先级时,将使用此级别。 - 这个值定义了在没有明确指定优先级的情况下,日志消息的默认优先级。
- 当使用
-
最低的控制台日志级别(Minimum Console Log Level):
- 这个值设置了控制台日志级别的下限(即最高优先级)。
- 即使控制台日志级别被设置为一个更高的值(表示显示更多消息),这个下限也会确保不会显示低于此优先级的消息。
-
默认的控制台日志级别(Default Console Log Level):
- 这个值通常用于系统启动时设置控制台日志级别的默认值。
- 它可能不会在运行时被修改,因为系统启动后的日志级别通常由其他机制(如命令行参数或系统配置文件)控制。
要查看当前 /proc/sys/kernel/printk
的值,可以使用以下命令:
cat /proc/sys/kernel/printk
这将输出四个整数值,分别对应上述四个设置。
要修改这些值,可以使用 echo
命令将新的值写入该文件。例如,要将控制台日志级别设置为 1,默认消息日志级别设置为 4,最低控制台日志级别设置为 1,默认控制台日志级别设置为 7,可以使用以下命令:
echo "1 4 1 7" > /proc/sys/kernel/printk