1 .. SPDX-License-Identifier: GPL-2.0 1 .. SPDX-License-Identifier: GPL-2.0 2 2 3 .. include:: ../disclaimer-zh_TW.rst 3 .. include:: ../disclaimer-zh_TW.rst 4 4 5 :Original: :doc:`../../../admin-guide/tainted- 5 :Original: :doc:`../../../admin-guide/tainted-kernels` 6 6 7 :譯者: 7 :譯者: 8 8 9 吳想成 Wu XiangCheng <bobwxc@email.cn> 9 吳想成 Wu XiangCheng <bobwxc@email.cn> 10 胡皓文 Hu Haowen <2023002089@link.tyut.edu. !! 10 胡皓文 Hu Haowen <src.res.211@gmail.com> 11 11 12 受污染的內核 12 受污染的內核 13 ------------- 13 ------------- 14 14 15 當發生一些在稍後調查問題時可能 15 當發生一些在稍後調查問題時可能相關的事件時,內核會將自己標記爲“受污染 16 (tainted)”的。不用太過擔心,大 16 (tainted)”的。不用太過擔心,大多數情況下運行受污染的內核沒有問題;這些信息 17 主要在有人想調查某個問題時纔有 17 主要在有人想調查某個問題時纔有意義的,因爲問題的真正原因可能是導致內核受污染 18 的事件。這就是爲什麼來自受污染 18 的事件。這就是爲什麼來自受污染內核的缺陷報告常常被開發人員忽略,因此請嘗試用 19 未受污染的內核重現問題。 19 未受污染的內核重現問題。 20 20 21 請注意,即使在您消除導致污染的 21 請注意,即使在您消除導致污染的原因(亦即卸載專有內核模塊)之後,內核仍將保持 22 污染狀態,以表示內核仍然不可信 22 污染狀態,以表示內核仍然不可信。這也是爲什麼內核在注意到內部問題(“kernel 23 bug”)、可恢復錯誤(“kernel oops 23 bug”)、可恢復錯誤(“kernel oops”)或不可恢復錯誤(“kernel panic”)時會打印 24 受污染狀態,並將有關此的調試信 24 受污染狀態,並將有關此的調試信息寫入日誌 ``dmesg`` 輸出。也可以通過 25 ``/proc/`` 中的文件在運行時檢查受 25 ``/proc/`` 中的文件在運行時檢查受污染的狀態。 26 26 27 27 28 BUG、Oops或Panics消息中的污染標誌 28 BUG、Oops或Panics消息中的污染標誌 29 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 29 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 30 30 31 在頂部以“CPU:”開頭的一行中可以 31 在頂部以“CPU:”開頭的一行中可以找到受污染的狀態;內核是否受到污染和原因會顯示 32 在進程ID(“PID:”)和觸發事件命 32 在進程ID(“PID:”)和觸發事件命令的縮寫名稱(“Comm:”)之後:: 33 33 34 BUG: unable to handle kernel NULL poin 34 BUG: unable to handle kernel NULL pointer dereference at 0000000000000000 35 Oops: 0002 [#1] SMP PTI 35 Oops: 0002 [#1] SMP PTI 36 CPU: 0 PID: 4424 Comm: insmod Tainted: 36 CPU: 0 PID: 4424 Comm: insmod Tainted: P W O 4.20.0-0.rc6.fc30 #1 37 Hardware name: Red Hat KVM, BIOS 0.5.1 37 Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011 38 RIP: 0010:my_oops_init+0x13/0x1000 [kp 38 RIP: 0010:my_oops_init+0x13/0x1000 [kpanic] 39 [...] 39 [...] 40 40 41 如果內核在事件發生時沒有被污染 41 如果內核在事件發生時沒有被污染,您將在那裏看到“Not-tainted:”;如果被污染,那 42 麼它將是“Tainted:”以及字母或空 42 麼它將是“Tainted:”以及字母或空格。在上面的例子中,它看起來是這樣的:: 43 43 44 Tainted: P W O 44 Tainted: P W O 45 45 46 下表解釋了這些字符的含義。在本 46 下表解釋了這些字符的含義。在本例中,由於加載了專有模塊( ``P`` ),出現了 47 警告( ``W`` ),並且加載了外部構 47 警告( ``W`` ),並且加載了外部構建的模塊( ``O`` ),所以內核早些時候受到 48 了污染。要解碼其他字符,請使用 48 了污染。要解碼其他字符,請使用下表。 49 49 50 50 51 解碼運行時的污染狀態 51 解碼運行時的污染狀態 52 ~~~~~~~~~~~~~~~~~~~~~ 52 ~~~~~~~~~~~~~~~~~~~~~ 53 53 54 在運行時,您可以通過讀取 ``cat /pr 54 在運行時,您可以通過讀取 ``cat /proc/sys/kernel/tainted`` 來查詢受污染狀態。 55 如果返回 ``0`` ,則內核沒有受到污 55 如果返回 ``0`` ,則內核沒有受到污染;任何其他數字都表示受到污染的原因。解碼 56 這個數字的最簡單方法是使用腳本 56 這個數字的最簡單方法是使用腳本 ``tools/debugging/kernel-chktaint`` ,您的 57 發行版可能會將其作爲名爲 ``linux-t 57 發行版可能會將其作爲名爲 ``linux-tools`` 或 ``kernel-tools`` 的包的一部分提 58 供;如果沒有,您可以從 58 供;如果沒有,您可以從 59 `git.kernel.org <https://git.kernel.org/pub/sc 59 `git.kernel.org <https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint>`_ 60 網站下載此腳本並用 ``sh kernel-chktai 60 網站下載此腳本並用 ``sh kernel-chktaint`` 執行,它會在上面引用的日誌中有類似 61 語句的機器上打印這樣的內容:: 61 語句的機器上打印這樣的內容:: 62 62 63 Kernel is Tainted for following reason 63 Kernel is Tainted for following reasons: 64 * Proprietary module was loaded (#0) 64 * Proprietary module was loaded (#0) 65 * Kernel issued warning (#9) 65 * Kernel issued warning (#9) 66 * Externally-built ('out-of-tree') mo 66 * Externally-built ('out-of-tree') module was loaded (#12) 67 See Documentation/admin-guide/tainted- 67 See Documentation/admin-guide/tainted-kernels.rst in the Linux kernel or 68 https://www.kernel.org/doc/html/lates 68 https://www.kernel.org/doc/html/latest/admin-guide/tainted-kernels.html for 69 a more details explanation of the var 69 a more details explanation of the various taint flags. 70 Raw taint value as int/string: 4609/'P 70 Raw taint value as int/string: 4609/'P W O ' 71 71 72 你也可以試着自己解碼這個數字。 72 你也可以試着自己解碼這個數字。如果內核被污染的原因只有一個,那麼這很簡單, 73 在本例中您可以通過下表找到數字 73 在本例中您可以通過下表找到數字。如果你需要解碼有多個原因的數字,因爲它是一 74 個位域(bitfield),其中每個位表 74 個位域(bitfield),其中每個位表示一個特定類型的污染的存在或不存在,最好讓 75 前面提到的腳本來處理。但是如果 75 前面提到的腳本來處理。但是如果您需要快速看一下,可以使用這個shell命令來檢查 76 設置了哪些位:: 76 設置了哪些位:: 77 77 78 $ for i in $(seq 18); do echo $(($i-1) 78 $ for i in $(seq 18); do echo $(($i-1)) $(($(cat /proc/sys/kernel/tainted)>>($i-1)&1));done 79 79 80 污染狀態代碼表 80 污染狀態代碼表 81 ~~~~~~~~~~~~~~~ 81 ~~~~~~~~~~~~~~~ 82 82 83 === ===== ====== ========================== 83 === ===== ====== ======================================================== 84 位 日誌 數字 內核被污染的原 84 位 日誌 數字 內核被污染的原因 85 === ===== ====== ========================== 85 === ===== ====== ======================================================== 86 0 G/P 1 已加載專用模塊 86 0 G/P 1 已加載專用模塊 87 1 _/F 2 模塊被強制加載 87 1 _/F 2 模塊被強制加載 88 2 _/S 4 內核運行在不合規 88 2 _/S 4 內核運行在不合規範的系統上 89 3 _/R 8 模塊被強制卸載 89 3 _/R 8 模塊被強制卸載 90 4 _/M 16 處理器報告了機器 90 4 _/M 16 處理器報告了機器檢測異常(MCE) 91 5 _/B 32 引用了錯誤的頁或 91 5 _/B 32 引用了錯誤的頁或某些意外的頁標誌 92 6 _/U 64 用戶空間應用程序 92 6 _/U 64 用戶空間應用程序請求的污染 93 7 _/D 128 內核最近死機了, 93 7 _/D 128 內核最近死機了,即曾出現OOPS或BUG 94 8 _/A 256 ACPI表被用戶覆蓋 94 8 _/A 256 ACPI表被用戶覆蓋 95 9 _/W 512 內核發出警告 95 9 _/W 512 內核發出警告 96 10 _/C 1024 已加載staging驅動程 96 10 _/C 1024 已加載staging驅動程序 97 11 _/I 2048 已應用平臺固件缺 97 11 _/I 2048 已應用平臺固件缺陷的解決方案 98 12 _/O 4096 已加載外部構建( 98 12 _/O 4096 已加載外部構建(“樹外”)模塊 99 13 _/E 8192 已加載未簽名的模 99 13 _/E 8192 已加載未簽名的模塊 100 14 _/L 16384 發生軟鎖定 100 14 _/L 16384 發生軟鎖定 101 15 _/K 32768 內核已實時打補丁 101 15 _/K 32768 內核已實時打補丁 102 16 _/X 65536 備用污染,爲發行 102 16 _/X 65536 備用污染,爲發行版定義並使用 103 17 _/T 131072 內核是用結構隨機 103 17 _/T 131072 內核是用結構隨機化插件構建的 104 === ===== ====== ========================== 104 === ===== ====== ======================================================== 105 105 106 注:字符 ``_`` 表示空白,以便於閱 106 注:字符 ``_`` 表示空白,以便於閱讀表。 107 107 108 污染的更詳細解釋 108 污染的更詳細解釋 109 ~~~~~~~~~~~~~~~~~ 109 ~~~~~~~~~~~~~~~~~ 110 110 111 0) ``G`` 加載的所有模塊都有GPL或 111 0) ``G`` 加載的所有模塊都有GPL或兼容許可證, ``P`` 加載了任何專有模塊。 112 沒有MODULE_LICENSE(模塊許可證) 112 沒有MODULE_LICENSE(模塊許可證)或MODULE_LICENSE未被insmod認可爲GPL 113 兼容的模塊被認爲是專有的。 113 兼容的模塊被認爲是專有的。 114 114 115 115 116 1) ``F`` 任何模塊被 ``insmod -f`` 強 116 1) ``F`` 任何模塊被 ``insmod -f`` 強制加載, ``' '`` 所有模塊正常加載。 117 117 118 2) ``S`` 內核運行在不合規範的處 118 2) ``S`` 內核運行在不合規範的處理器或系統上:硬件已運行在不受支持的配置中, 119 因此無法保證正確執行。內核 119 因此無法保證正確執行。內核將被污染,例如: 120 120 121 - 在x86上:PAE是通過intel CPU(如 121 - 在x86上:PAE是通過intel CPU(如Pentium M)上的forcepae強制執行的,這些 122 CPU不報告PAE,但可能有功能實 122 CPU不報告PAE,但可能有功能實現,SMP內核在非官方支持的SMP Athlon CPU上 123 運行,MSR被暴露到用戶空間中 123 運行,MSR被暴露到用戶空間中。 124 - 在arm上:在某些CPU(如Keystone 124 - 在arm上:在某些CPU(如Keystone 2)上運行的內核,沒有啓用某些內核特性。 125 - 在arm64上:CPU之間存在不匹配 125 - 在arm64上:CPU之間存在不匹配的硬件特性,引導加載程序以不同的模式引導CPU。 126 - 某些驅動程序正在被用在不受 126 - 某些驅動程序正在被用在不受支持的體系結構上(例如x86_64以外的其他系統 127 上的scsi/snic,非x86/x86_64/itanium 127 上的scsi/snic,非x86/x86_64/itanium上的scsi/ips,已經損壞了arm64上 128 irqchip/irq-gic的固件設置…)。 128 irqchip/irq-gic的固件設置…)。 129 129 130 3) ``R`` 模塊被 ``rmmod -f`` 強制卸載 130 3) ``R`` 模塊被 ``rmmod -f`` 強制卸載, ``' '`` 所有模塊都正常卸載。 131 131 132 4) ``M`` 任何處理器報告了機器檢 132 4) ``M`` 任何處理器報告了機器檢測異常, ``' '`` 未發生機器檢測異常。 133 133 134 5) ``B`` 頁面釋放函數發現錯誤的 134 5) ``B`` 頁面釋放函數發現錯誤的頁面引用或某些意外的頁面標誌。這表示硬件問題 135 或內核錯誤;日誌中應該有其 135 或內核錯誤;日誌中應該有其他信息指示發生此污染的原因。 136 136 137 6) ``U`` 用戶或用戶應用程序特意 137 6) ``U`` 用戶或用戶應用程序特意請求設置受污染標誌,否則應爲 ``' '`` 。 138 138 139 7) ``D`` 內核最近死機了,即出現 139 7) ``D`` 內核最近死機了,即出現了OOPS或BUG。 140 140 141 8) ``A`` ACPI表被重寫。 141 8) ``A`` ACPI表被重寫。 142 142 143 9) ``W`` 內核之前已發出過警告( 143 9) ``W`` 內核之前已發出過警告(儘管有些警告可能會設置更具體的污染標誌)。 144 144 145 10) ``C`` 已加載staging驅動程序。 145 10) ``C`` 已加載staging驅動程序。 146 146 147 11) ``I`` 內核正在處理平臺固件(BI 147 11) ``I`` 內核正在處理平臺固件(BIOS或類似軟件)中的嚴重錯誤。 148 148 149 12) ``O`` 已加載外部構建(“樹外 149 12) ``O`` 已加載外部構建(“樹外”)模塊。 150 150 151 13) ``E`` 在支持模塊簽名的內核中 151 13) ``E`` 在支持模塊簽名的內核中加載了未簽名的模塊。 152 152 153 14) ``L`` 系統上先前發生過軟鎖定 153 14) ``L`` 系統上先前發生過軟鎖定。 154 154 155 15) ``K`` 內核已經實時打了補丁。 155 15) ``K`` 內核已經實時打了補丁。 156 156 157 16) ``X`` 備用污染,由Linux發行版定 157 16) ``X`` 備用污染,由Linux發行版定義和使用。 158 158 159 17) ``T`` 內核構建時使用了randstruct 159 17) ``T`` 內核構建時使用了randstruct插件,它可以有意生成非常不尋常的內核結構 160 佈局(甚至是性能病態的佈局 160 佈局(甚至是性能病態的佈局),這在調試時非常有用。於構建時設置。 161 161
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.