如何检查 Linux 内核是否存在污染标志

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本次实验中,你将学习如何检查 Linux 内核的污染状态。我们将通过检查 /proc/sys/kernel/tainted 文件,来探究如何判断内核是否运行在可能不受支持或已被修改的状态。

在完成初步检查后,你将学习如何使用 dmesg 命令检查内核消息缓冲区,以验证内核被污染的具体原因。最后,你将探索如何使用 /proc/kallsyms 检查内核符号,这有助于你了解内核的状态和已加载的模块。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") subgraph Lab Skills linux/cat -.-> lab-558725{{"如何检查 Linux 内核是否存在污染标志"}} linux/grep -.-> lab-558725{{"如何检查 Linux 内核是否存在污染标志"}} end

使用 cat /proc/sys/kernel/tainted 检查污染状态

在这一步中,你将学习如何检查 Linux 内核的“污染”状态。如果加载了非 GPL(通用公共许可证)模块,或者发生了某些可能表明存在问题或非标准配置的事件,内核就会被“污染”。检查污染状态是一种快速判断内核是否运行在可能不受支持或已被修改状态的方法。

你可以通过读取 /proc 文件系统中一个特殊文件的内容来检查内核的污染状态。/proc 文件系统是一个虚拟文件系统,它提供有关进程和其他系统信息。

如果终端尚未打开,请打开它。你可以通过点击桌面左侧的 Xfce Terminal 图标来打开终端。

现在,使用 cat 命令显示 /proc/sys/kernel/tainted 文件的内容。cat 命令用于连接并显示文件内容。

输入以下命令并按回车键:

cat /proc/sys/kernel/tainted

输出将是一个单独的数字。

0
  • 值为 0 表示内核未被污染。
  • 任何非零值都表示内核已被污染。具体的数字是一个位掩码,其中每一位代表一个不同的污染原因。

例如,如果输出为 1,则表示加载了专有模块。如果为 4,则可能表示发生了内核警告。

在我们的 LabEx 环境中,内核最初应该未被污染,因此你应该看到 0。这是一个好迹象,表明内核状态正常。

了解污染状态对于调试内核问题或确保你运行的是标准内核配置非常重要。

点击 Continue 进入下一步。

dmesg 中验证污染详情

在上一步中,我们使用 /proc/sys/kernel/tainted 检查了内核的污染状态。虽然该文件会给出一个数字代码,表明内核是否被污染,但它并未说明内核“为何”被污染。若要获取有关内核消息的更详细信息,包括污染原因,你可以使用 dmesg 命令。

dmesg 命令用于查看内核环形缓冲区。该缓冲区存储着来自内核的消息,包括设备驱动信息、错误和警告。当内核被污染时,通常会在环形缓冲区中记录一条消息,解释污染的原因。

如果终端尚未打开,请打开它。

现在,输入以下命令并按回车键:

dmesg

此命令可能会输出大量文本,显示系统启动以来的所有内核消息。

为了找到与污染相关的特定信息,你可以将 dmesggrep 命令结合使用。grep 是一个强大的文本模式搜索工具。我们将搜索包含“taint”一词的行。

输入以下命令并按回车键:

dmesg | grep taint

| 符号称为管道。它将左侧命令(dmesg)的输出作为输入传递给右侧命令(grep)。因此,此命令首先获取所有内核消息,然后对其进行过滤,只显示包含“taint”一词的行。

如果你的内核未被污染(在本环境中预计如此),此命令可能不会产生任何输出。这是正常现象,表明没有记录到污染事件。

如果内核确实被污染了,你会看到类似以下的行(确切的消息取决于污染的原因):

[  ... ] kernel: Linux version ... (tainted: G)
[  ... ] kernel: Disabling lock debugging due to kernel taint

(tainted: G) 部分表示内核已被污染,字母 G 具体表示加载了专有模块。其他字母表示不同的污染原因(例如,P 表示专有模块,F 表示强制加载模块,R 表示受限许可证模块等)。

/proc/sys/kernel/tainted 显示非零值时,使用 dmesg | grep taint 是诊断内核问题的关键步骤。

点击 Continue 继续。

使用 cat /proc/kallsyms 检查内核符号

在这一步中,我们将探索 /proc 文件系统中的另一个重要文件:/proc/kallsyms。该文件包含了所有未显式标记为 static 的内核符号(函数和变量)的地址和名称。它是进行内核调试以及了解内核内部工作原理的重要工具。

/proc/kallsyms 文件会列出每个内核符号的内存地址、类型和名称。每行的格式通常为:

<address> <type> <symbol_name>
  • <address>:符号所在的内存地址。
  • <type>:一个单字符,表示符号的类型(例如,tT 表示文本/代码,dD 表示数据,bB 表示 BSS,rR 表示只读数据,wW 表示弱符号,U 表示未定义符号)。小写字母表示局部符号,大写字母表示全局符号。
  • <symbol_name>:内核函数或变量的名称。

如果终端尚未打开,请打开它。

现在,让我们使用 cat 命令查看 /proc/kallsyms 的内容。请注意,这个文件非常大,因此输出会快速滚动。

输入以下命令并按回车键:

cat /proc/kallsyms

你会看到一长串的行,每行代表一个内核符号。

...
ffffffff... T sys_read
ffffffff... T sys_write
ffffffff... D jiffies
...

为了使输出更易于管理并查找特定符号,我们可以再次使用 grep。例如,让我们搜索与“schedule”相关的符号,“schedule”是内核中用于管理进程的核心函数。

输入以下命令并按回车键:

cat /proc/kallsyms | grep schedule

这将过滤输出,只显示包含“schedule”一词的行。

ffffffff... T schedule
ffffffff... T schedule_timeout
ffffffff... T schedule_hrtimeout_range
...

这种经过过滤的输出更易于阅读,使你能够找到你可能感兴趣的特定内核函数或变量的地址和类型。

探索 /proc/kallsyms 可以让你深入了解内核的结构和可用函数。对于进行内核开发或高级调试的人来说,它是一个基础资源。

你现在已经学会了如何使用 /proc 文件系统和基本的 Linux 命令来检查内核的污染状态并查看内核符号。

点击 Continue 完成本次实验。

总结

在本次实验中,我们学习了如何检查 Linux 内核的污染状态。首先,我们使用 cat /proc/sys/kernel/tainted 命令快速判断内核是否被污染,了解到值为 0 表示内核处于干净状态,任何非零值都表示内核已被污染,具体的数字代表污染原因的位掩码。

接着,我们通过使用 dmesg 检查内核消息缓冲区来验证污染的详细信息。这使我们能够查看与导致内核被污染的事件相关的具体消息,比单纯的数字代码提供了更多的上下文信息。最后,我们探索了如何使用 cat /proc/kallsyms 检查内核符号,这对于高级调试和了解内核的内部状态很有用,不过在提供的内容中这一步并未详细展开。