.. include:: ../disclaimer-zh_CN.rst :Original: :doc:`../../../admin-guide/tainted-kernels` :译者: å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> å—æ±¡æŸ“çš„å†…æ ¸ ------------- 当å‘生一些在ç¨åŽè°ƒæŸ¥é—®é¢˜æ—¶å¯èƒ½ç›¸å…³çš„äº‹ä»¶æ—¶ï¼Œå†…æ ¸ä¼šå°†è‡ªå·±æ ‡è®°ä¸ºâ€œå—污染 (tainted)â€çš„。ä¸ç”¨å¤ªè¿‡æ‹…心,大多数情况下è¿è¡Œå—æ±¡æŸ“çš„å†…æ ¸æ²¡æœ‰é—®é¢˜ï¼›è¿™äº›ä¿¡æ¯ ä¸»è¦åœ¨æœ‰äººæƒ³è°ƒæŸ¥æŸä¸ªé—®é¢˜æ—¶æ‰æœ‰æ„ä¹‰çš„ï¼Œå› ä¸ºé—®é¢˜çš„çœŸæ£åŽŸå› å¯èƒ½æ˜¯å¯¼è‡´å†…æ ¸å—污染 的事件。这就是为什么æ¥è‡ªå—æ±¡æŸ“å†…æ ¸çš„ç¼ºé™·æŠ¥å‘Šå¸¸å¸¸è¢«å¼€å‘äººå‘˜å¿½ç•¥ï¼Œå› æ¤è¯·å°è¯•ç”¨ 未å—æ±¡æŸ“çš„å†…æ ¸é‡çŽ°é—®é¢˜ã€‚ 请注æ„,å³ä½¿åœ¨æ‚¨æ¶ˆé™¤å¯¼è‡´æ±¡æŸ“çš„åŽŸå› ï¼ˆäº¦å³å¸è½½ä¸“æœ‰å†…æ ¸æ¨¡å—)之åŽï¼Œå†…æ ¸ä»å°†ä¿æŒ 污染状æ€ï¼Œä»¥è¡¨ç¤ºå†…æ ¸ä»ç„¶ä¸å¯ä¿¡ã€‚è¿™ä¹Ÿæ˜¯ä¸ºä»€ä¹ˆå†…æ ¸åœ¨æ³¨æ„到内部问题(“kernel bugâ€ï¼‰ã€å¯æ¢å¤é”™è¯¯ï¼ˆâ€œkernel oopsâ€ï¼‰æˆ–ä¸å¯æ¢å¤é”™è¯¯ï¼ˆâ€œkernel panicâ€ï¼‰æ—¶ä¼šæ‰“å° å—污染状æ€ï¼Œå¹¶å°†æœ‰å…³æ¤çš„调试信æ¯å†™å…¥æ—¥å¿— ``dmesg`` 输出。也å¯ä»¥é€šè¿‡ ``/proc/`` ä¸çš„文件在è¿è¡Œæ—¶æ£€æŸ¥å—污染的状æ€ã€‚ BUGã€Oops或Panics消æ¯ä¸çš„æ±¡æŸ“æ ‡å¿— ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 在顶部以“CPU:â€å¼€å¤´çš„一行ä¸å¯ä»¥æ‰¾åˆ°å—污染的状æ€ï¼›å†…æ ¸æ˜¯å¦å—åˆ°æ±¡æŸ“å’ŒåŽŸå› ä¼šæ˜¾ç¤º 在进程ID(“PID:â€ï¼‰å’Œè§¦å‘事件命令的缩写å称(“Comm:â€ï¼‰ä¹‹åŽ:: BUG: unable to handle kernel NULL pointer dereference at 0000000000000000 Oops: 0002 [#1] SMP PTI CPU: 0 PID: 4424 Comm: insmod Tainted: P W O 4.20.0-0.rc6.fc30 #1 Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011 RIP: 0010:my_oops_init+0x13/0x1000 [kpanic] [...] å¦‚æžœå†…æ ¸åœ¨äº‹ä»¶å‘生时没有被污染,您将在那里看到“Not-tainted:â€ï¼›å¦‚果被污染,那 么它将是“Tainted:â€ä»¥åŠå—æ¯æˆ–ç©ºæ ¼ã€‚åœ¨ä¸Šé¢çš„例åä¸ï¼Œå®ƒçœ‹èµ·æ¥æ˜¯è¿™æ ·çš„:: Tainted: P W O 下表解释了这些å—符的å«ä¹‰ã€‚在本例ä¸ï¼Œç”±äºŽåŠ 载了专有模å—( ``P`` ),出现了 è¦å‘Šï¼ˆ ``W`` ï¼‰ï¼Œå¹¶ä¸”åŠ è½½äº†å¤–éƒ¨æž„å»ºçš„æ¨¡å—( ``O`` ï¼‰ï¼Œæ‰€ä»¥å†…æ ¸æ—©äº›æ—¶å€™å—到 了污染。è¦è§£ç 其他å—符,请使用下表。 解ç è¿è¡Œæ—¶çš„æ±¡æŸ“çŠ¶æ€ ~~~~~~~~~~~~~~~~~~~~~ 在è¿è¡Œæ—¶ï¼Œæ‚¨å¯ä»¥é€šè¿‡è¯»å– ``cat /proc/sys/kernel/tainted`` æ¥æŸ¥è¯¢å—污染状æ€ã€‚ 如果返回 ``0`` ï¼Œåˆ™å†…æ ¸æ²¡æœ‰å—到污染;任何其他数å—都表示å—åˆ°æ±¡æŸ“çš„åŽŸå› ã€‚è§£ç 这个数å—的最简å•æ–¹æ³•æ˜¯ä½¿ç”¨è„šæœ¬ ``tools/debugging/kernel-chktaint`` ,您的 å‘行版å¯èƒ½ä¼šå°†å…¶ä½œä¸ºå为 ``linux-tools`` 或 ``kernel-tools`` 的包的一部分æ 供;如果没有,您å¯ä»¥ä»Ž `git.kernel.org <https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint>`_ 网站下载æ¤è„šæœ¬å¹¶ç”¨ ``sh kernel-chktaint`` 执行,它会在上é¢å¼•ç”¨çš„日志ä¸æœ‰ç±»ä¼¼ è¯å¥çš„机器上打å°è¿™æ ·çš„内容:: Kernel is Tainted for following reasons: * Proprietary module was loaded (#0) * Kernel issued warning (#9) * Externally-built ('out-of-tree') module was loaded (#12) See Documentation/admin-guide/tainted-kernels.rst in the Linux kernel or https://www.kernel.org/doc/html/latest/admin-guide/tainted-kernels.html for a more details explanation of the various taint flags. Raw taint value as int/string: 4609/'P W O ' ä½ ä¹Ÿå¯ä»¥è¯•ç€è‡ªå·±è§£ç 这个数å—ã€‚å¦‚æžœå†…æ ¸è¢«æ±¡æŸ“çš„åŽŸå› åªæœ‰ä¸€ä¸ªï¼Œé‚£ä¹ˆè¿™å¾ˆç®€å•ï¼Œ 在本例ä¸æ‚¨å¯ä»¥é€šè¿‡ä¸‹è¡¨æ‰¾åˆ°æ•°å—ã€‚å¦‚æžœä½ éœ€è¦è§£ç æœ‰å¤šä¸ªåŽŸå› çš„æ•°å—ï¼Œå› ä¸ºå®ƒæ˜¯ä¸€ 个ä½åŸŸï¼ˆbitfield),其ä¸æ¯ä¸ªä½è¡¨ç¤ºä¸€ä¸ªç‰¹å®šç±»åž‹çš„污染的å˜åœ¨æˆ–ä¸å˜åœ¨ï¼Œæœ€å¥½è®© å‰é¢æ到的脚本æ¥å¤„ç†ã€‚但是如果您需è¦å¿«é€Ÿçœ‹ä¸€ä¸‹ï¼Œå¯ä»¥ä½¿ç”¨è¿™ä¸ªshell命令æ¥æ£€æŸ¥ 设置了哪些ä½:: $ for i in $(seq 18); do echo $(($i-1)) $(($(cat /proc/sys/kernel/tainted)>>($i-1)&1));done 污染状æ€ä»£ç 表 ~~~~~~~~~~~~~~~ === ===== ====== ======================================================== ä½ æ—¥å¿— æ•°å— å†…æ ¸è¢«æ±¡æŸ“çš„åŽŸå› === ===== ====== ======================================================== 0 G/P 1 å·²åŠ è½½ä¸“ç”¨æ¨¡å— 1 _/F 2 模å—è¢«å¼ºåˆ¶åŠ è½½ 2 _/S 4 å†…æ ¸è¿è¡Œåœ¨ä¸åˆè§„范的系统上 3 _/R 8 模å—被强制å¸è½½ 4 _/M 16 处ç†å™¨æŠ¥å‘Šäº†æœºå™¨æ£€æµ‹å¼‚常(MCE) 5 _/B 32 引用了错误的页或æŸäº›æ„å¤–çš„é¡µæ ‡å¿— 6 _/U 64 用户空间应用程åºè¯·æ±‚的污染 7 _/D 128 å†…æ ¸æœ€è¿‘æ»æœºäº†ï¼Œå³æ›¾å‡ºçŽ°OOPS或BUG 8 _/A 256 ACPI表被用户覆盖 9 _/W 512 å†…æ ¸å‘出è¦å‘Š 10 _/C 1024 å·²åŠ è½½stagingé©±åŠ¨ç¨‹åº 11 _/I 2048 已应用平å°å›ºä»¶ç¼ºé™·çš„解决方案 12 _/O 4096 å·²åŠ è½½å¤–éƒ¨æž„å»ºï¼ˆâ€œæ ‘å¤–â€ï¼‰æ¨¡å— 13 _/E 8192 å·²åŠ è½½æœªç¾åçš„æ¨¡å— 14 _/L 16384 å‘生软é”定 15 _/K 32768 å†…æ ¸å·²å®žæ—¶æ‰“è¡¥ä¸ 16 _/X 65536 备用污染,为å‘行版定义并使用 17 _/T 131072 å†…æ ¸æ˜¯ç”¨ç»“æž„éšæœºåŒ–æ’件构建的 === ===== ====== ======================================================== 注:å—符 ``_`` 表示空白,以便于阅读表。 污染的更详细解释 ~~~~~~~~~~~~~~~~~ 0) ``G`` åŠ è½½çš„æ‰€æœ‰æ¨¡å—都有GPL或兼容许å¯è¯ï¼Œ ``P`` åŠ è½½äº†ä»»ä½•ä¸“æœ‰æ¨¡å—。 没有MODULE_LICENSE(模å—许å¯è¯ï¼‰æˆ–MODULE_LICENSE未被insmod认å¯ä¸ºGPL 兼容的模å—被认为是专有的。 1) ``F`` 任何模å—被 ``insmod -f`` å¼ºåˆ¶åŠ è½½ï¼Œ ``' '`` 所有模å—æ£å¸¸åŠ 载。 2) ``S`` å†…æ ¸è¿è¡Œåœ¨ä¸åˆè§„范的处ç†å™¨æˆ–系统上:硬件已è¿è¡Œåœ¨ä¸å—支æŒçš„é…ç½®ä¸ï¼Œ å› æ¤æ— 法ä¿è¯æ£ç¡®æ‰§è¡Œã€‚å†…æ ¸å°†è¢«æ±¡æŸ“ï¼Œä¾‹å¦‚ï¼š - 在x86上:PAE是通过intel CPU(如Pentium M)上的forcepae强制执行的,这些 CPUä¸æŠ¥å‘ŠPAE,但å¯èƒ½æœ‰åŠŸèƒ½å®žçŽ°ï¼ŒSMPå†…æ ¸åœ¨éžå®˜æ–¹æ”¯æŒçš„SMP Athlon CPU上 è¿è¡Œï¼ŒMSR被暴露到用户空间ä¸ã€‚ - 在arm上:在æŸäº›CPU(如Keystone 2)上è¿è¡Œçš„å†…æ ¸ï¼Œæ²¡æœ‰å¯ç”¨æŸäº›å†…æ ¸ç‰¹æ€§ã€‚ - 在arm64上:CPU之间å˜åœ¨ä¸åŒ¹é…çš„ç¡¬ä»¶ç‰¹æ€§ï¼Œå¼•å¯¼åŠ è½½ç¨‹åºä»¥ä¸åŒçš„模å¼å¼•å¯¼CPU。 - æŸäº›é©±åŠ¨ç¨‹åºæ£åœ¨è¢«ç”¨åœ¨ä¸å—支æŒçš„体系结构上(例如x86_64以外的其他系统 上的scsi/snic,éžx86/x86_64/itanium上的scsi/ips,已ç»æŸå了arm64上 irqchip/irq-gic的固件设置…)。 3) ``R`` 模å—被 ``rmmod -f`` 强制å¸è½½ï¼Œ ``' '`` 所有模å—都æ£å¸¸å¸è½½ã€‚ 4) ``M`` 任何处ç†å™¨æŠ¥å‘Šäº†æœºå™¨æ£€æµ‹å¼‚常, ``' '`` 未å‘生机器检测异常。 5) ``B`` 页é¢é‡Šæ”¾å‡½æ•°å‘现错误的页é¢å¼•ç”¨æˆ–æŸäº›æ„外的页é¢æ ‡å¿—。这表示硬件问题 æˆ–å†…æ ¸é”™è¯¯ï¼›æ—¥å¿—ä¸åº”该有其他信æ¯æŒ‡ç¤ºå‘生æ¤æ±¡æŸ“çš„åŽŸå› ã€‚ 6) ``U`` 用户或用户应用程åºç‰¹æ„请求设置å—æ±¡æŸ“æ ‡å¿—ï¼Œå¦åˆ™åº”为 ``' '`` 。 7) ``D`` å†…æ ¸æœ€è¿‘æ»æœºäº†ï¼Œå³å‡ºçŽ°äº†OOPS或BUG。 8) ``A`` ACPI表被é‡å†™ã€‚ 9) ``W`` å†…æ ¸ä¹‹å‰å·²å‘出过è¦å‘Šï¼ˆå°½ç®¡æœ‰äº›è¦å‘Šå¯èƒ½ä¼šè®¾ç½®æ›´å…·ä½“çš„æ±¡æŸ“æ ‡å¿—ï¼‰ã€‚ 10) ``C`` å·²åŠ è½½staging驱动程åºã€‚ 11) ``I`` å†…æ ¸æ£åœ¨å¤„ç†å¹³å°å›ºä»¶ï¼ˆBIOS或类似软件)ä¸çš„严é‡é”™è¯¯ã€‚ 12) ``O`` å·²åŠ è½½å¤–éƒ¨æž„å»ºï¼ˆâ€œæ ‘å¤–â€ï¼‰æ¨¡å—。 13) ``E`` 在支æŒæ¨¡å—ç¾åçš„å†…æ ¸ä¸åŠ 载了未ç¾å的模å—。 14) ``L`` 系统上先å‰å‘生过软é”定。 15) ``K`` å†…æ ¸å·²ç»å®žæ—¶æ‰“了补ä¸ã€‚ 16) ``X`` 备用污染,由Linuxå‘行版定义和使用。 17) ``T`` å†…æ ¸æž„å»ºæ—¶ä½¿ç”¨äº†randstructæ’件,它å¯ä»¥æœ‰æ„生æˆéžå¸¸ä¸å¯»å¸¸çš„å†…æ ¸ç»“æž„ 布局(甚至是性能病æ€çš„布局),这在调试时éžå¸¸æœ‰ç”¨ã€‚于构建时设置。