在某些情况下,Linux内核可能会受到污染。例如,将专有的视频驱动程序加载到内核会污染内核。此状况可能在系统日志,内核错误消息(糟糕和紧急情况)中以及通过诸如lsmod之类的工具可见,并且一直保持到系统重新启动为止。

是什么意思?它会影响我使用系统的能力吗,并且会如何影响我的支持选项?

评论

lsmod输出的可能重复项:未污染

@Gilles,我认为您链接到的问题应该合并到这个问题中。另外,一个问题是否是另一个问题的重复也不太明显。

我希望将此问题规范化;请参阅问题的最新编辑。

@MichaelMrozek:1)我没有看到现有的问题,因为不明显的是用户在问“'污染'是什么意思”,和2)措辞上的问题只针对单个命令lsmod 。我写了这个问题和答案以使其更笼统,以便有人问“污染”的意思是什么。

他们本来可以使用比“沾污”更中性的词。

#1 楼

当内核被污染时,意味着它处于社区不支持的状态。大多数内核开发人员将忽略涉及受污染内核的错误报告,社区成员可能会要求您更正污染条件,然后他们才能继续诊断与内核相关的问题。此外,当内核被污染时,某些调试功能和API调用可能会被禁用。

在大多数情况下,涉及专有驱动程序,您可以放心地忽略污染状况,但是某些情况下会导致内核变得污染被污染可能表示严重的系统问题。

该功能旨在确定可能导致难以正确解决内核问题的状况。例如,专有模块的加载会使内核调试输出不可靠,因为内核开发人员无法访问模块的源代码,因此无法确定模块可能对内核做了什么。同样,如果内核以前曾遇到过错误情况,或者发生了严重的硬件错误,则内核生成的调试信息可能并不可靠。

由于多种原因,内核可能会受到污染,包括(但不限于)以下内容:


使用专有的(或非GPL兼容的)内核模块-这是造成内核污染的最常见原因,通常加载专有的NVIDIA或AMD视频驱动程序得到的结果
使用分段驱动程序,该驱动程序是内核源代码的一部分,但未经过全面测试
使用未包含在树外的模块Linux内核源代码
强制加载或卸载内核模块(例如强行插入不是为当前内核版本构建的模块)
在某些不受支持的情况下使用SMP(多处理器)内核单处理器CPU,主要是较旧的AMD Athlon处理器
有时需要改写ACPI DSDT以纠正电源管理错误(请参阅此处以了解详细信息)
某些关键错误条件,例如机器检查异常和内核操作

某些重要错误内核必须解决的系统固件(BIOS,UEFI)

这些条件中的每一个都由内核中的特定标志表示。某些Linux供应商(例如SUSE)添加了附加的taint标志,以指示条件,例如加载供应商不支持的模块。

内核文档中提供了更多信息。此处列出的污点标记(带有_代表“空白”)



G | P:G(如果加载的所有模块均具有GPL或兼容许可证,否则,已加载专有模块。不具有insmod不能识别为GPL兼容的MODULE_LICENSE或具有MODULE_LICENSE的模块被认为是专有的。

F | _:如果任何模块是由“ insmod -f”强制加载的,否则如果全部模块已正常加载。

S | _:如果oops发生在运行SMP内核上,而该SMP内核在未经认证可安全运行多处理器的硬件上运行。当前,这仅发生在不支持SMP的各种Athlon上。

R | _:如果模块是由rmmod -f强制卸载的,否则,如果所有模块都已正常卸载。

M | _:如果有任何处理器报告了机器检查异常,则
否则没有发生机器检查异常。

B | _:如果页面释放功能发现错误的页面引用或某些意外的页面标志。

U | _:如果用户或用户应用程序特别要求设置Tainted标志。

D | _:如果内核已死亡

A | _:如果ACPI表已被覆盖。

W | _:如果先前已发出警告内核(尽管某些警告可能会设置更具体的污点标志。)

C | _:如果已加载登台驱动程序。

I | _:如果内核正在解决平台固件(BIOS或类似版本)中的严重错误。

O | _:如果已加载外部构建的(“树外”)模块。

E | _:如果未签名的模块已加载到支持模块签名的内核中。

L | _:如果以前已在系统上进行过软锁定。

K | _:如果内核已进行实时修补。


评论


这个问题使这个问题失去了答案。

–user56041
18年6月3日在15:51

我将添加至少一个“未签名模块”方案的重要可能性-将内核rootkit加载到内核中或刚刚执行内核利用程序。

– kravietz
18/12/8在22:47

#2 楼

加载专有的或不兼容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:”。
参考:有关受污染内核的Linux内核文档。