什么是污染的Linux内核?| loading out-of-tree module taints kernel(判断检查taints kernel)

伏业
2023-12-01

问题背景

使用insmod命令加载编写的驱动模块时,出现提示信息:loading out-of-tree module taints kernel。不过,模块还是能够被加载。并且卸载后再次加载时,该提示信息没有再次出现。然而整个系统重启后再加载模块,仍然会出现该提示信息。也就是说,在linux的一次运行期间,加载自己编写的驱动模块时,出现了上述提示信息。

taints 英[teɪnts]
美[teɪnts]
v. 使腐坏; 污染; 玷污,败坏(名声);
n. 腐坏; 污染; 玷污;
[词典] taint的第三人称单数和复数;
[例句]In the fridge, their aroma can taint other foods.
若把洋葱放在冰箱蔬菜层中,它的气味会污染其他食物。

提示信息中的taint是污染的意思,整个提示信息的意思是加载树外模块污染内核。

我们自己写的驱动,并加载到内核。之后的一个时间点,假如内核运行出现了问题。此时不应该向内核开发者反应问题。因为很有可能内核本身没问题,而是这个同学自己写的驱动存在问题,导致了内核的崩溃。

out-of-tree module是说,内核开发者仅仅只审核了位于内核源码树中的代码,因而只对源码树中的代码负责。换句话说,一个被污染的内核出现问题可能不是内核的bug;一个没有被污染的内核的错误报告更可能蕴含内核bug。

什么是受污染的 Linux 内核?

官方文档: https://www.kernel.org/doc/html/latest/admin-guide/tainted-kernels.html
什么是污染的Linux内核?
https://unix.stackexchange.com/questions/118116/what-is-a-tainted-linux-kernel

受污染的内核是处于不受支持状态的内核,因为它不能保证正常运行。大多数内核开发人员会忽略涉及受污染内核的错误报告,社区成员可能会要求您更正污染情况,然后才能继续诊断与内核相关的问题。此外,当内核被污染时,一些调试功能和 API 调用可能会被禁用。

污染状态由一系列标志表示,这些标志表示不能信任内核正常工作的各种原因。内核被污染的最常见原因是从 NVIDIA 或 AMD 加载专有图形驱动程序,在这种情况下,通常可以安全地忽略这种情况。但是,某些导致内核受到污染的情况可能表明存在更严重的问题,例如硬件故障。检查系统日志和设置的特定污点标志以确定问题的根本原因是一个好主意。

Linux 内核文档中提供了更多信息,包括每个污染标志的含义以及如何在报告错误之前对受污染的内核进行故障排除。

下面是可能导致内核被污染的部分条件列表,每个条件都有自己的标志。请注意,某些 Linux 供应商(例如 SUSE)添加了额外的污点标志来指示条件,例如加载由第三方支持而不是由供应商直接支持的模块。

  • 加载专有(或非 GPL 兼容)内核模块。如上所述,这是内核被污染的最常见原因。
  • 暂存驱动程序的使用,它们是内核源代码的一部分,但处于试验阶段,未经过全面测试。
  • 使用未包含在 Linux 内核源代码中的树外模块。
  • 强制加载或卸载模块。如果尝试使用不是为当前版本的内核构建的模块,就会发生这种情况。(Linux 内核模块ABI跨版本不稳定,甚至同一版本的不同配置版本也不稳定。)
  • 在特定不支持的某些硬件配置上运行内核,例如在不支持 SMP 操作的早期 AMD Athlon 处理器上的 SMP(多处理器)内核。
  • 覆盖内核中的ACPI DSDT。这有时需要纠正固件电源管理错误;有关详细信息,请参阅此 Arch Linux wiki 文章。
  • 某些严重的错误情况,例如机器检查异常和内核错误。
  • 内核必须解决的 BIOS、UEFI 或其他系统固件中的某些严重错误。

判断检查taints kernel

加载专有的或非 GPL 兼容的模块或未签名的模块将在运行的内核中设置一个“taint”标志。
在内核日志中检查内核污染状态:

journalctl -k | grep taint

要在运行时检查内核污染状态:

cat /proc/sys/kernel/tainted      // if 0 then kernel is not tainted, else it is.

在以“CPU:”开头的行中检查内核恐慌消息中的内核污染状态
‘Not tainted:’ 如果内核在 kp 事件发生时没有被污染;如果是,那么它将打印 ‘Tainted:’。

 类似资料: