1371 lines · plain
1.. SPDX-License-Identifier: (GPL-2.0+ OR CC-BY-4.0)2.. See the bottom of this file for additional redistribution information.3 4 5.. include:: ../disclaimer-zh_TW.rst6 7:Original: Documentation/admin-guide/reporting-issues.rst8 9:譯者:10 11 吳想成 Wu XiangCheng <bobwxc@email.cn>12 胡皓文 Hu Haowen <2023002089@link.tyut.edu.cn>13 14 15報告問題16+++++++++17 18 19簡明指南(亦即 太長不看)20==========================21 22您面臨的是否爲同系列穩定版或長期支持內核的普通內核的迴歸?是否仍然受支持?23請搜索 `LKML內核郵件列表 <https://lore.kernel.org/lkml/>`_ 和24`Linux穩定版郵件列表 <https://lore.kernel.org/stable/>`_ 存檔中匹配的報告並25加入討論。如果找不到匹配的報告,請安裝該系列的最新版本。如果它仍然出現問題,26請報告給穩定版郵件列表(stable@vger.kernel.org)並抄送回歸郵件列表27(regressions@lists.linux.dev);理想情況下,還可以抄送維護者和相關子系統的28郵件列表。29 30在所有其他情況下,請儘可能猜測是哪個內核部分導致了問題。查看MAINTAINERS文件,31瞭解開發人員希望如何得知問題,大多數情況下,報告問題都是通過電子郵件和抄送32相關郵件列表進行的。檢查報告目的地的存檔中是否已有匹配的報告;也請搜索33`LKML <https://lore.kernel.org/lkml/>`_ 和網絡。如果找不到可加入的討論,請34安裝 `最新的主線內核 <https://kernel.org/>`_ 。如果仍存在問題,請發送報告。35 36問題已經解決了,但是您希望看到它在一個仍然支持的穩定版或長期支持系列中得到37解決?請安裝其最新版本。如果它出現了問題,那麼在主線中搜索修復它的更改,並38檢查是否正在回傳(backporting)或者已放棄;如果兩者都沒有,那麼可詢問處理39更改的人員。40 41**通用提醒** :當安裝和測試上述內核時,請確保它是普通的(即:沒有補丁,也沒42有使用附加模塊)。還要確保它是在一個正常的環境中構建和運行,並且在問題發生43之前沒有被污染(tainted)。44 45當你同時面臨Linux內核的多個問題時,請分別報告。在編寫報告時,要涵蓋與問題46相關的所有信息,如使用的內核和發行版。如果碰見迴歸,請把報告抄送回歸郵件列表47(regressions@lists.linux.dev)。也請試試用二分法找出源頭;如果成功找到,請48在報告中寫上它的提交ID並抄送sign-off-by鏈中的所有人。49 50一旦報告發出,請回答任何出現的問題,並儘可能地提供幫助。這包括通過不時重新51測試新版本併發送狀態更新來推動進展。52 53 54如何向內核維護人員報告問題的逐步指南55=====================================56 57上面的簡明指南概述瞭如何向Linux內核開發人員報告問題。對於已經熟悉向自由和開58源軟件(FLOSS)項目報告問題的人來說,這可能是他們所需要的全部內容。對於其他59人,本部分更爲詳細,並一步一步地描述。爲了便於閱讀,它仍然儘量簡潔,並省略60了許多細節;這些在逐步指南後的參考章節中進行了描述,該章節更詳細地解釋了每61個步驟。62 63注意:本節涉及的方面比簡明指南多,順序也稍有不同。這符合你的利益,以確保您64儘早意識到看起來像Linux內核毛病的問題可能實際上是由其他原因引起的。這些步驟65可以確保你最終不會覺得在這一過程中投入的時間是浪費:66 67 * 您是否面臨硬件或軟件供應商提供的Linux內核的問題?那麼基本上您最好停止閱讀68 本文檔,轉而向您的供應商報告問題,除非您願意自己安裝最新的Linux版本。尋找69 和解決問題往往需要後者。70 71 * 使用您喜愛的網絡搜索引擎對現有報告進行粗略搜索;此外,請檢查72 `Linux內核郵件列表(LKML) <https://lore.kernel.org/lkml/>`_ 的存檔。如果73 找到匹配的報告,請加入討論而不是發送新報告。74 75 * 看看你正在處理的問題是否爲迴歸問題、安全問題或非常嚴重的問題:這些都是需76 要在接下來的一些步驟中特別處理的“高優先級問題”。77 78 * 確保不是內核環境導致了您面臨的問題。79 80 * 創建一個新的備份,並將系統修復和恢復工具放在手邊。81 82 * 確保您的系統不會通過動態構建額外的內核模塊來增強其內核,像DKMS這樣的解決83 方案可能在您不知情的情況下就在本地進行了這樣的工作。84 85 * 當問題發生時,檢查您的內核是否被“污染”,因爲使內核設置這個標誌的事件可能86 會導致您面臨的問題。87 88 * 粗略地寫下如何重現這個問題。如果您同時處理多個問題,請爲每個問題單獨寫注89 釋,並確保它們在新啓動的系統上獨立出現。這是必要的,因爲每個問題都需要分90 別報告給內核開發人員,除非它們嚴重糾纏在一起。91 92 * 如果您正面臨穩定版或長期支持版本線的迴歸(例如從5.10.4更新到5.10.5時出現93 故障),請查看後文“報告穩定版和長期支持內核線的迴歸”小節。94 95 * 定位可能引起問題的驅動程序或內核子系統。找出其開發人員期望的報告的方式和96 位置。注意:大多數情況下不會是 bugzilla.kernel.org,因爲問題通常需要通97 過郵件發送給維護人員和公共郵件列表。98 99 * 在缺陷追蹤器或問題相關郵件列表的存檔中徹底搜索可能與您的問題匹配的報告。100 如果你發現了一些相關討論,請加入討論而不是發送新的報告。101 102在完成這些準備之後,你將進入主要部分:103 104 * 除非您已經在運行最新的“主線”Linux內核,否則最好在報告流程前安裝它。在某些105 情況下,使用最新的“穩定版”Linux進行測試和報告也是可以接受的替代方案;在106 合併窗口期間,這實際上可能是最好的方法,但在開發階段最好還是暫停幾天。無論107 你選擇什麼版本,最好使用“普通”構建。忽略這些建議會大大增加您的報告被拒絕108 或忽略的風險。109 110 * 確保您剛剛安裝的內核在運行時不會“污染”自己。111 112 * 在您剛剛安裝的內核中復現這個問題。如果它沒有出現,請查看下方只發生在113 穩定版和長期支持內核的問題的說明。114 115 * 優化你的筆記:試着找到並寫出最直接的復現問題的方法。確保最終結果包含所有116 重要的細節,同時讓第一次聽說的人容易閱讀和理解。如果您在此過程中學到了一117 些東西,請考慮再次搜索關於該問題的現有報告。118 119 * 如果失敗涉及“panic”、“Oops”、“warning”或“BUG”,請考慮解碼內核日誌以查找觸120 發錯誤的代碼行。121 122 * 如果您的問題是迴歸問題,請儘可能縮小引入問題時的範圍。123 124 * 通過詳細描述問題來開始編寫報告。記得包括以下條目:您爲復現而安裝的最新內125 核版本、使用的Linux發行版以及關於如何復現該問題的說明。如果可能,將內核126 構建配置(.config)和 ``dmesg`` 的輸出放在網上的某個地方,並鏈接到它。包127 含或上傳所有其他可能相關的信息,如Oops的輸出/截圖或來自 ``lspci`` 的輸出128 。一旦你寫完了這個主要部分,請在上方插入一個正常長度的段落快速概述問題和129 影響。再在此之上添加一個簡單描述問題的句子,以得到人們的閱讀。現在給出一130 個更短的描述性標題或主題。然後就可以像MAINTAINERS文件告訴你的那樣發送或131 提交報告了,除非你在處理一個“高優先級問題”:它們需要按照下面“高優先級問132 題的特殊處理”所述特別關照。133 134 * 等待別人的反應,繼續推進事情,直到你能夠接受這樣或那樣的結果。因此,請公135 開和及時地回應任何詢問。測試提出的修復。積極地測試:至少重新測試每個新主136 線版本的首個候選版本(RC),並報告你的結果。如果出現拖延,就友好地提醒一137 下。如果你沒有得到任何幫助或者未能滿意,請試着自己幫助自己。138 139 140報告穩定版和長期支持內核線的迴歸141----------------------------------142 143如果您發現了穩定版或長期支持內核版本線中的迴歸問題並按上述流程跳到這裏,那麼144請閱讀本小節。即例如您在從5.10.4更新到5.10.5時出現了問題(從5.9.15到5.10.5則145不是)。開發人員希望儘快修復此類迴歸,因此有一個簡化流程來報告它們:146 147 * 檢查內核開發人員是否仍然維護你關心的Linux內核版本線:去 `kernel.org 的首頁148 <https://kernel.org/>`_ ,確保此特定版本線的最新版沒有“[EOL]”標記。149 150 * 檢查 `Linux穩定版郵件列表 <https://lore.kernel.org/stable/>`_ 中的現有報告。151 152 * 從特定的版本線安裝最新版本作爲純淨內核。確保這個內核沒有被污染,並且仍然153 存在問題,因爲問題可能已經在那裏被修復了。如果您第一次發現供應商內核的問題,154 請檢查已知最新版本的普通構建是否可以正常運行。155 156 * 向Linux穩定版郵件列表發送一個簡短的問題報告(stable@vger.kernel.org)並抄送157 Linux迴歸郵件列表(regressions@lists.linux.dev);如果你懷疑是由某子系統158 引起的,請抄送其維護人員和子系統郵件列表。大致描述問題,並解釋如何復現。159 講清楚首個出現問題的版本和最後一個工作正常的版本。然後等待進一步的指示。160 161下面的參考章節部分詳細解釋了這些步驟中的每一步。162 163 164報告只發生在較舊內核版本線的問題165----------------------------------166 167若您嘗試了上述的最新主線內核,但未能在那裏復現問題,那麼本小節適用於您;以下168流程有助於使問題在仍然支持的穩定版或長期支持版本線,或者定期基於最新穩定版或169長期支持內核的供應商內核中得到修復。如果是這種情況,請執行以下步驟:170 171 * 請做好準備,接下來的幾個步驟可能無法在舊版本中解決問題:修復可能太大或太172 冒險,無法移植到那裏。173 174 * 執行前節“報告穩定版和長期支持內核線的迴歸”中的前三個步驟。175 176 * 在Linux內核版本控制系統中搜索修復主線問題的更改,因爲它的提交消息可能會177 告訴你修復是否已經計劃好了支持。如果你沒有找到,搜索適當的郵件列表,尋找178 討論此類問題或同行評議可能修復的帖子;然後檢查討論是否認爲修復不適合支持。179 如果支持根本不被考慮,加入最新的討論,詢問是否有可能。180 181 * 前面的步驟之一應該會給出一個解決方案。如果仍未能成功,請向可能引起問題的182 子系統的維護人員詢問建議;抄送特定子系統的郵件列表以及穩定版郵件列表183 184下面的參考章節部分詳細解釋了這些步驟中的每一步。185 186 187參考章節:向內核維護者報告問題188===============================189 190上面的詳細指南簡要地列出了所有主要步驟,這對大多數人來說應該足夠了。但有時,191即使是有經驗的用戶也可能想知道如何實際執行這些步驟之一。這就是本節的目的,192因爲它將提供關於上述每個步驟的更多細節。請將此作爲參考文檔:可以從頭到尾193閱讀它。但它主要是爲了瀏覽和查找如何實際執行這些步驟的詳細信息。194 195在深入挖掘細節之前,我想先給你一些一般性建議:196 197 * Linux內核開發人員很清楚這個過程很複雜,比其他的FLOSS項目要求更多。我們很198 希望讓它更簡單。但這需要在不同的地方以及一些基礎設施上付諸努力,這些基礎199 設施需要持續的維護;尚未有人站出來做這些工作,所以目前情況就是這樣。200 201 * 與某些供應商簽訂的保證或支持合同並不能使您有權要求上游Linux內核社區的開202 發人員進行修復:這樣的合同完全在Linux內核、其開發社區和本文檔的範圍之外。203 這就是爲什麼在這種情況下,你不能要求任何契約保證,即使開發人員處理的問204 題對供應商有效。如果您想主張您的權利,使用供應商的支持渠道代替。當這樣做205 的時候,你可能想提出你希望看到這個問題在上游Linux內核中修復;可以這是確206 保最終修復將被納入所有Linux發行版的唯一方法來鼓勵他們。207 208 * 如果您從未向FLOSS項目報告過任何問題,那麼您應該考慮閱讀 `如何有效地報告209 缺陷 <https://www.chiark.greenend.org.uk/~sgtatham/bugs.html>`_ , `如何210 以明智的方式提問 <http://www.catb.org/esr/faqs/smart-questions.html>`_ ,211 和 `如何提出好問題 <https://jvns.ca/blog/good-questions/>`_ 。212 213解決這些問題之後,可以在下面找到如何正確地向Linux內核報告問題的詳細信息。214 215 216確保您使用的是上游Linux內核217----------------------------218 219 *您是否面臨硬件或軟件供應商提供的Linux內核的問題?那麼基本上您最好停止閱220 讀本文檔,轉而向您的供應商報告問題,除非您願意自己安裝最新的Linux版本。221 尋找和解決問題往往需要後者。*222 223與大多數程序員一樣,Linux內核開發人員不喜歡花時間處理他們維護的源代碼中根本224不會發生的問題的報告。這隻會浪費每個人的時間,尤其是你的時間。不幸的是,當225涉及到內核時,這樣的情況很容易發生,並且常常導致雙方氣餒。這是因爲幾乎所有預226裝在設備(臺式機、筆記本電腦、智能手機、路由器等)上的Linux內核,以及大多數227由Linux發行商提供的內核,都與由kernel.org發行的官方Linux內核相距甚遠:從Linux228開發的角度來看,這些供應商提供的內核通常是古老的或者經過了大量修改,通常兩點229兼具。230 231大多數供應商內核都不適合用來向Linux內核開發人員報告問題:您在其中遇到的問題232可能已經由Linux內核開發人員在數月或數年前修復;此外,供應商的修改和增強可能233會導致您面臨的問題,即使它們看起來很小或者完全不相關。這就是爲什麼您應該向234供應商報告這些內核的問題。它的開發者應該查看報告,如果它是一個上游問題,直接235於上游修復或將報告轉發到那裏。在實踐中,這有時行不通。因此,您可能需要考慮236通過自己安裝最新的Linux內核內核來繞過供應商。如果如果您選擇此方法,那麼本指237南後面的步驟將解釋如何在排除了其他可能導致您的問題的原因後執行此操作。238 239注意前段使用的詞語是“大多數”,因爲有時候開發人員實際上願意處理供應商內核出現240的問題報告。他們是否這麼做很大程度上取決於開發人員和相關問題。如果發行版只241根據最近的Linux版本對內核進行了較小修改,那麼機會就比較大;例如對於Debian242GNU/Linux Sid或Fedora Rawhide所提供的主線內核。一些開發人員還將接受基於最新243穩定內核的發行版內核問題報告,只要它改動不大;例如Arch Linux、常規Fedora版本244和openSUSE Turboweed。但是請記住,您最好使用主線Linux,並避免在此流程中使用245穩定版內核,如“安裝一個新的內核進行測試”一節中所詳述。246 247當然,您可以忽略所有這些建議,並向上遊Linux開發人員報告舊的或經過大量修改的248供應商內核的問題。但是注意,這樣的報告經常被拒絕或忽視,所以自行小心考慮一下。249不過這還是比根本不報告問題要好:有時候這樣的報告會直接或間接地幫助解決之後的250問題。251 252 253搜索現有報告(第一部分)254-------------------------255 256 *使用您喜愛的網絡搜索引擎對現有報告進行粗略搜索;此外,請檢查Linux內核257 郵件列表(LKML)的存檔。如果找到匹配的報告,請加入討論而不是發送新報告。*258 259報告一個別人已經提出的問題,對每個人來說都是浪費時間,尤其是作爲報告人的你。260所以徹底檢查是否有人已經報告了這個問題,這對你自己是有利的。在流程中的這一步,261可以只執行一個粗略的搜索:一旦您知道您的問題需要報告到哪裏,稍後的步驟將告訴262您如何詳細搜索。儘管如此,不要倉促完成這一步,它可以節省您的時間和減少麻煩。263 264只需先用你最喜歡的搜索引擎在互聯網上搜索。然後再搜索Linux內核郵件列表(LKML)265存檔。266 267如果搜索結果實在太多,可以考慮讓你的搜索引擎將搜索時間範圍限制在過去的一個268月或一年。而且無論你在哪裏搜索,一定要用恰當的搜索關鍵詞;也要變化幾次關鍵269詞。同時,試着從別人的角度看問題:這將幫助你想出其他的關鍵詞。另外,一定不270要同時使用過多的關鍵詞。記住搜索時要同時嘗試包含和不包含內核驅動程序的名稱271或受影響的硬件組件的名稱等信息。但其確切的品牌名稱(比如說“華碩紅魔 Radeon272RX 5700 XT Gaming OC”)往往幫助不大,因爲它太具體了。相反,嘗試搜索術語,如273型號(Radeon 5700 或 Radeon 5000)和核心代號(“Navi”或“Navi10”),以及包含274和不包含其製造商(“AMD”)。275 276如果你發現了關於你的問題的現有報告,請加入討論,因爲你可能會提供有價值的額277外信息。這一點很重要,即使是在修復程序已經準備好或處於最後階段,因爲開發人278員可能會尋找能夠提供額外信息或測試建議修復程序的人。跳到“發佈報告後的責任”279一節,瞭解有關如何正確參與的細節。280 281注意,搜索 `bugzilla.kernel.org <https://bugzilla.kernel.org/>`_ 網站可能282也是一個好主意,因爲這可能會提供有價值的見解或找到匹配的報告。如果您發現後者,283請記住:大多數子系統都希望在不同的位置報告,如下面“你需要將問題報告到何處”284一節中所述。因此本應處理這個問題的開發人員甚至可能不知道bugzilla的工單。所以285請檢查工單中的問題是否已經按照本文檔所述得到報告,如果沒有,請考慮這樣做。286 287高優先級的問題?288-----------------289 290 *看看你正在處理的問題是否是迴歸問題、安全問題或非常嚴重的問題:這些都是291 需要在接下來的一些步驟中特別處理的“高優先級問題”。*292 293Linus Torvalds和主要的Linux內核開發人員希望看到一些問題儘快得到解決,因此在294報告過程中有一些“高優先級問題”的處理略有不同。有三種情況符合條件:迴歸、安全295問題和非常嚴重的問題。296 297如果某個應用程序或實際用例在原先的Linux內核上運行良好,但在使用類似配置編譯的298較新版本上效果更差、或者根本不能用,那麼你就需要處理迴歸問題。299Documentation/admin-guide/reporting-regressions.rst 對此進行了更詳細的解釋。300它還提供了很多你可能想知道的關於迴歸的其他信息;例如,它解釋瞭如何將您的問題301添加到迴歸跟蹤列表中,以確保它不會被忽略。302 303什麼是安全問題留給您自己判斷。在繼續之前,請考慮閱讀304Documentation/translations/zh_CN/process/security-bugs.rst ,305因爲它提供瞭如何最恰當地處理安全問題的額外細節。306 307當發生了完全無法接受的糟糕事情時,此問題就是一個“非常嚴重的問題”。例如,308Linux內核破壞了它處理的數據或損壞了它運行的硬件。當內核突然顯示錯誤消息309(“kernel panic”)並停止工作,或者根本沒有任何停止信息時,您也在處理一個嚴重310的問題。注意:不要混淆“panic”(內核停止自身的致命錯誤)和“Oops”(可恢復錯誤),311因爲顯示後者之後內核仍然在運行。312 313 314確保環境健康315--------------316 317 *確保不是內核所處環境導致了你所面臨的問題。*318 319看起來很像內核問題的問題有時是由構建或運行時環境引起的。很難完全排除這種問320題,但你應該儘量減少這種問題:321 322 * 構建內核時,請使用經過驗證的工具,因爲編譯器或二進制文件中的錯誤可能會導323 致內核出現錯誤行爲。324 325 * 確保您的計算機組件在其設計規範內運行;這對處理器、內存和主板尤爲重要。因326 此,當面臨潛在的內核問題時,停止低電壓或超頻。327 328 * 儘量確保不是硬件故障導致了你的問題。例如,內存損壞會導致大量的問題,這些329 問題會表現爲看起來像內核問題。330 331 * 如果你正在處理一個文件系統問題,你可能需要用 ``fsck`` 檢查一下文件系統,332 因爲它可能會以某種方式被損壞,從而導致無法預期的內核行爲。333 334 * 在處理迴歸問題時,要確保沒有在更新內核的同時發生了其他變化。例如,這個問335 題可能是由同時更新的其他軟件引起的。也有可能是在你第一次重啓進入新內核時,336 某個硬件巧合地壞了。更新系統 BIOS 或改變 BIOS 設置中的某些內容也會導致337 一些看起來很像內核迴歸的問題。338 339 340爲緊急情況做好準備341-------------------342 343 *創建一個全新的備份,並將系統修復和還原工具放在手邊*344 345我得提醒您,您正在和計算機打交道,計算機有時會出現意想不到的事情,尤其是當346您折騰其操作系統的內核等關鍵部件時。而這就是你在這個過程中要做的事情。因此,347一定要創建一個全新的備份;還要確保你手頭有修復或重裝操作系統的所有工具,348以及恢復備份所需的一切。349 350 351確保你的內核不會被增強352------------------------353 354 *確保您的系統不會通過動態構建額外的內核模塊來增強其內核,像DKMS這樣的解355 決方案可能在您不知情的情況下就在本地進行了這樣的工作。*356 357如果內核以任何方式得到增強,那麼問題報告被忽略或拒絕的風險就會急劇增加。這就358是爲什麼您應該刪除或禁用像akmods和DKMS這樣的機制:這些機制會自動構建額外內核359模塊,例如當您安裝新的Linux內核或第一次引導它時。也要記得同時刪除他們可能安裝360的任何模塊。然後重新啓動再繼續。361 362注意,你可能不知道你的系統正在使用這些解決方案之一:當你安裝 Nvidia 專有圖363形驅動程序、VirtualBox 或其他需要 Linux 內核以外的模塊支持的軟件時,它們通364常會靜默設置。這就是爲什麼你可能需要卸載這些軟件的軟件包,以擺脫任何第三方365內核模塊。366 367 368檢查“污染”標誌369----------------370 371 *當問題發生時,檢查您的內核是否被“污染”,因爲使內核設置這個標誌的事件可372 能會導致您面臨的問題。*373 374當某些可能會導致看起來完全不相關的後續錯誤的事情發生時,內核會用“污染375(taint)”標誌標記自己。如果您的內核受到污染,那麼您面臨的可能是這樣的錯誤。376因此在投入更多時間到這個過程中之前,儘早排除此情況可能對你有好處。這是這個377步驟出現在這裏的唯一原因,因爲這個過程稍後會告訴您安裝最新的主線內核;然後378您將需要再次檢查污染標誌,因爲當它出問題的時候內核報告會關注它。379 380在正在運行的系統上檢查內核是否污染非常容易:如果 ``cat /proc/sys/kernel/tainted``381返回“0”,那麼內核沒有被污染,一切正常。在某些情況下無法檢查該文件;這就是382爲什麼當內核報告內部問題(“kernel bug”)、可恢復錯誤(“kernel Oops”)或停止383操作前不可恢復的錯誤(“kernel panic”)時,它也會提到污染狀態。當其中一個錯384誤發生時,查看打印的錯誤消息的頂部,搜索以“CPU:”開頭的行。如果發現問題時內385核未被污染,那麼它應該以“Not infected”結束;如果你看到“Tainted:”且後跟一些386空格和字母,那就被污染了。387 388如果你的內核被污染了,請閱讀 Documentation/translations/zh_CN/admin-guide/tainted-kernels.rst389以找出原因。設法消除污染因素。通常是由以下三種因素之一引起的:390 391 1. 發生了一個可恢復的錯誤(“kernel Oops”),內核污染了自己,因爲內核知道在392 此之後它可能會出現奇怪的行爲錯亂。在這種情況下,檢查您的內核或系統日誌,393 並尋找以下列文字開頭的部分::394 395 Oops: 0000 [#1] SMP396 397 如方括號中的“#1”所示,這是自啓動以來的第一次Oops。每個Oops和此後發生的398 任何其他問題都可能是首個Oops的後續問題,即使這兩個問題看起來完全不相關。399 通過消除首個Oops的原因並在之後復現該問題,可以排除這種情況。有時僅僅400 重新啓動就足夠了,有時更改配置後重新啓動可以消除Oops。但是在這個流程中401 不要花費太多時間在這一點上,因爲引起Oops的原因可能已經在您稍後將按流程402 安裝的新Linux內核版本中修復了。403 404 2. 您的系統使用的軟件安裝了自己的內核模塊,例如Nvidia的專有圖形驅動程序或405 VirtualBox。當內核從外部源(即使它們是開源的)加載此類模塊時,它會污染406 自己:它們有時會在不相關的內核區域導致錯誤,從而可能導致您面臨的問題。407 因此,當您想要向Linux內核開發人員報告問題時,您必須阻止這些模塊加載。408 大多數情況下最簡單的方法是:臨時卸載這些軟件,包括它們可能已經安裝的任409 何模塊。之後重新啓動。410 411 3. 當內核加載駐留在Linux內核源代碼staging樹中的模塊時,它也會污染自身。這412 是一個特殊的區域,代碼(主要是驅動程序)還沒有達到正常Linux內核的質量413 標準。當您報告此種模塊的問題時,內核受到污染顯然是沒有問題的;只需確保414 問題模塊是造成污染的唯一原因。如果問題發生在一個不相關的區域,重新啓動415 並通過指定 ``foo.blacklist=1`` 作爲內核參數臨時阻止該模塊被加載(用有416 問題的模塊名替換“foo”)。417 418 419記錄如何重現問題420------------------421 422 *粗略地寫下如何重現這個問題。如果您同時處理多個問題,請爲每個問題單獨寫423 註釋,並確保它們在新啓動的系統上獨立出現。這是必要的,因爲每個問題都需424 要分別報告給內核開發人員,除非它們嚴重糾纏在一起。*425 426如果你同時處理多個問題,必須分別報告每個問題,因爲它們可能由不同的開發人員427處理。在一份報告中描述多種問題,也會讓其他人難以將其分開。因此只有在問題嚴428重糾纏的情況下,才能將問題合併在一份報告中。429 430此外,在報告過程中,你必須測試該問題是否發生在其他內核版本上。因此,如果您431知道如何在一個新啓動的系統上快速重現問題,將使您的工作更加輕鬆。432 433注意:報告只發生過一次的問題往往是沒有結果的,因爲它們可能是由於宇宙輻射導434致的位翻轉。所以你應該嘗試通過重現問題來排除這種情況,然後再繼續。如果你有435足夠的經驗來區分由於硬件故障引起的一次性錯誤和難以重現的罕見內核問題,可以436忽略這個建議。437 438 439穩定版或長期支持內核的迴歸?440-----------------------------441 442 *如果您正面臨穩定版或長期支持版本線的迴歸(例如從5.10.4更新到5.10.5時出現443 故障),請查看後文“報告穩定版和長期支持內核線的迴歸”小節。*444 445穩定版和長期支持內核版本線中的迴歸是Linux開發人員非常希望解決的問題,這樣的446問題甚至比主線開發分支中的迴歸更不應出現,因爲它們會很快影響到很多人。開發人員447希望儘快瞭解此類問題,因此有一個簡化流程來報告這些問題。注意,使用更新內核版448本線的迴歸(比如從5.9.15切換到5.10.5時出現故障)不符合條件。449 450 451你需要將問題報告到何處452------------------------453 454 *定位可能引起問題的驅動程序或內核子系統。找出其開發人員期望的報告的方式455 和位置。注意:大多數情況下不會是bugzilla.kernel.org,因爲問題通常需要通456 過郵件發送給維護人員和公共郵件列表。*457 458將報告發送給合適的人是至關重要的,因爲Linux內核是一個大項目,大多數開發人員459只熟悉其中的一小部分。例如,相當多的程序員只關心一個驅動程序,比如一個WiFi460芯片驅動程序;它的開發人員可能對疏遠的或不相關的“子系統”(如TCP堆棧、461PCIe/PCI子系統、內存管理或文件系統)的內部知識瞭解很少或完全不瞭解。462 463問題在於:Linux內核缺少一個,可以簡單地將問題歸檔並讓需要了解它的開發人員了464解它的,中心化缺陷跟蹤器。這就是爲什麼你必須找到正確的途徑來自己報告問題。465您可以在腳本的幫助下做到這一點(見下文),但它主要針對的是內核開發人員和專466家。對於其他人來說,MAINTAINERS(維護人員)文件是更好的選擇。467 468如何閱讀MAINTAINERS維護者文件469~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~470 471爲了說明如何使用 :ref:`MAINTAINERS <maintainers>` 文件,讓我們假設您的筆記472本電腦中的WiFi在更新內核後突然出現了錯誤行爲。這種情況下可能是WiFi驅動的問473題。顯然,它也可能由於驅動基於的某些代碼,但除非你懷疑有這樣的東西會附着在474驅動程序上。如果真的是其他的問題,驅動程序的開發人員會讓合適的人蔘與進來。475 476遺憾的是,沒有通用且簡單的辦法來檢查哪個代碼驅動了特定硬件組件。477 478在WiFi驅動出現問題的情況下,你可能想查看 ``lspci -k`` 的輸出,因爲它列出了479PCI/PCIe總線上的設備和驅動它的內核模塊::480 481 [user@something ~]$ lspci -k482 [...]483 3a:00.0 Network controller: Qualcomm Atheros QCA6174 802.11ac Wireless Network Adapter (rev 32)484 Subsystem: Bigfoot Networks, Inc. Device 1535485 Kernel driver in use: ath10k_pci486 Kernel modules: ath10k_pci487 [...]488 489但如果你的WiFi芯片通過USB或其他內部總線連接,這種方法就行不通了。在這種情況490下,您可能需要檢查您的WiFi管理器或 ``ip link`` 的輸出。尋找有問題的網絡接口491的名稱,它可能類似於“wlp58s0”。此名稱可以用來找到驅動它的模塊::492 493 [user@something ~]$ realpath --relative-to=/sys/module//sys/class/net/wlp58s0/device/driver/module494 ath10k_pci495 496如果這些技巧不能進一步幫助您,請嘗試在網上搜索如何縮小相關驅動程序或子系統497的範圍。如果你不確定是哪一個:試着猜一下,即使你猜得不好,也會有人會幫助你498的。499 500一旦您知道了相應的驅動程序或子系統,您就希望在MAINTAINERS文件中搜索它。如果501是“ath10k_pci”,您不會找到任何東西,因爲名稱太具體了。有時你需要在網上尋找502幫助;但在此之前,請嘗試使用一個稍短或修改過的名稱來搜索MAINTAINERS文件,因503爲這樣你可能會發現類似這樣的東西::504 505 QUALCOMM ATHEROS ATH10K WIRELESS DRIVER506 Mail: A. Some Human <shuman@example.com>507 Mailing list: ath10k@lists.infradead.org508 Status: Supported509 Web-page: https://wireless.wiki.kernel.org/en/users/Drivers/ath10k510 SCM: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git511 Files: drivers/net/wireless/ath/ath10k/512 513注意:如果您閱讀在Linux源代碼樹的根目錄中找到的原始維護者文件,則行描述將是514縮寫。例如,“Mail:(郵件)”將是“M:”,“Mailing list:(郵件列表)”將是“L”,515“Status:(狀態)”將是“S:”。此文件頂部有一段解釋了這些和其他縮寫。516 517首先查看“Status”狀態行。理想情況下,它應該得到“Supported(支持)”或518“Maintained(維護)”。如果狀態爲“Obsolete(過時的)”,那麼你在使用一些過時的519方法,需要轉換到新的解決方案上。有時候,只有在感到有動力時,纔會有人爲代碼520提供“Odd Fixes”。如果碰見“Orphan”,你就完全不走運了,因爲再也沒有人關心代碼521了,只剩下這些選項:準備好與問題共存,自己修復它,或者找一個願意修復它的程序員。522 523檢查狀態後,尋找以“bug:”開頭的一行:它將告訴你在哪裏可以找到子系統特定的缺524陷跟蹤器來提交你的問題。上面的例子沒有此行。大多數部分都是這樣,因爲 Linux525內核的開發完全是由郵件驅動的。很少有子系統使用缺陷跟蹤器,且其中只有一部分526依賴於 bugzilla.kernel.org。527 528在這種以及其他很多情況下,你必須尋找以“Mail:”開頭的行。這些行提到了特定代碼529的維護者的名字和電子郵件地址。也可以查找以“Mailing list:”開頭的行,它告訴你530開發代碼的公共郵件列表。你的報告之後需要通過郵件發到這些地址。另外,對於所有531通過電子郵件發送的問題報告,一定要抄送 Linux Kernel Mailing List(LKML)532<linux-kernel@vger.kernel.org>。在以後通過郵件發送問題報告時,不要遺漏任何533一個郵件列表!維護者都是大忙人,可能會把一些工作留給子系統特定列表上的其他開534發者;而 LKML 很重要,因爲需要一個可以找到所有問題報告的地方。535 536 537藉助腳本找到維護者538~~~~~~~~~~~~~~~~~~~~539 540對於手頭有Linux源碼的人來說,有第二個可以找到合適的報告地點的選擇:腳本541“scripts/get_maintainer.pl”,它嘗試找到所有要聯繫的人。它會查詢MAINTAINERS542文件,並需要用相關源代碼的路徑來調用。對於編譯成模塊的驅動程序,經常可以用543這樣的命令找到::544 545 $ modinfo ath10k_pci | grep filename | sed 's!/lib/modules/.*/kernel/!!; s!filename:!!; s!\.ko\(\|\.xz\)!!'546 drivers/net/wireless/ath/ath10k/ath10k_pci.ko547 548將其中的部分內容傳遞給腳本::549 550 $ ./scripts/get_maintainer.pl -f drivers/net/wireless/ath/ath10k*551 Some Human <shuman@example.com> (supporter:QUALCOMM ATHEROS ATH10K WIRELESS DRIVER)552 Another S. Human <asomehuman@example.com> (maintainer:NETWORKING DRIVERS)553 ath10k@lists.infradead.org (open list:QUALCOMM ATHEROS ATH10K WIRELESS DRIVER)554 linux-wireless@vger.kernel.org (open list:NETWORKING DRIVERS (WIRELESS))555 netdev@vger.kernel.org (open list:NETWORKING DRIVERS)556 linux-kernel@vger.kernel.org (open list)557 558不要把你的報告發給所有的人。發送給維護者,腳本稱之爲“supporter:”;另外抄送559代碼最相關的郵件列表,以及 Linux 內核郵件列表(LKML)。在此例中,你需要將報560告發送給 “Some Human <shuman@example.com>” ,並抄送561“ath10k@lists.infradead.org”和“linux-kernel@vger.kernel.org”。562 563注意:如果你用 git 克隆了 Linux 源代碼,你可能需要用--git 再次調用564get_maintainer.pl。腳本會查看提交歷史,以找到最近哪些人蔘與了相關代碼的編寫,565因爲他們可能會提供幫助。但要小心使用這些結果,因爲它很容易讓你誤入歧途。566例如,這種情況常常會發生在很少被修改的地方(比如老舊的或未維護的驅動程序):567有時這樣的代碼會在樹級清理期間被根本不關心此驅動程序的開發者修改。568 569 570搜索現有報告(第二部分)571--------------------------572 573 *在缺陷追蹤器或問題相關郵件列表的存檔中徹底搜索可能與您的問題匹配的報告。574 如果找到匹配的報告,請加入討論而不是發送新報告。*575 576如前所述:報告一個別人已經提出的問題,對每個人來說都是浪費時間,尤其是作爲報告577人的你。這就是爲什麼你應該再次搜索現有的報告。現在你已經知道問題需要報告到哪裏。578如果是郵件列表,那麼一般在 `lore.kernel.org <https://lore.kernel.org/>`_ 可以579找到相應存檔。580 581但有些列表運行在其他地方。例如前面步驟中當例子的ath10k WiFi驅動程序就是這種582情況。但是你通常可以在網上很容易地找到這些列表的檔案。例如搜索“archive583ath10k@lists.infradead.org”,將引導您到ath10k郵件列表的信息頁,該頁面頂部鏈接584到其 `列表存檔 <https://lists.infradead.org/pipermail/ath10k/>`_ 。遺憾的是,585這個列表和其他一些列表缺乏搜索其存檔的功能。在這種情況下可以使用常規的互聯網586搜索引擎,並添加類似“site:lists.infadead.org/pipermail/ath10k/”這587樣的搜索條件,這會把結果限制在該鏈接中的檔案。588 589也請進一步搜索網絡、LKML和bugzilla.kernel.org網站。如果你的報告需要發送到缺陷590跟蹤器中,那麼您可能還需要檢查子系統的郵件列表存檔,因爲可能有人只在那裏報告了它。591 592有關如何搜索以及在找到匹配報告時如何操作的詳細信息,請參閱上面的“搜索現有報告593(第一部分)”。594 595不要急着完成報告過程的這一步:花30到60分鐘甚至更多的時間可以爲你和其他人節省 /596減少相當多的時間和麻煩。597 598 599安裝一個新的內核進行測試600--------------------------601 602 *除非您已經在運行最新的“主線”Linux內核,否則最好在報告流程前安裝它。在603 某些情況下,使用最新的“穩定版”Linux進行測試和報告也是可以接受的替代方案;604 在合併窗口期間,這實際上可能是最好的方法,但在開發階段最好還是暫停幾天。605 無論你選擇什麼版本,最好使用“普通”構建。忽略這些建議會大大增加您的報告606 被拒絕或忽略的風險。*607 608正如第一步的詳細解釋中所提到的:與大多數程序員一樣,與大多數程序員一樣,Linux609內核開發人員不喜歡花時間處理他們維護的源代碼中根本不會發生的問題的報告。這隻610會浪費每個人的時間,尤其是你的時間。這就是爲什麼在報告問題之前,您必須先確認611問題仍然存在於最新的上游代碼中,這符合每個人的利益。您可以忽略此建議,但如前612所述:這樣做會極大地增加問題報告被拒絕或被忽略的風險。613 614內核“最新上游”的範圍通常指:615 616 * 安裝一個主線內核;最新的穩定版內核也可以是一個選擇,但大多數時候都最好避免。617 長期支持內核(有時稱爲“LTS內核”)不適合此流程。下一小節將更詳細地解釋所有618 這些。619 620 * 下一小節描述獲取和安裝這樣一個內核的方法。它還指出了使用預編譯內核是可以的,621 但普通的內核更好,這意味着:它是直接使用從 `kernel.org <https://kernel.org/>`_622 獲得的Linux源代碼構建並且沒有任何方式修改或增強。623 624 625選擇適合測試的版本626~~~~~~~~~~~~~~~~~~~~627 628前往 `kernel.org <https://kernel.org/>`_ 來決定使用哪個版本。忽略那個寫着629“Latest release最新版本”的巨大黃色按鈕,往下看有一個表格。在表格的頂部,你會630看到一行以“mainline”開頭的字樣,大多數情況下它會指向一個版本號類似“5.8-rc2”631的預發佈版本。如果是這樣的話,你將需要使用這個主線內核進行測試。不要讓“rc”632嚇到你,這些“開發版內核”實際上非常可靠——而且你已經按照上面的指示做了備份,633不是嗎?634 635大概每九到十週,“mainline”可能會給你指出一個版本號類似“5.7”的正式版本。如果636碰見這種情況,請考慮暫停報告過程,直到下一個版本的第一個預發佈(5.8-rc1)出637現在 `kernel.org <https://kernel.org/>`_ 上。這是因爲 Linux 的開發週期正在638兩週的“合併窗口”內。大部分的改動和所有干擾性的改動都會在這段時間內被合併到639下一個版本中。在此期間使用主線是比較危險的。內核開發者通常也很忙,可能沒有640多餘的時間來處理問題報告。這也是很有可能在合併窗口中應用了許多修改來修復你641所面臨的問題;這就是爲什麼你很快就得用一個新的內核版本重新測試,就像下面“發642布報告後的責任”一節中所述的那樣。643 644這就是爲什麼要等到合併窗口結束後纔去做。但是如果你處理的是一些不應該等待的645東西,則無需這樣做。在這種情況下,可以考慮通過 git 獲取最新的主線內核(見下646文),或者使用 kernel.org 上提供的最新穩定版本。如果 mainline 因爲某些原因647不無法正常工作,那麼使用它也是可以接受的。總的來說:用它來重現問題也比完全648不報告問題要好。649 650最好避免在合併窗口外使用最新的穩定版內核,因爲所有修復都必須首先應用於主線。651這就是爲什麼檢查最新的主線內核是如此重要:你希望看到在舊版本線修復的任何問題652需要先在主線修復,然後才能得到回傳,這可能需要幾天或幾周。另一個原因是:您653希望的修復對於回傳來說可能太難或太冒險;因此再次報告問題不太可能改變任何事情。654 655這些方面也部分表明了爲什麼長期支持內核(有時稱爲“LTS內核”)不適合報告流程:656它們與當前代碼的距離太遠。因此,先去測試主線,然後再按流程走:如果主線沒有657出現問題,流程將指導您如何在舊版本線中修復它。658 659如何獲得新的 Linux 內核660~~~~~~~~~~~~~~~~~~~~~~~~~661 662你可以使用預編譯或自編譯的內核進行測試;如果你選擇後者,可以使用 git 獲取源663代碼,或者下載其 tar 存檔包。664 665**使用預編譯的內核** :這往往是最快速、最簡單、最安全的方法——尤其是在你不熟666悉 Linux 內核的情況下。問題是:發行商或附加存儲庫提供的大多數版本都是從修改667過的Linux源代碼構建的。因此它們不是普通的,通常不適合於測試和問題報告:這些668更改可能會導致您面臨的問題或以某種方式影響問題。669 670但是如果您使用的是流行的Linux發行版,那麼您就很幸運了:對於大部分的發行版,671您可以在網上找到包含最新主線或穩定版本Linux內核包的存儲庫。使用這些是完全可672以的,只要從存儲庫的描述中確認它們是普通的或者至少接近普通。此外,請確保軟件673包包含kernel.org上提供的最新版本內核。如果這些軟件包的時間超過一週,那麼它們674可能就不合適了,因爲新的主線和穩定版內核通常至少每週發佈一次。675 676請注意,您以後可能需要手動構建自己的內核:有時這是調試或測試修復程序所必需的,677如後文所述。還要注意,預編譯的內核可能缺少在出現panic、Oops、warning或BUG時678解碼內核打印的消息所需的調試符號;如果您計劃解碼這些消息,最好自己編譯內核679(有關詳細信息,請參閱本小節結尾和“解碼失敗信息”小節)。680 681**使用git** :熟悉 git 的開發者和有經驗的 Linux 用戶通常最好直接從682`kernel.org 上的官方開發倉庫683<https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/>`_684中獲取最新的 Linux 內核源代碼。這些很可能比最新的主線預發佈版本更新一些。不685用擔心:它們和正式的預發佈版本一樣可靠,除非內核的開發週期目前正處於合併窗686口中。不過即便如此,它們也是相當可靠的。687 688**常規方法** :不熟悉 git 的人通常最好從 `kernel.org <https://kernel.org/>`_689下載源碼的tar 存檔包。690 691如何實際構建一個內核並不在這裏描述,因爲許多網站已經解釋了必要的步驟。如果692你是新手,可以考慮按照那些建議使用 ``make localmodconfig`` 來做,它將嘗試獲693取你當前內核的配置,然後根據你的系統進行一些調整。這樣做並不能使編譯出來的694內核更好,但可以更快地編譯。695 696注意:如果您正在處理來自內核的pannc、Oops、warning或BUG,請在配置內核時嘗試697啓用 CONFIG_KALLSYMS 選項。此外,還可以啓用 CONFIG_DEBUG_KERNEL 和698CONFIG_DEBUG_INFO;後者是相關選項,但只有啓用前者才能開啓。請注意,699CONFIG_DEBUG_INFO 會需要更多儲存空間來構建內核。但這是值得的,因爲這些選項將700允許您稍後精確定位觸發問題的確切代碼行。下面的“解碼失敗信息”一節對此進行了更701詳細的解釋。702 703但請記住:始終記錄遇到的問題,以防難以重現。發送未解碼的報告總比不報告要好。704 705 706檢查“污染”標誌707----------------708 709 *確保您剛剛安裝的內核在運行時不會“污染”自己。*710 711正如上面已經詳細介紹過的:當發生一些可能會導致一些看起來完全不相關的後續錯712誤的事情時,內核會設置一個“污染”標誌。這就是爲什麼你需要檢查你剛剛安裝的內713核是否有設置此標誌。如果有的話,幾乎在任何情況下你都需要在報告問題之前先消714除它。詳細的操作方法請看上面的章節。715 716 717用新內核重現問題718------------------719 720 *在您剛剛安裝的內核中復現這個問題。如果它沒有出現,請查看下方只發生在721 穩定版和長期支持內核的問題的說明。*722 723檢查這個問題是否發生在你剛剛安裝的新 Linux 內核版本上。如果新內核已經修復了,724可以考慮使用此版本線,放棄報告問題。但是請記住,只要它沒有在 `kernel.org725<https://kernel.org/>`_ 的穩定版和長期版(以及由這些版本衍生出來的廠商內核)726中得到修復,其他用戶可能仍然會受到它的困擾。如果你喜歡使用其中的一個,或727者只是想幫助它們的用戶,請前往下面的“報告只發生在較舊內核版本線的問題”一節。728 729 730優化復現問題的描述731--------------------732 733 *優化你的筆記:試着找到並寫出最直接的復現問題的方法。確保最終結果包含所734 有重要的細節,同時讓第一次聽說的人容易閱讀和理解。如果您在此過程中學到735 了一些東西,請考慮再次搜索關於該問題的現有報告。*736 737過於複雜的報告會讓別人很難理解。因此請儘量找到一個可以直接描述、易於以書面738形式理解的再現方法。包含所有重要的細節,但同時也要儘量保持簡短。739 740在這在前面的步驟中,你很可能已經瞭解了一些關於你所面臨的問題的點。利用這些741知識,再次搜索可以轉而加入的現有報告。742 743 744解碼失敗信息745-------------746 747 *如果失敗涉及“panic”、“Oops”、“warning”或“BUG”,請考慮解碼內核日誌以查找748 觸發錯誤的代碼行。*749 750當內核檢測到內部問題時,它會記錄一些有關已執行代碼的信息。這使得在源代碼中精751確定位觸發問題的行並顯示如何調用它成爲可能。但只有在配置內核時啓用了752CONFIG_DEBUG_INFO 和 CONFIG_KALLSYMS選項時,這種方法才起效。如果已啓用此選項,753請考慮解碼內核日誌中的信息。這將使我們更容易理解是什麼導致了“panic”、“Oops”、754“warning”或“BUG”,從而增加了有人提供修復的幾率。755 756解碼可以通過Linux源代碼樹中的腳本來完成。如果您運行的內核是之前自己編譯的,757這樣這樣調用它::758 759 [user@something ~]$ sudo dmesg | ./linux-5.10.5/scripts/decode_stacktrace.sh ./linux-5.10.5/vmlinux760 /usr/lib/debug/lib/modules/5.10.10-4.1.x86_64/vmlinux /usr/src/kernels/5.10.10-4.1.x86_64/761 762如果您運行的是打包好的普通內核,則可能需要安裝帶有調試符號的相應包。然後按以下763方式調用腳本(如果發行版未打包,則可能需要從Linux源代碼獲取)::764 765 [user@something ~]$ sudo dmesg | ./linux-5.10.5/scripts/decode_stacktrace.sh \766 /usr/lib/debug/lib/modules/5.10.10-4.1.x86_64/vmlinux /usr/src/kernels/5.10.10-4.1.x86_64/767 768腳本將解碼如下的日誌行,這些日誌行顯示內核在發生錯誤時正在執行的代碼的地址::769 770 [ 68.387301] RIP: 0010:test_module_init+0x5/0xffa [test_module]771 772解碼之後,這些行將變成這樣::773 774 [ 68.387301] RIP: 0010:test_module_init (/home/username/linux-5.10.5/test-module/test-module.c:16) test_module775 776在本例中,執行的代碼是從文件“~/linux-5.10.5/test-module/test-module.c”構建的,777錯誤出現在第16行的指令中。778 779該腳本也會如此解碼以“Call trace”開頭的部分中提到的地址,該部分顯示出現問題的780函數的路徑。此外,腳本還會顯示內核正在執行的代碼部分的彙編輸出。781 782注意,如果你沒法做到這一點,只需跳過這一步,並在報告中說明原因。如果你幸運的783話,可能無需解碼。如果需要的話,也許有人會幫你做這件事情。還要注意,這只是解784碼內核堆棧跟蹤的幾種方法之一。有時需要採取不同的步驟來檢索相關的詳細信息。785別擔心,如果您碰到的情況需要這樣做,開發人員會告訴您該怎麼做。786 787 788對迴歸的特別關照789-----------------790 791 *如果您的問題是迴歸問題,請儘可能縮小引入問題時的範圍。*792 793Linux 首席開發者 Linus Torvalds 認爲 Linux 內核永遠不應惡化,這就是爲什麼他794認爲迴歸是不可接受的,並希望看到它們被迅速修復。這就是爲什麼引入了迴歸的改795動導致的問題若無法通過其他方式快速解決,通常會被迅速撤銷。因此,報告迴歸有796點像“王炸”,會迅速得到修復。但要做到這一點,需要知道導致迴歸的變化。通常情797況下,要由報告者來追查罪魁禍首,因爲維護者往往沒有時間或手頭設置不便來自行798重現它。799 800有一個叫做“二分”的過程可以來尋找變化,這在801Documentation/translations/zh_CN/admin-guide/bug-bisect.rst 文檔中進行了詳細802的描述,這個過程通常需要你構建十到二十個內核鏡像,每次都嘗試在構建下一個鏡像803之前重現問題。是的,這需要花費一些時間,但不用擔心,它比大多數人想象的要快得多。804多虧了“binary search二分搜索”,這將引導你在源代碼管理系統中找到導致迴歸的提交。805一旦你找到它,就在網上搜索其主題、提交ID和縮短的提交ID(提交ID的前12個字符)。806如果有的話,這將引導您找到關於它的現有報告。807 808需要注意的是,二分法需要一點竅門,不是每個人都懂得訣竅,也需要相當多的努力,809不是每個人都願意投入。儘管如此,還是強烈建議自己進行一次二分。如果你真的810不能或者不想走這條路,至少要找出是哪個主線內核引入的迴歸。比如說從 5.5.15811切換到 5.8.4 的時候出現了一些問題,那麼至少可以嘗試一下相近的所有的主線版本812(5.6、5.7 和 5.8)來檢查它是什麼時候出現的。除非你想在一個穩定版或長期支持813內核中找到一個迴歸,否則要避免測試那些編號有三段的版本(5.6.12、5.7.8),因814爲那會使結果難以解釋,可能會讓你的測試變得無用。一旦你找到了引入迴歸的主要815版本,就可以放心地繼續報告了。但請記住:在不知道罪魁禍首的情況下,開發人員816是否能夠提供幫助取決於手頭的問題。有時他們可能會從報告中確認是什麼出現了問817題,並能修復它;有時他們可能無法提供幫助,除非你進行二分。818 819當處理迴歸問題時,請確保你所面臨的問題真的是由內核引起的,而不是由其他東西820引起的,如上文所述。821 822在整個過程中,請記住:只有當舊內核和新內核的配置相似時,問題纔算迴歸。這可以823通過 ``make olddefconfig`` 來實現,詳細解釋參見824Documentation/admin-guide/reporting-regressions.rst ;它還提供了大量其他您825可能希望瞭解的有關回歸的信息。826 827 828撰寫併發送報告829---------------830 831 *通過詳細描述問題來開始編寫報告。記得包括以下條目:您爲復現而安裝的最新832 內核版本、使用的Linux發行版以及關於如何復現該問題的說明。如果可能,將內833 核構建配置(.config)和 ``dmesg`` 的輸出放在網上的某個地方,並鏈接到它。834 包含或上傳所有其他可能相關的信息,如Oops的輸出/截圖或來自 ``lspci``835 的輸出。一旦你寫完了這個主要部分,請在上方插入一個正常長度的段落快速概836 述問題和影響。再在此之上添加一個簡單描述問題的句子,以得到人們的閱讀。837 現在給出一個更短的描述性標題或主題。然後就可以像MAINTAINERS文件告訴你的838 那樣發送或提交報告了,除非你在處理一個“高優先級問題”:它們需要按照下面839 “高優先級問題的特殊處理”所述特別關照。*840 841現在你已經準備好了一切,是時候寫你的報告了。上文前言中鏈接的三篇文檔對如何842寫報告做了部分解釋。這就是爲什麼本文將只提到一些基本的內容以及 Linux 內核特843有的東西。844 845有一點是符合這兩類的:你的報告中最關鍵的部分是標題/主題、第一句話和第一段。846開發者經常會收到許多郵件。因此,他們往往只是花幾秒鐘的時間瀏覽一下郵件,然847後再決定繼續下一封或仔細查看。因此,你報告的開頭越好,有人研究並幫助你的機848會就越大。這就是爲什麼你應該暫時忽略他們,先寫出詳細的報告。;-)849 850每份報告都應提及的事項851~~~~~~~~~~~~~~~~~~~~~~~~852 853詳細描述你的問題是如何發生在你安裝的新純淨內核上的。試着包含你之前寫的和優854化過的分步說明,概述你和其他人如何重現這個問題;在極少數無法重現的情況下,855儘量描述你做了什麼來觸發它。856 857還應包括其他人爲了解該問題及其環境而可能需要的所有相關信息。實際需要的東西858在很大程度上取決於具體問題,但有些事項你總是應該包括在內:859 860 * ``cat /proc/version`` 的輸出,其中包含 Linux 內核版本號和構建時的編譯器。861 862 * 機器正在運行的 Linux 發行版( ``hostnamectl | grep “Operating System“`` )863 864 * CPU 和操作系統的架構( ``uname -mi`` )865 866 * 如果您正在處理迴歸,並進行了二分,請提及導致迴歸的變更的主題和提交ID。867 868許多情況下,讓讀你報告的人多瞭解兩件事也是明智之舉:869 870 * 用於構建 Linux 內核的配置(“.config”文件)871 872 * 內核的信息,你從 ``dmesg`` 得到的信息寫到一個文件裏。確保它以像“Linux873 version 5.8-1 (foobar@example.com) (gcc (GCC) 10.2.1, GNU ld version874 2.34) #1 SMP Mon Aug 3 14:54:37 UTC 2020”這樣的行開始,如果沒有,那麼第875 一次啓動階段的重要信息已經被丟棄了。在這種情況下,可以考慮使用876 ``journalctl -b 0 -k`` ;或者你也可以重啓,重現這個問題,然後調用877 ``dmesg`` 。878 879這兩個文件很大,所以直接把它們放到你的報告中是個壞主意。如果你是在缺陷跟蹤880器中提交問題,那麼將它們附加到工單中。如果你通過郵件報告問題,不要用附件附881上它們,因爲那會使郵件變得太大,可以按下列之一做:882 883 * 將文件上傳到某個公開的地方(你的網站,公共文件粘貼服務,在884 `bugzilla.kernel.org <https://bugzilla.kernel.org/>`_ 上創建的工單……),885 並在你的報告中放上鍊接。理想情況下請使用允許這些文件保存很多年的地方,因886 爲它們可能在很多年後對別人有用;例如 5 年或 10 年後,一個開發者正在修改887 一些代碼,而這些代碼正是爲了修復你的問題。888 889 * 把文件放在一邊,然後說明你會在他人回覆時再單獨發送。只要記得報告發出去後,890 真正做到這一點就可以了。;-)891 892提供這些東西可能是明智的893~~~~~~~~~~~~~~~~~~~~~~~~~~894 895根據問題的不同,你可能需要提供更多的背景數據。這裏有一些關於提供什麼比較好896的建議:897 898 * 如果你處理的是內核的“warning”、“OOPS”或“panic”,請包含它。如果你不能複製899 粘貼它,試着用netconsole網絡終端遠程跟蹤或者至少拍一張屏幕的照片。900 901 * 如果問題可能與你的電腦硬件有關,請說明你使用的是什麼系統。例如,如果你的902 顯卡有問題,請提及它的製造商,顯卡的型號,以及使用的芯片。如果是筆記本電903 腦,請提及它的型號名稱,但儘量確保意義明確。例如“戴爾 XPS 13”就不很明確,904 因爲它可能是 2012 年的那款,那款除了看起來和現在銷售的沒有什麼不同之外,905 兩者沒有任何共同之處。因此,在這種情況下,要加上準確的型號,例如 2019906 年內推出的 XPS 13 型號爲“9380”或“7390”。像“聯想 Thinkpad T590”這樣的名字907 也有些含糊不清:這款筆記本有帶獨立顯卡和不帶的子型號,所以要儘量找到準確908 的型號名稱或註明主要部件。909 910 * 說明正在使用的相關軟件。如果你在加載模塊時遇到了問題,你要說明正在使用的911 kmod、systemd 和 udev 的版本。如果其中一個 DRM 驅動出現問題,你要說明912 libdrm 和 Mesa 的版本;還要說明你的 Wayland 合成器或 X-Server 及其驅動。913 如果你有文件系統問題,請註明相應的文件系統實用程序的版本(e2fsprogs,914 btrfs-progs, xfsprogs……)。915 916 * 從內核中收集可能有用的額外信息。例如, ``lspci -nn`` 的輸出可以幫助別人917 識別你使用的硬件。如果你的硬件有問題,你甚至可以給出 ``sudo lspci -vvv``918 的結果,因爲它提供了組件是如何配置的信息。對於一些問題,可能最好包含919 ``/proc/cpuinfo`` , ``/proc/ioports`` , ``/proc/iomem`` ,920 ``/proc/modules`` 或 ``/proc/scsi/scsi`` 等文件的內容。一些子系統還提921 供了收集相關信息的工具。 ``alsa-info.sh`` `就是這樣一個工具,它是音頻/聲922 音子系統開發者提供的 <https://www.alsa-project.org/wiki/AlsaInfo>`_ 。923 924這些例子應該會給你一些知識點,讓你知道附上什麼數據可能是明智的,但你自己也925要想一想,哪些數據對別人會有幫助。不要太擔心忘記一些東西,因爲開發人員會要926求提供他們需要的額外細節。但從一開始就把所有重要的東西都提供出來,會增加別927人仔細查看的機會。928 929 930重要部分:報告的開頭931~~~~~~~~~~~~~~~~~~~~~~932 933現在你已經準備好了報告的詳細部分,讓我們進入最重要的部分:開頭幾句。現在到934報告的最前面,在你剛纔寫的部分之前加上類似“The detailed description:”(詳細935描述)這樣的內容,並在最前面插入兩個新行。現在寫一個正常長度的段落,大致概936述這個問題。去掉所有枯燥的細節,把重點放在讀者需要知道的關鍵部分,以讓人了937解這是怎麼回事;如果你認爲這個缺陷影響了很多用戶,就提一下這點來吸引大家關938注。939 940做好這一點後,在頂部再插入兩行,寫一句話的摘要,快速解釋報告的內容。之後你941要更加抽象,爲報告寫一個更短的主題/標題。942 943現在你已經寫好了這部分,請花點時間來優化它,因爲它是你的報告中最重要的部分:944很多人會先讀這部分,然後纔會決定是否值得花時間閱讀其他部分。945 946現在就像 :ref:`MAINTAINERS <maintainers>` 維護者文件告訴你的那樣發送或提交947報告,除非它是前面概述的那些“高優先級問題”之一:在這種情況下,請先閱讀下一948小節,然後再發送報告。949 950高優先級問題的特殊處理951~~~~~~~~~~~~~~~~~~~~~~~~952 953高優先級問題的報告需要特殊處理。954 955**非常嚴重的缺陷** :確保在主題或工單標題以及第一段中明顯標出 severeness956(非常嚴重的)。957 958**迴歸** :報告的主題應以“[REGRESSION]”開頭。959 960如果您成功用二分法定位了問題,請使用引入迴歸之更改的標題作爲主題的第二部分。961請在報告中寫明“罪魁禍首”的提交ID。如果未能成功二分,請在報告中講明最後一個962正常工作的版本(例如5.7)和最先發生問題的版本(例如5.8-rc1)。963 964通過郵件發送報告時,請抄送Linux迴歸郵件列表(regressions@lists.linux.dev)。965如果報告需要提交到某個web追蹤器,請繼續提交;並在提交後,通過郵件將報告轉發966至迴歸列表;抄送相關子系統的維護人員和郵件列表。請確保報告是內聯轉發的,不要967把它作爲附件。另外請在頂部添加一個簡短的說明,在那裏寫上工單的網址。968 969在郵寄或轉發報告時,如果成功二分,需要將“罪魁禍首”的作者添加到收件人中;同時970抄送signed-off-by鏈中的每個人,您可以在提交消息的末尾找到。971 972**安全問題** :對於這種問題,你將必須評估:如果細節被公開披露,是否會對其他973用戶產生短期風險。如果不會,只需按照所述繼續報告問題。如果有此風險,你需要974稍微調整一下報告流程。975 976 * 如果 MAINTAINERS 文件指示您通過郵件報告問題,請不要抄送任何公共郵件列表。977 978 * 如果你應該在缺陷跟蹤器中提交問題,請確保將工單標記爲“私有”或“安全問題”。979 如果缺陷跟蹤器沒有提供保持報告私密性的方法,那就別想了,把你的報告以私人980 郵件的形式發送給維護者吧。981 982在這兩種情況下,都一定要將報告發到 MAINTAINERS 文件中“安全聯絡”部分列出的983地址。理想的情況是在發送報告的時候直接抄送他們。如果您在缺陷跟蹤器中提交了984報告,請將報告的文本轉發到這些地址;但請在報告的頂部加上註釋,表明您提交了985報告,並附上工單鏈接。986 987更多信息請參見 Documentation/translations/zh_CN/process/security-bugs.rst 。988 989 990發佈報告後的責任991------------------992 993 *等待別人的反應,繼續推進事情,直到你能夠接受這樣或那樣的結果。因此,請994 公開和及時地回應任何詢問。測試提出的修復。積極地測試:至少重新測試每個995 新主線版本的首個候選版本(RC),並報告你的結果。如果出現拖延,就友好地996 提醒一下。如果你沒有得到任何幫助或者未能滿意,請試着自己幫助自己。*997 998如果你的報告非常優秀,而且你真的很幸運,那麼某個開發者可能會立即發現導致問999題的原因;然後他們可能會寫一個補丁來修復、測試它,並直接發送給主線集成,同1000時標記它以便以後回溯到需要它的穩定版和長期支持內核。那麼你需要做的就是回覆1001一句“Thank you very much”(非常感謝),然後在發佈後換上修復好的版本。1002 1003但這種理想狀況很少發生。這就是爲什麼你把報告拿出來之後工作纔開始。你要做的1004事情要視情況而定,但通常會是下面列出的事情。但在深入研究細節之前,這裏有幾1005件重要的事情,你需要記住這部分的過程。1006 1007 1008關於進一步互動的一般建議1009~~~~~~~~~~~~~~~~~~~~~~~~~~1010 1011**總是公開回復** :當你在缺陷跟蹤器中提交問題時,一定要在那裏回覆,不要私下1012聯繫任何開發者。對於郵件報告,在回覆您收到的任何郵件時,總是使用“全部回覆”1013功能。這包括帶有任何你可能想要添加到你的報告中的額外數據的郵件:進入郵件應1014用程序“已發送”文件夾,並在郵件上使用“全部回覆”來回復報告。這種方法可以確保1015公共郵件列表和其他所有參與者都能及時瞭解情況;它還能保持郵件線程的完整性,1016這對於郵件列表將所有相關郵件歸爲一類是非常重要的。1017 1018只有兩種情況不適合在缺陷跟蹤器或“全部回覆”中發表評論:1019 1020 * 有人讓你私下發東西。1021 1022 * 你被告知要發送一些東西,但注意到其中包含需要保密的敏感信息。在這種情況下,1023 可以私下發送給要求發送的開發者。但要在工單或郵件中註明你是這麼做的,這1024 樣其他人就知道你尊重了這個要求。1025 1026**在請求解釋或幫助之前先研究一下** :在這部分過程中,有人可能會告訴你用尚未1027掌握的技能做一些事情。例如你可能會被要求使用一些你從未聽說過的測試工具;或1028者你可能會被要求在 Linux 內核源代碼上應用一個補丁來測試它是否有幫助。在某些1029情況下,發個回覆詢問如何做就可以了。但在走這條路之前,儘量通過在互聯網上搜1030索自行找到答案;或者考慮在其他地方詢問建議。比如詢問朋友,或者到你平時常去1031的聊天室或論壇發帖諮詢。1032 1033**要有耐心** :如果你真的很幸運,你可能會在幾個小時內收到對你的報告的答覆。1034但大多數情況下會花費更多的時間,因爲維護者分散在全球各地,因此可能在不同的1035時區——在那裏他們已經享受着遠離鍵盤的夜晚。1036 1037一般來說,內核開發者需要一到五個工作日來回復報告。有時會花費更長的時間,因1038爲他們可能正忙於合併窗口、其他工作、參加開發者會議,或者只是在享受一個漫長1039的暑假。1040 1041“高優先級的問題”(見上面的解釋)例外:維護者應該儘快解決這些問題;這就是爲1042什麼你應該最多等待一個星期(如果是緊急的事情,則只需兩天),然後再發送友好1043的提醒。1044 1045有時維護者可能沒有及時回覆;有時候可能會出現分歧,例如一個問題是否符合迴歸1046的條件。在這種情況下,在郵件列表上提出你的顧慮,並請求其他人公開或私下回復1047如何繼續推進。如果失敗了,可能應該讓更高級別的維護者介入。如果是 WiFi 驅動,1048那就是無線維護者;如果沒有更高級別的維護者,或者其他一切努力都失敗了,那1049這可能是一種罕見的、可以讓 Linus Torvalds 參與進來的情況。1050 1051**主動測試** :每當一個新的主線內核版本的第一個預發佈版本(rc1)發佈的時候,1052去檢查一下這個問題是否得到了解決,或者是否有什麼重要的變化。在工單中或在1053回覆報告的郵件中提及結果(確保所有參與討論的人都被抄送)。這將表明你的承諾1054和你願意幫忙。如果問題持續存在,它也會提醒開發者確保他們不會忘記它。其他一1055些不定期的重新測試(例如用rc3、rc5 和最終版本)也是一個好主意,但只有在相關1056的東西發生變化或者你正在寫什麼東西的時候才報告你的結果。1057 1058這些些常規的事情就不說了,我們來談談報告後如何幫助解決問題的細節。1059 1060查詢和測試請求1061~~~~~~~~~~~~~~~1062 1063如果你的報告得到了回覆則需履行以下責任:1064 1065**檢查與你打交道的人** :大多數情況下,會是維護者或特定代碼區域的開發人員對1066你的報告做出回應。但由於問題通常是公開報告的,所以回覆的可能是任何人——包括1067那些想要幫忙的人,但最後可能會用他們的問題或請求引導你完全偏離軌道。這很少1068發生,但這是快速上網搜搜看你正在與誰互動是明智之舉的許多原因之一。通過這樣1069做,你也可以知道你的報告是否被正確的人聽到,因爲如果討論沒有導致滿意的問題1070解決方案而淡出,之後可能需要提醒維護者(見下文)。1071 1072**查詢數據** :通常你會被要求測試一些東西或提供更多細節。儘快提供所要求的信1073息,因爲你已經得到了可能會幫助你的人的注意,你等待的時間越長就有越可能失去1074關注;如果你不在數個工作日內提供信息,甚至可能出現這種結果。1075 1076**測試請求** :當你被要求測試一個診斷補丁或可能的修復時,也要儘量及時測試。1077但要做得恰當,一定不要急於求成:混淆事情很容易發生,這會給所有人帶來許多困1078惑。例如一個常見的錯誤是以爲應用了一個帶修復的建議補丁,但事實上並沒有。即1079使是有經驗的測試人員也會偶爾發生這樣的事情,但當有修復的內核和沒有修復的內1080核表現得一樣時,他們大多時候會注意到。1081 1082當沒有任何實質性進展時該怎麼辦1083~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1084 1085有些報告不會得到負有相關責任的 Linux 內核開發者的任何反應;或者圍繞這個問題1086的討論有所發展,但漸漸淡出,沒有任何實質內容產出。1087 1088在這種情況下,要等兩個星期(最好是三個星期)後再發出友好的提醒:也許當你的1089報告到達時,維護者剛剛離開鍵盤一段時間,或者有更重要的事情要處理。在寫提醒1090信的時候,要善意地問一下,是否還需要你這邊提供什麼來讓事情推進下去。如果報1091告是通過郵件發出來的,那就在郵件的第一行回覆你的初始郵件(見上文),其中包1092括下方的原始報告的完整引用:這是少數幾種情況下,這樣的“TOFU”(Text Over,1093Fullquote Under文字在上,完整引用在下)是正確的做法,因爲這樣所有的收件人都1094會以適當的順序立即讓細節到手頭上來。1095 1096在提醒之後,再等三週的回覆。如果你仍然沒有得到適當的反饋,你首先應該重新考1097慮你的方法。你是否可能嘗試接觸了錯誤的人?是不是報告也許令人反感或者太混亂,1098以至於人們決定完全遠離它?排除這些因素的最好方法是:把報告給一兩個熟悉1099FLOSS 問題報告的人看,詢問他們的意見。同時徵求他們關於如何繼續推進的建議。1100這可能意味着:準備一份更好的報告,讓這些人在你發出去之前對它進行審查。這樣1101的方法完全可以;只需說明這是關於這個問題的第二份改進的報告,並附上第一份報1102告的鏈接。1103 1104如果報告是恰當的,你可以發送第二封提醒信;在其中詢問爲什麼報告沒有得到任何1105回覆。第二封提醒郵件的好時機是在新 Linux 內核版本的首個預發佈版本('rc1')1106發佈後不久,因爲無論如何你都應該在那個時候重新測試並提供狀態更新(見上文)。1107 1108如果第二次提醒的結果又在一週內沒有任何反應,可以嘗試聯繫上級維護者詢問意見:1109即使再忙的維護者在這時候也至少應該發過某種確認。1110 1111記住要做好失望的準備:理想狀況下維護者最好對每一個問題報告做出回應,但他們1112只有義務解決之前列出的“高優先級問題”。所以,如果你得到的回覆是“謝謝你的報告,1113我目前有更重要的問題要處理,在可預見的未來沒有時間去研究這個問題”,那請不1114要太沮喪。1115 1116也有可能在缺陷跟蹤器或列表中進行了一些討論之後,什麼都沒有發生,提醒也無助1117於激勵大家進行修復。這種情況可能是毀滅性的,但在 Linux 內核開發中確實會發生。1118這些和其他得不到幫助的原因在本文結尾處的“爲什麼有些問題在被報告後沒有得到1119任何回應或者仍然沒有修復”中進行了解釋。1120 1121如果你沒有得到任何幫助或問題最終沒有得到解決,不要沮喪:Linux 內核是 FLOSS,1122因此你仍然可以自己幫助自己。例如,你可以試着找到其他受影響的人,和他們一1123起合作來解決這個問題。這樣的團隊可以一起準備一份新的報告,提到團隊有多少人,1124爲什麼你們認爲這是應該得到解決的事情。也許你們還可以一起縮小確切原因或引1125入迴歸的變化,這往往會使修復更容易。而且如果運氣好的話,團隊中可能會有懂點1126編程的人,也許能寫出一個修復方案。1127 1128 1129 1130“報告穩定版和長期支持內核線的迴歸”的參考1131------------------------------------------1132 1133本小節提供了在穩定版和長期支持內核線中面對迴歸時需要執行的步驟的詳細信息。1134 1135確保特定版本線仍然受支持1136~~~~~~~~~~~~~~~~~~~~~~~~~1137 1138 *檢查內核開發人員是否仍然維護你關心的Linux內核版本線:去 kernel.org 的1139 首頁,確保此特定版本線的最新版沒有“[EOL]”標記。*1140 1141大多數內核版本線只支持三個月左右,因爲延長維護時間會帶來相當多的工作。因此,1142每年只會選擇一個版本來支持至少兩年(通常是六年)。這就是爲什麼你需要檢查1143內核開發者是否還支持你關心的版本線。1144 1145注意,如果 `kernel.org <https://kernel.org/>`_ 在首頁上列出了兩個“穩定”版本,1146你應該考慮切換到較新的版本,而忘掉較舊的版本:對它的支持可能很快就會結束。1147然後,它將被標記爲“生命週期結束”(EOL)。達到這個程度的版本線仍然會在1148`kernel.org <https://kernel.org/>`_ 首頁上被顯示一兩週,但不適合用於測試和1149報告。1150 1151搜索穩定版郵件列表1152~~~~~~~~~~~~~~~~~~~1153 1154 *檢查Linux穩定版郵件列表中的現有報告。*1155 1156也許你所面臨的問題已經被發現,並且已經或即將被修復。因此,請在 `Linux 穩定1157版郵件列表的檔案 <https://lore.kernel.org/stable/>`_ 中搜索類似問題的報告。1158如果你找到任何匹配的問題,可以考慮加入討論,除非修復工作已經完成並計劃很快1159得到應用。1160 1161用最新版本復現問題1162~~~~~~~~~~~~~~~~~~~1163 1164 *從特定的版本線安裝最新版本作爲純淨內核。確保這個內核沒有被污染,並且仍1165 然存在問題,因爲問題可能已經在那裏被修復了。*1166 1167在投入更多時間到這個過程中之前,你要檢查這個問題是否在你關注的版本線的最新1168版本中已經得到了修復。這個內核需要是純淨的,在問題發生之前不應該被污染,正1169如上面已經在測試主線的過程中詳細介紹過的一樣。1170 1171您是否是第一次注意到供應商內核的迴歸?供應商的更改可能會發生變化。你需要重新1172檢查排除來這個問題。當您從5.10.4-vendor.42更新到5.10.5-vendor.43時,記錄損壞1173的信息。然後在測試了前一段中所述的最新5.10版本之後,檢查Linux 5.10.4的普通版本1174是否也可以正常工作。如果問題在那裏出現,那就不符合上游迴歸的條件,您需要切換1175回主逐步指南來報告問題。1176 1177報告迴歸1178~~~~~~~~~~1179 1180 *向Linux穩定版郵件列表發送一個簡短的問題報告(stable@vger.kernel.org)並1181 抄送Linux迴歸郵件列表(regressions@lists.linux.dev);如果你懷疑是由某1182 子系統引起的,請抄送其維護人員和子系統郵件列表。大致描述問題,並解釋如1183 何復現。講清楚首個出現問題的版本和最後一個工作正常的版本。然後等待進一1184 步的指示。*1185 1186當報告在穩定版或長期支持內核線內發生的迴歸(例如在從5.10.4更新到5.10.5時),1187一份簡短的報告足以快速報告問題。因此只需向穩定版和迴歸郵件列表發送粗略的描述;1188不過如果你懷疑某子系統導致此問題的話,請一併抄送其維護人員和子系統郵件列表,1189這會加快進程。1190 1191請注意,如果您能夠指明引入問題的確切版本,這將對開發人員有很大幫助。因此1192如果有時間的話,請嘗試使用普通內核找到該版本。讓我們假設發行版發佈Linux內核11935.10.5到5.10.8的更新時發生了故障。那麼按照上面的指示,去檢查該版本線中的最新1194內核,比如5.10.9。如果問題出現,請嘗試普通5.10.5,以確保供應商應用的補丁不會1195干擾。如果問題沒有出現,那麼嘗試5.10.7,然後直到5.10.8或5.10.6(取決於結果)1196找到第一個引入問題的版本。在報告中寫明這一點,並指出5.10.9仍然存在故障。1197 1198前一段基本粗略地概述了“二分”方法。一旦報告出來,您可能會被要求做一個正確的1199報告,因爲它允許精確地定位導致問題的確切更改(然後很容易被恢復以快速修復問題)。1200因此如果時間允許,考慮立即進行適當的二分。有關如何詳細信息,請參閱“對迴歸的1201特別關照”部分和文檔 Documentation/translations/zh_CN/admin-guide/bug-bisect.rst 。1202如果成功二分的話,請將“罪魁禍首”的作者添加到收件人中;同時抄送所有在1203signed-off-by鏈中的人,您可以在提交消息的末尾找到。1204 1205 1206“報告僅在舊內核版本線中發生的問題”的參考1207----------------------------------------1208 1209本節詳細介紹瞭如果無法用主線內核重現問題,但希望在舊版本線(又稱穩定版內核和1210長期支持內核)中修復問題時需要採取的步驟。1211 1212有些修復太複雜1213~~~~~~~~~~~~~~~1214 1215 *請做好準備,接下來的幾個步驟可能無法在舊版本中解決問題:修復可能太大或1216 太冒險,無法移植到那裏。*1217 1218即使是微小的、看似明顯的代碼變化,有時也會帶來新的、完全意想不到的問題。穩1219定版和長期支持內核的維護者非常清楚這一點,因此他們只對這些內核進行符合1220Documentation/translations/zh_CN/process/stable-kernel-rules.rst 中所列出的1221規則的修改。1222 1223複雜或有風險的修改不符合條件,因此只能應用於主線。其他的修復很容易被回溯到1224最新的穩定版和長期支持內核,但是風險太大,無法集成到舊版內核中。所以要注意1225你所希望的修復可能是那些不會被回溯到你所關心的版本線的修復之一。在這種情況1226下,你將別無選擇,要麼忍受這個問題,要麼切換到一個較新的 Linux 版本,除非你1227想自己把修復補丁應用到你的內核中。1228 1229通用準備1230~~~~~~~~~~1231 1232 *執行上面“報告僅在舊內核版本線中發生的問題”一節中的前三個步驟。*1233 1234您需要執行本指南另一節中已經描述的幾個步驟。這些步驟將讓您:1235 1236 * 檢查內核開發人員是否仍然維護您關心的Linux內核版本行。1237 1238 * 在Linux穩定郵件列表中搜索退出的報告。1239 1240 * 檢查最新版本。1241 1242 1243檢查代碼歷史和搜索現有的討論1244~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1245 1246 *在Linux內核版本控制系統中搜索修復主線問題的更改,因爲它的提交消息可能1247 會告訴你修復是否已經計劃好了支持。如果你沒有找到,搜索適當的郵件列表,1248 尋找討論此類問題或同行評議可能修復的帖子;然後檢查討論是否認爲修復不適1249 合支持。如果支持根本不被考慮,加入最新的討論,詢問是否有可能。*1250 1251在許多情況下,你所處理的問題會發生在主線上,但已在主線上得到了解決。修正它1252的提交也需要被回溯才能解決這個問題。這就是爲什麼你要搜索它或任何相關討論。1253 1254 * 首先嚐試在存放 Linux 內核源代碼的 Git 倉庫中找到修復。你可以通過1255 `kernel.org 上的網頁1256 <https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/>`_1257 或 `GitHub 上的鏡像 <https://github.com/torvalds/linux>`_ 來實現;如果你1258 有一個本地克隆,你也可以在命令行用 ``git log --grep=<pattern>`` 來搜索。1259 1260 如果你找到了修復,請查看提交消息的尾部是否包含了類似這樣的“穩定版標籤”:1261 1262 Cc: <stable@vger.kernel.org> # 5.4+1263 1264 像上面這行,開發者標記了安全修復可以回傳到 5.4 及以後的版本。大多數情況1265 下,它會在兩週內被應用到那裏,但有時需要更長的時間。1266 1267 * 如果提交沒有告訴你任何東西,或者你找不到修復,請再找找關於這個問題的討論。1268 用你最喜歡的搜索引擎搜索網絡,以及 `Linux kernel developers mailing1269 list 內核開發者郵件列表 <https://lore.kernel.org/lkml/>`_ 的檔案。也可以1270 閱讀上面的 `定位導致問題的內核區域` 一節,然後按照說明找到導致問題的子系1271 統:它的缺陷跟蹤器或郵件列表存檔中可能有你要找的答案。1272 1273 * 如果你看到了一個計劃的修復,請按上所述在版本控制系統中搜索它,因爲提交可1274 能會告訴你是否可以進行回溯。1275 1276 * 檢查討論中是否有任何跡象表明,該修復程序可能風險太大,無法回溯到你關心1277 的版本線。如果是這樣的話,你必須忍受這個問題,或者切換到應用了修復的內1278 核版本線。1279 1280 * 如果修復的問題未包含穩定版標籤,並且沒有討論過回溯問題,請加入討論:如1281 果合適的話,請提及你所面對的問題的版本,以及你希望看到它被修復。1282 1283 1284請求建議1285~~~~~~~~~1286 1287 *前面的步驟之一應該會給出一個解決方案。如果仍未能成功,請向可能引起問題1288 的子系統的維護人員詢問建議;抄送特定子系統的郵件列表以及穩定版郵件列表。*1289 1290如果前面的三個步驟都沒有讓你更接近解決方案,那麼只剩下一個選擇:請求建議。1291在你發給可能是問題根源的子系統的維護者的郵件中這樣做;抄送子系統的郵件列表1292以及穩定版郵件列表(stable@vger.kernel.org)。1293 1294 1295爲什麼有些問題在報告後沒有任何回應或仍未解決?1296===============================================1297 1298當向 Linux 開發者報告問題時,要注意只有“高優先級的問題”(迴歸、安全問題、嚴1299重問題)才一定會得到解決。如果維護者或其他人都失敗了,Linus Torvalds 他自己1300會確保這一點。他們和其他內核開發者也會解決很多其他問題。但是要知道,有時他1301們也會不能或不願幫忙;有時甚至沒有人發報告給他們。1302 1303最好的解釋就是那些內核開發者常常是在業餘時間爲 Linux 內核做出貢獻。內核中的1304不少驅動程序都是由這樣的程序員編寫的,往往只是因爲他們想讓自己的硬件可以在1305自己喜歡的操作系統上使用。1306 1307這些程序員大多數時候會很樂意修復別人報告的問題。但是沒有人可以強迫他們這樣1308做,因爲他們是自願貢獻的。1309 1310還有一些情況下,這些開發者真的很想解決一個問題,但卻不能解決:有時他們缺乏1311硬件編程文檔來解決問題。這種情況往往由於公開的文檔太簡陋,或者驅動程序是通1312過逆向工程編寫的。1313 1314業餘開發者遲早也會不再關心某驅動。也許他們的測試硬件壞了,被更高級的玩意取1315代了,或者是太老了以至於只能在計算機博物館裏找到。有時開發者根本就不關心他1316們的代碼和 Linux 了,因爲在他們的生活中一些不同的東西變得更重要了。在某些情1317況下,沒有人願意接手維護者的工作——也沒有人可以被強迫,因爲對 Linux 內核的貢1318獻是自願的。然而被遺棄的驅動程序仍然存在於內核中:它們對人們仍然有用,刪除1319它們可能導致迴歸。1320 1321對於那些爲 Linux 內核工作而獲得報酬的開發者來說,情況並沒有什麼不同。這些人1322現在貢獻了大部分的變更。但是他們的僱主遲早也會停止關注他們的代碼或者讓程序1323員專注於其他事情。例如,硬件廠商主要通過銷售新硬件來賺錢;因此,他們中的不1324少人並沒有投入太多時間和精力來維護他們多年前就停止銷售的東西的 Linux 內核驅1325動。企業級 Linux 發行商往往持續維護的時間比較長,但在新版本中往往會把對老舊1326和稀有硬件的支持放在一邊,以限制範圍。一旦公司拋棄了一些代碼,往往由業餘貢1327獻者接手,但正如上面提到的:他們遲早也會放下代碼。1328 1329優先級是一些問題沒有被修復的另一個原因,因爲維護者相當多的時候是被迫設置這1330些優先級的,因爲在 Linux 上工作的時間是有限的。對於業餘時間或者僱主給予他們1331的開發人員用於上游內核維護工作的時間也是如此。有時維護人員也會被報告淹沒,1332即使一個驅動程序幾乎完美地工作。爲了不被完全纏住,程序員可能別無選擇,只能1333對問題報告進行優先級排序而拒絕其中的一些報告。1334 1335不過這些都不用太過擔心,很多驅動都有積極的維護者,他們對儘可能多的解決問題1336相當感興趣。1337 1338 1339結束語1340=======1341 1342與其他免費/自由&開源軟件(Free/Libre & Open Source Software,FLOSS)相比,1343向 Linux 內核開發者報告問題是很難的:這個文檔的長度和複雜性以及字裏行間的內1344涵都說明了這一點。但目前就是這樣了。這篇文字的主要作者希望通過記錄現狀來爲1345以後改善這種狀況打下一些基礎。1346 1347 1348..1349 end-of-content1350..1351 This English version of this document is maintained by Thorsten Leemhuis1352 <linux@leemhuis.info>. If you spot a typo or small mistake, feel free to1353 let him know directly and he'll fix it. For translation problems, please1354 contact with translators. You are free to do the same in a mostly informal1355 way if you want to contribute changes to the text, but for copyright1356 reasons please CC linux-doc@vger.kernel.org and "sign-off" your1357 contribution as Documentation/process/submitting-patches.rst outlines in1358 the section "Sign your work - the Developer's Certificate of Origin".1359..1360 This text is available under GPL-2.0+ or CC-BY-4.0, as stated at the top1361 of the file. If you want to distribute this text under CC-BY-4.0 only,1362 please use "The Linux kernel developers" for author attribution and link1363 this as source:1364 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/Documentation/admin-guide/reporting-issues.rst1365..1366 Note: Only the content of this RST file as found in the Linux kernel sources1367 is available under CC-BY-4.0, as versions of this text that were processed1368 (for example by the kernel's build system) might contain content taken from1369 files which use a more restrictive license.1370 1371