.. SPDX-License-Identifier: GPL-2.0 .. include:: ../disclaimer-zh_TW.rst :Original: :doc:`../../../admin-guide/tainted-kernels` :è¯è€…: å³æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> 胡皓文 Hu Haowen <src.res@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æ’件,它å¯ä»¥æœ‰æ„生æˆéžå¸¸ä¸å°‹å¸¸çš„å…§æ ¸çµæ§‹ 布局(甚至是性能病態的布局),這在調試時éžå¸¸æœ‰ç”¨ã€‚於構建時è¨ç½®ã€‚