176f1fc26SHu Haowen.. SPDX-License-Identifier: GPL-2.0 276f1fc26SHu Haowen 376f1fc26SHu Haowen.. include:: ../disclaimer-zh_TW.rst 476f1fc26SHu Haowen 576f1fc26SHu Haowen:Original: Documentation/admin-guide/README.rst 676f1fc26SHu Haowen 776f1fc26SHu Haowen:譯者: 876f1fc26SHu Haowen 976f1fc26SHu Haowen 吳想成 Wu XiangCheng <bobwxc@email.cn> 10*44a54e25SHu Haowen 胡皓文 Hu Haowen <src.res.211@gmail.com> 1176f1fc26SHu Haowen 1276f1fc26SHu HaowenLinux內核5.x版本 <http://kernel.org/> 1376f1fc26SHu Haowen========================================= 1476f1fc26SHu Haowen 1576f1fc26SHu Haowen以下是Linux版本5的發行註記。仔細閱讀它們, 1676f1fc26SHu Haowen它們會告訴你這些都是什麼,解釋如何安裝內核,以及遇到問題時該如何做。 1776f1fc26SHu Haowen 1876f1fc26SHu Haowen什麼是Linux? 1976f1fc26SHu Haowen--------------- 2076f1fc26SHu Haowen 2176f1fc26SHu Haowen Linux是Unix作業系統的克隆版本,由Linus Torvalds在一個鬆散的網絡黑客 2276f1fc26SHu Haowen (Hacker,無貶義)團隊的幫助下從頭開始編寫。它旨在實現兼容POSIX和 2376f1fc26SHu Haowen 單一UNIX規範。 2476f1fc26SHu Haowen 2576f1fc26SHu Haowen 它具有在現代成熟的Unix中應當具有的所有功能,包括真正的多任務處理、虛擬內存、 2676f1fc26SHu Haowen 共享庫、按需加載、共享的寫時拷貝(COW)可執行文件、恰當的內存管理以及包括 2776f1fc26SHu Haowen IPv4和IPv6在內的複合網絡棧。 2876f1fc26SHu Haowen 2976f1fc26SHu Haowen Linux在GNU通用公共許可證,版本2(GNU GPLv2)下分發,詳見隨附的COPYING文件。 3076f1fc26SHu Haowen 3176f1fc26SHu Haowen它能在什麼樣的硬體上運行? 3276f1fc26SHu Haowen----------------------------- 3376f1fc26SHu Haowen 3476f1fc26SHu Haowen 雖然Linux最初是爲32位的x86 PC機(386或更高版本)開發的,但今天它也能運行在 3576f1fc26SHu Haowen (至少)Compaq Alpha AXP、Sun SPARC與UltraSPARC、Motorola 68000、PowerPC、 3676f1fc26SHu Haowen PowerPC64、ARM、Hitachi SuperH、Cell、IBM S/390、MIPS、HP PA-RISC、Intel 3776f1fc26SHu Haowen IA-64、DEC VAX、AMD x86-64 Xtensa和ARC架構上。 3876f1fc26SHu Haowen 3976f1fc26SHu Haowen Linux很容易移植到大多數通用的32位或64位體系架構,只要它們有一個分頁內存管理 4076f1fc26SHu Haowen 單元(PMMU)和一個移植的GNU C編譯器(gcc;GNU Compiler Collection,GCC的一 4176f1fc26SHu Haowen 部分)。Linux也被移植到許多沒有PMMU的體系架構中,儘管功能顯然受到了一定的 4276f1fc26SHu Haowen 限制。 4376f1fc26SHu Haowen Linux也被移植到了其自己上。現在可以將內核作爲用戶空間應用程式運行——這被 4476f1fc26SHu Haowen 稱爲用戶模式Linux(UML)。 4576f1fc26SHu Haowen 4676f1fc26SHu Haowen文檔 4776f1fc26SHu Haowen----- 4876f1fc26SHu Haowen網際網路上和書籍上都有大量的電子文檔,既有Linux專屬文檔,也有與一般UNIX問題相關 4976f1fc26SHu Haowen的文檔。我建議在任何Linux FTP站點上查找LDP(Linux文檔項目)書籍的文檔子目錄。 5076f1fc26SHu Haowen本自述文件並不是關於系統的文檔:有更好的可用資源。 5176f1fc26SHu Haowen 5276f1fc26SHu Haowen - 網際網路上和書籍上都有大量的(電子)文檔,既有Linux專屬文檔,也有與普通 5376f1fc26SHu Haowen UNIX問題相關的文檔。我建議在任何有LDP(Linux文檔項目)書籍的Linux FTP 5476f1fc26SHu Haowen 站點上查找文檔子目錄。本自述文件並不是關於系統的文檔:有更好的可用資源。 5576f1fc26SHu Haowen 5676f1fc26SHu Haowen - 文檔/子目錄中有各種自述文件:例如,這些文件通常包含一些特定驅動程序的 5776f1fc26SHu Haowen 內核安裝說明。請閱讀 5876f1fc26SHu Haowen :ref:`Documentation/process/changes.rst <changes>` 文件,它包含了升級內核 5976f1fc26SHu Haowen 可能會導致的問題的相關信息。 6076f1fc26SHu Haowen 6176f1fc26SHu Haowen安裝內核原始碼 6276f1fc26SHu Haowen--------------- 6376f1fc26SHu Haowen 6476f1fc26SHu Haowen - 如果您要安裝完整的原始碼,請把內核tar檔案包放在您有權限的目錄中(例如您 6576f1fc26SHu Haowen 的主目錄)並將其解包:: 6676f1fc26SHu Haowen 6776f1fc26SHu Haowen xz -cd linux-5.x.tar.xz | tar xvf - 6876f1fc26SHu Haowen 6976f1fc26SHu Haowen 將「X」替換成最新內核的版本號。 7076f1fc26SHu Haowen 7176f1fc26SHu Haowen 【不要】使用 /usr/src/linux 目錄!這裡有一組庫頭文件使用的內核頭文件 7276f1fc26SHu Haowen (通常是不完整的)。它們應該與庫匹配,而不是被內核的變化搞得一團糟。 7376f1fc26SHu Haowen 7476f1fc26SHu Haowen - 您還可以通過打補丁在5.x版本之間升級。補丁以xz格式分發。要通過打補丁進行 7576f1fc26SHu Haowen 安裝,請獲取所有較新的補丁文件,進入內核原始碼(linux-5.x)的目錄並 7676f1fc26SHu Haowen 執行:: 7776f1fc26SHu Haowen 7876f1fc26SHu Haowen xz -cd ../patch-5.x.xz | patch -p1 7976f1fc26SHu Haowen 8076f1fc26SHu Haowen 請【按順序】替換所有大於當前原始碼樹版本的「x」,這樣就可以了。您可能想要 8176f1fc26SHu Haowen 刪除備份文件(文件名類似xxx~ 或 xxx.orig),並確保沒有失敗的補丁(文件名 8276f1fc26SHu Haowen 類似xxx# 或 xxx.rej)。如果有,不是你就是我犯了錯誤。 8376f1fc26SHu Haowen 8476f1fc26SHu Haowen 與5.x內核的補丁不同,5.x.y內核(也稱爲穩定版內核)的補丁不是增量的,而是 8576f1fc26SHu Haowen 直接應用於基本的5.x內核。例如,如果您的基本內核是5.0,並且希望應用5.0.3 8676f1fc26SHu Haowen 補丁,則不應先應用5.0.1和5.0.2的補丁。類似地,如果您運行的是5.0.2內核, 8776f1fc26SHu Haowen 並且希望跳轉到5.0.3,那麼在應用5.0.3補丁之前,必須首先撤銷5.0.2補丁 8876f1fc26SHu Haowen (即patch -R)。更多關於這方面的內容,請閱讀 8976f1fc26SHu Haowen :ref:`Documentation/process/applying-patches.rst <applying_patches>` 。 9076f1fc26SHu Haowen 9176f1fc26SHu Haowen 或者,腳本 patch-kernel 可以用來自動化這個過程。它能確定當前內核版本並 9276f1fc26SHu Haowen 應用找到的所有補丁:: 9376f1fc26SHu Haowen 9476f1fc26SHu Haowen linux/scripts/patch-kernel linux 9576f1fc26SHu Haowen 9676f1fc26SHu Haowen 上面命令中的第一個參數是內核原始碼的位置。補丁是在當前目錄應用的,但是 9776f1fc26SHu Haowen 可以將另一個目錄指定爲第二個參數。 9876f1fc26SHu Haowen 9976f1fc26SHu Haowen - 確保沒有過時的 .o 文件和依賴項:: 10076f1fc26SHu Haowen 10176f1fc26SHu Haowen cd linux 10276f1fc26SHu Haowen make mrproper 10376f1fc26SHu Haowen 10476f1fc26SHu Haowen 現在您應該已經正確安裝了原始碼。 10576f1fc26SHu Haowen 10676f1fc26SHu Haowen軟體要求 10776f1fc26SHu Haowen--------- 10876f1fc26SHu Haowen 10976f1fc26SHu Haowen 編譯和運行5.x內核需要各種軟體包的最新版本。請參考 11076f1fc26SHu Haowen :ref:`Documentation/process/changes.rst <changes>` 11176f1fc26SHu Haowen 來了解最低版本要求以及如何升級軟體包。請注意,使用過舊版本的這些包可能會 11276f1fc26SHu Haowen 導致很難追蹤的間接錯誤,因此不要以爲在生成或操作過程中出現明顯問題時可以 11376f1fc26SHu Haowen 只更新包。 11476f1fc26SHu Haowen 11576f1fc26SHu Haowen爲內核建立目錄 11676f1fc26SHu Haowen--------------- 11776f1fc26SHu Haowen 11876f1fc26SHu Haowen 編譯內核時,默認情況下所有輸出文件都將與內核原始碼放在一起。使用 11976f1fc26SHu Haowen ``make O=output/dir`` 選項可以爲輸出文件(包括 .config)指定備用位置。 12076f1fc26SHu Haowen 例如:: 12176f1fc26SHu Haowen 12276f1fc26SHu Haowen kernel source code: /usr/src/linux-5.x 12376f1fc26SHu Haowen build directory: /home/name/build/kernel 12476f1fc26SHu Haowen 12576f1fc26SHu Haowen 要配置和構建內核,請使用:: 12676f1fc26SHu Haowen 12776f1fc26SHu Haowen cd /usr/src/linux-5.x 12876f1fc26SHu Haowen make O=/home/name/build/kernel menuconfig 12976f1fc26SHu Haowen make O=/home/name/build/kernel 13076f1fc26SHu Haowen sudo make O=/home/name/build/kernel modules_install install 13176f1fc26SHu Haowen 13276f1fc26SHu Haowen 請注意:如果使用了 ``O=output/dir`` 選項,那麼它必須用於make的所有調用。 13376f1fc26SHu Haowen 13476f1fc26SHu Haowen配置內核 13576f1fc26SHu Haowen--------- 13676f1fc26SHu Haowen 13776f1fc26SHu Haowen 即使只升級一個小版本,也不要跳過此步驟。每個版本中都會添加新的配置選項, 13876f1fc26SHu Haowen 如果配置文件沒有按預定設置,就會出現奇怪的問題。如果您想以最少的工作量 13976f1fc26SHu Haowen 將現有配置升級到新版本,請使用 ``makeoldconfig`` ,它只會詢問您新配置 14076f1fc26SHu Haowen 選項的答案。 14176f1fc26SHu Haowen 14276f1fc26SHu Haowen - 其他配置命令包括:: 14376f1fc26SHu Haowen 14476f1fc26SHu Haowen "make config" 純文本界面。 14576f1fc26SHu Haowen 14676f1fc26SHu Haowen "make menuconfig" 基於文本的彩色菜單、選項列表和對話框。 14776f1fc26SHu Haowen 14876f1fc26SHu Haowen "make nconfig" 增強的基於文本的彩色菜單。 14976f1fc26SHu Haowen 15076f1fc26SHu Haowen "make xconfig" 基於Qt的配置工具。 15176f1fc26SHu Haowen 15276f1fc26SHu Haowen "make gconfig" 基於GTK+的配置工具。 15376f1fc26SHu Haowen 15476f1fc26SHu Haowen "make oldconfig" 基於現有的 ./.config 文件選擇所有選項,並詢問 15576f1fc26SHu Haowen 新配置選項。 15676f1fc26SHu Haowen 15776f1fc26SHu Haowen "make olddefconfig" 15876f1fc26SHu Haowen 類似上一個,但不詢問直接將新選項設置爲默認值。 15976f1fc26SHu Haowen 16076f1fc26SHu Haowen "make defconfig" 根據體系架構,使用arch/$arch/defconfig或 16176f1fc26SHu Haowen arch/$arch/configs/${PLATFORM}_defconfig中的 16276f1fc26SHu Haowen 默認選項值創建./.config文件。 16376f1fc26SHu Haowen 16476f1fc26SHu Haowen "make ${PLATFORM}_defconfig" 16576f1fc26SHu Haowen 使用arch/$arch/configs/${PLATFORM}_defconfig中 16676f1fc26SHu Haowen 的默認選項值創建一個./.config文件。 16776f1fc26SHu Haowen 用「makehelp」來獲取您體系架構中所有可用平台的列表。 16876f1fc26SHu Haowen 16976f1fc26SHu Haowen "make allyesconfig" 17076f1fc26SHu Haowen 通過儘可能將選項值設置爲「y」,創建一個 17176f1fc26SHu Haowen ./.config文件。 17276f1fc26SHu Haowen 17376f1fc26SHu Haowen "make allmodconfig" 17476f1fc26SHu Haowen 通過儘可能將選項值設置爲「m」,創建一個 17576f1fc26SHu Haowen ./.config文件。 17676f1fc26SHu Haowen 17776f1fc26SHu Haowen "make allnoconfig" 通過儘可能將選項值設置爲「n」,創建一個 17876f1fc26SHu Haowen ./.config文件。 17976f1fc26SHu Haowen 18076f1fc26SHu Haowen "make randconfig" 通過隨機設置選項值來創建./.config文件。 18176f1fc26SHu Haowen 18276f1fc26SHu Haowen "make localmodconfig" 基於當前配置和加載的模塊(lsmod)創建配置。禁用 18376f1fc26SHu Haowen 已加載的模塊不需要的任何模塊選項。 18476f1fc26SHu Haowen 18576f1fc26SHu Haowen 要爲另一台計算機創建localmodconfig,請將該計算機 18676f1fc26SHu Haowen 的lsmod存儲到一個文件中,並將其作爲lsmod參數傳入。 18776f1fc26SHu Haowen 18876f1fc26SHu Haowen 此外,通過在參數LMC_KEEP中指定模塊的路徑,可以將 18976f1fc26SHu Haowen 模塊保留在某些文件夾或kconfig文件中。 19076f1fc26SHu Haowen 19176f1fc26SHu Haowen target$ lsmod > /tmp/mylsmod 19276f1fc26SHu Haowen target$ scp /tmp/mylsmod host:/tmp 19376f1fc26SHu Haowen 19476f1fc26SHu Haowen host$ make LSMOD=/tmp/mylsmod \ 19576f1fc26SHu Haowen LMC_KEEP="drivers/usb:drivers/gpu:fs" \ 19676f1fc26SHu Haowen localmodconfig 19776f1fc26SHu Haowen 19876f1fc26SHu Haowen 上述方法在交叉編譯時也適用。 19976f1fc26SHu Haowen 20076f1fc26SHu Haowen "make localyesconfig" 與localmodconfig類似,只是它會將所有模塊選項轉換 20176f1fc26SHu Haowen 爲內置(=y)。你可以同時通過LMC_KEEP保留模塊。 20276f1fc26SHu Haowen 20376f1fc26SHu Haowen "make kvmconfig" 爲kvm客體內核支持啓用其他選項。 20476f1fc26SHu Haowen 20576f1fc26SHu Haowen "make xenconfig" 爲xen dom0客體內核支持啓用其他選項。 20676f1fc26SHu Haowen 20776f1fc26SHu Haowen "make tinyconfig" 配置儘可能小的內核。 20876f1fc26SHu Haowen 20976f1fc26SHu Haowen 更多關於使用Linux內核配置工具的信息,見文檔 21076f1fc26SHu Haowen Documentation/kbuild/kconfig.rst。 21176f1fc26SHu Haowen 21276f1fc26SHu Haowen - ``make config`` 注意事項: 21376f1fc26SHu Haowen 21476f1fc26SHu Haowen - 包含不必要的驅動程序會使內核變大,並且在某些情況下會導致問題: 21576f1fc26SHu Haowen 探測不存在的控制器卡可能會混淆其他控制器。 21676f1fc26SHu Haowen 21776f1fc26SHu Haowen - 如果存在協處理器,則編譯了數學仿真的內核仍將使用協處理器:在 21876f1fc26SHu Haowen 這種情況下,數學仿真永遠不會被使用。內核會稍微大一點,但不管 21976f1fc26SHu Haowen 是否有數學協處理器,都可以在不同的機器上工作。 22076f1fc26SHu Haowen 22176f1fc26SHu Haowen - 「kernel hacking」配置細節通常會導致更大或更慢的內核(或兩者 22276f1fc26SHu Haowen 兼而有之),甚至可以通過配置一些例程來主動嘗試破壞壞代碼以發現 22376f1fc26SHu Haowen 內核問題,從而降低內核的穩定性(kmalloc())。因此,您可能應該 22476f1fc26SHu Haowen 用於研究「開發」、「實驗」或「調試」特性相關問題。 22576f1fc26SHu Haowen 22676f1fc26SHu Haowen編譯內核 22776f1fc26SHu Haowen--------- 22876f1fc26SHu Haowen 229df26327eSLinus Torvalds - 確保您至少有gcc 5.1可用。 23076f1fc26SHu Haowen 有關更多信息,請參閱 :ref:`Documentation/process/changes.rst <changes>` 。 23176f1fc26SHu Haowen 23276f1fc26SHu Haowen 請注意,您仍然可以使用此內核運行a.out用戶程序。 23376f1fc26SHu Haowen 23476f1fc26SHu Haowen - 執行 ``make`` 來創建壓縮內核映像。如果您安裝了lilo以適配內核makefile, 23576f1fc26SHu Haowen 那麼也可以進行 ``makeinstall`` ,但是您可能需要先檢查特定的lilo設置。 23676f1fc26SHu Haowen 23776f1fc26SHu Haowen 實際安裝必須以root身份執行,但任何正常構建都不需要。 23876f1fc26SHu Haowen 無須徒然使用root身份。 23976f1fc26SHu Haowen 24076f1fc26SHu Haowen - 如果您將內核的任何部分配置爲模塊,那麼還必須執行 ``make modules_install`` 。 24176f1fc26SHu Haowen 24276f1fc26SHu Haowen - 詳細的內核編譯/生成輸出: 24376f1fc26SHu Haowen 24476f1fc26SHu Haowen 通常,內核構建系統在相當安靜的模式下運行(但不是完全安靜)。但是有時您或 24576f1fc26SHu Haowen 其他內核開發人員需要看到編譯、連結或其他命令的執行過程。爲此,可使用 24676f1fc26SHu Haowen 「verbose(詳細)」構建模式。 24776f1fc26SHu Haowen 向 ``make`` 命令傳遞 ``V=1`` 來實現,例如:: 24876f1fc26SHu Haowen 24976f1fc26SHu Haowen make V=1 all 25076f1fc26SHu Haowen 25176f1fc26SHu Haowen 如需構建系統也給出內個目標重建的願意,請使用 ``V=2`` 。默認爲 ``V=0`` 。 25276f1fc26SHu Haowen 25376f1fc26SHu Haowen - 準備一個備份內核以防出錯。對於開發版本尤其如此,因爲每個新版本都包含 25476f1fc26SHu Haowen 尚未調試的新代碼。也要確保保留與該內核對應的模塊的備份。如果要安裝 25576f1fc26SHu Haowen 與工作內核版本號相同的新內核,請在進行 ``make modules_install`` 安裝 25676f1fc26SHu Haowen 之前備份modules目錄。 25776f1fc26SHu Haowen 25876f1fc26SHu Haowen 或者,在編譯之前,使用內核配置選項「LOCALVERSION」向常規內核版本附加 25976f1fc26SHu Haowen 一個唯一的後綴。LOCALVERSION可以在「General Setup」菜單中設置。 26076f1fc26SHu Haowen 26176f1fc26SHu Haowen - 爲了引導新內核,您需要將內核映像(例如編譯後的 26276f1fc26SHu Haowen .../linux/arch/x86/boot/bzImage)複製到常規可引導內核的位置。 26376f1fc26SHu Haowen 26476f1fc26SHu Haowen - 不再支持在沒有LILO等啓動裝載程序幫助的情況下直接從軟盤引導內核。 26576f1fc26SHu Haowen 26676f1fc26SHu Haowen 如果從硬碟引導Linux,很可能使用LILO,它使用/etc/lilo.conf文件中 26776f1fc26SHu Haowen 指定的內核映像文件。內核映像文件通常是/vmlinuz、/boot/vmlinuz、 26876f1fc26SHu Haowen /bzImage或/boot/bzImage。使用新內核前,請保存舊映像的副本,並複製 26976f1fc26SHu Haowen 新映像覆蓋舊映像。然後您【必須重新運行LILO】來更新加載映射!否則, 27076f1fc26SHu Haowen 將無法啓動新的內核映像。 27176f1fc26SHu Haowen 27276f1fc26SHu Haowen 重新安裝LILO通常需要運行/sbin/LILO。您可能希望編輯/etc/lilo.conf 27376f1fc26SHu Haowen 文件爲舊內核映像指定一個條目(例如/vmlinux.old)防止新的不能正常 27476f1fc26SHu Haowen 工作。有關更多信息,請參閱LILO文檔。 27576f1fc26SHu Haowen 27676f1fc26SHu Haowen 重新安裝LILO之後,您應該就已經準備好了。關閉系統,重新啓動,盡情 27776f1fc26SHu Haowen 享受吧! 27876f1fc26SHu Haowen 27976f1fc26SHu Haowen 如果需要更改內核映像中的默認根設備、視頻模式等,請在適當的地方使用 28076f1fc26SHu Haowen 啓動裝載程序的引導選項。無需重新編譯內核即可更改這些參數。 28176f1fc26SHu Haowen 28276f1fc26SHu Haowen - 使用新內核重新啓動並享受它吧。 28376f1fc26SHu Haowen 28476f1fc26SHu Haowen若遇到問題 28576f1fc26SHu Haowen----------- 28676f1fc26SHu Haowen 28776f1fc26SHu Haowen - 如果您發現了一些可能由於內核缺陷所導致的問題,請檢查MAINTAINERS(維護者) 28876f1fc26SHu Haowen 文件看看是否有人與令您遇到麻煩的內核部分相關。如果無人在此列出,那麼第二 28976f1fc26SHu Haowen 個最好的方案就是把它們發給我(torvalds@linux-foundation.org),也可能發送 29076f1fc26SHu Haowen 到任何其他相關的郵件列表或新聞組。 29176f1fc26SHu Haowen 29276f1fc26SHu Haowen - 在所有的缺陷報告中,【請】告訴我們您在說什麼內核,如何復現問題,以及您的 29376f1fc26SHu Haowen 設置是什麼的(使用您的常識)。如果問題是新的,請告訴我;如果問題是舊的, 29476f1fc26SHu Haowen 請嘗試告訴我您什麼時候首次注意到它。 29576f1fc26SHu Haowen 29676f1fc26SHu Haowen - 如果缺陷導致如下消息:: 29776f1fc26SHu Haowen 29876f1fc26SHu Haowen unable to handle kernel paging request at address C0000010 29976f1fc26SHu Haowen Oops: 0002 30076f1fc26SHu Haowen EIP: 0010:XXXXXXXX 30176f1fc26SHu Haowen eax: xxxxxxxx ebx: xxxxxxxx ecx: xxxxxxxx edx: xxxxxxxx 30276f1fc26SHu Haowen esi: xxxxxxxx edi: xxxxxxxx ebp: xxxxxxxx 30376f1fc26SHu Haowen ds: xxxx es: xxxx fs: xxxx gs: xxxx 30476f1fc26SHu Haowen Pid: xx, process nr: xx 30576f1fc26SHu Haowen xx xx xx xx xx xx xx xx xx xx 30676f1fc26SHu Haowen 30776f1fc26SHu Haowen 或者類似的內核調試信息顯示在屏幕上或在系統日誌里,請【如實】複製它。 30876f1fc26SHu Haowen 可能對你來說轉儲(dump)看起來不可理解,但它確實包含可能有助於調試問題的 30976f1fc26SHu Haowen 信息。轉儲上方的文本也很重要:它說明了內核轉儲代碼的原因(在上面的示例中, 31076f1fc26SHu Haowen 是由於內核指針錯誤)。更多關於如何理解轉儲的信息,請參見 31176f1fc26SHu Haowen Documentation/admin-guide/bug-hunting.rst。 31276f1fc26SHu Haowen 31376f1fc26SHu Haowen - 如果使用 CONFIG_KALLSYMS 編譯內核,則可以按原樣發送轉儲,否則必須使用 31476f1fc26SHu Haowen ``ksymoops`` 程序來理解轉儲(但通常首選使用CONFIG_KALLSYMS編譯)。 31576f1fc26SHu Haowen 此實用程序可從 31676f1fc26SHu Haowen https://www.kernel.org/pub/linux/utils/kernel/ksymoops/ 下載。 31776f1fc26SHu Haowen 或者,您可以手動執行轉儲查找: 31876f1fc26SHu Haowen 31976f1fc26SHu Haowen - 在調試像上面這樣的轉儲時,如果您可以查找EIP值的含義,這將非常有幫助。 32076f1fc26SHu Haowen 十六進位值本身對我或其他任何人都沒有太大幫助:它會取決於特定的內核設置。 32176f1fc26SHu Haowen 您應該做的是從EIP行獲取十六進位值(忽略 ``0010:`` ),然後在內核名字列表 32276f1fc26SHu Haowen 中查找它,以查看哪個內核函數包含有問題的地址。 32376f1fc26SHu Haowen 32476f1fc26SHu Haowen 要找到內核函數名,您需要找到與顯示症狀的內核相關聯的系統二進位文件。就是 32576f1fc26SHu Haowen 文件「linux/vmlinux」。要提取名字列表並將其與內核崩潰中的EIP進行匹配, 32676f1fc26SHu Haowen 請執行:: 32776f1fc26SHu Haowen 32876f1fc26SHu Haowen nm vmlinux | sort | less 32976f1fc26SHu Haowen 33076f1fc26SHu Haowen 這將爲您提供一個按升序排序的內核地址列表,從中很容易找到包含有問題的地址 33176f1fc26SHu Haowen 的函數。請注意,內核調試消息提供的地址不一定與函數地址完全匹配(事實上, 33276f1fc26SHu Haowen 這是不可能的),因此您不能只「grep」列表:不過列表將爲您提供每個內核函數 33376f1fc26SHu Haowen 的起點,因此通過查找起始地址低於你正在搜索的地址,但後一個函數的高於的 33476f1fc26SHu Haowen 函數,你會找到您想要的。實際上,在您的問題報告中加入一些「上下文」可能是 33576f1fc26SHu Haowen 一個好主意,給出相關的上下幾行。 33676f1fc26SHu Haowen 33776f1fc26SHu Haowen 如果您由於某些原因無法完成上述操作(如您使用預編譯的內核映像或類似的映像), 33876f1fc26SHu Haowen 請儘可能多地告訴我您的相關設置信息,這會有所幫助。有關詳細信息請閱讀 33976f1fc26SHu Haowen 『Documentation/admin-guide/reporting-issues.rst』。 34076f1fc26SHu Haowen 34176f1fc26SHu Haowen - 或者,您可以在正在運行的內核上使用gdb(只讀的;即不能更改值或設置斷點)。 34276f1fc26SHu Haowen 爲此,請首先使用-g編譯內核;適當地編輯arch/x86/Makefile,然後執行 ``make 34376f1fc26SHu Haowen clean`` 。您還需要啓用CONFIG_PROC_FS(通過 ``make config`` )。 34476f1fc26SHu Haowen 34576f1fc26SHu Haowen 使用新內核重新啓動後,執行 ``gdb vmlinux /proc/kcore`` 。現在可以使用所有 34676f1fc26SHu Haowen 普通的gdb命令。查找系統崩潰點的命令是 ``l *0xXXXXXXXX`` (將xxx替換爲EIP 34776f1fc26SHu Haowen 值)。 34876f1fc26SHu Haowen 34976f1fc26SHu Haowen 用gdb無法調試一個當前未運行的內核是由於gdb(錯誤地)忽略了編譯內核的起始 35076f1fc26SHu Haowen 偏移量。 35176f1fc26SHu Haowen 352