Linux 核心版本 6.x <https://kernel.linux.club.tw/>

這些是 Linux 版本 6 的發行說明。請仔細閱讀,因為它們會告訴你這是關於什麼的,解釋如何安裝核心,以及如果出現問題該怎麼辦。

什麼是 Linux?

Linux 是 Unix 作業系統的克隆,由 Linus Torvalds 從頭開始編寫,並由來自網路上一個鬆散的駭客團隊協助。 它的目標是符合 POSIX 和 Single UNIX Specification 標準。

它具有您期望在現代成熟的 Unix 中看到的所有特性,包括真正的多工處理、虛擬記憶體、共享庫、按需載入、共享寫時複製可執行檔案、適當的記憶體管理以及包括 IPv4 和 IPv6 的多棧網路。

它在 GNU 通用公共許可證 v2 下發布 - 有關更多詳細資訊,請參閱隨附的 COPYING 檔案。

它在什麼硬體上執行?

雖然最初是為基於 32 位 x86 的 PC(386 或更高版本)開發的,但如今 Linux 也可以在(至少)Compaq Alpha AXP、Sun SPARC 和 UltraSPARC、Motorola 68000、PowerPC、PowerPC64、ARM、Hitachi SuperH、Cell、IBM S/390、MIPS、HP PA-RISC、Intel IA-64、DEC VAX、AMD x86-64 Xtensa 和 ARC 架構上執行。

只要它們具有分頁記憶體管理單元 (PMMU) 和 GNU C 編譯器 (gcc) (GNU 編譯器集合,GCC 的一部分) 的埠,Linux 就可以輕鬆移植到大多數通用 32 位或 64 位架構。 Linux 也被移植到許多沒有 PMMU 的架構,但功能顯然受到一定的限制。 Linux 也被移植到自身。 現在,您可以將核心作為使用者空間應用程式執行 - 這稱為 UserMode Linux (UML)。

文件

  • Internet 上和書籍中都有大量電子形式的文件,包括 Linux 特定的文件和關於通用 UNIX 問題的文件。 我建議檢視任何 Linux FTP 站點上的文件子目錄,以獲取 LDP(Linux 文件專案)書籍。 此 README 並非旨在作為系統文件:有更好的來源可用。

  • Documentation/ 子目錄中有各種 README 檔案:這些檔案通常包含某些驅動程式的核心特定安裝說明。 請閱讀 Documentation/process/changes.rst 檔案,因為它包含有關升級核心可能導致的問題的資訊。

安裝核心原始碼

  • 如果您安裝完整的原始碼,請將核心 tarball 放在您具有許可權的目錄中(例如您的主目錄)並解壓它

    xz -cd linux-6.x.tar.xz | tar xvf -
    

    將“X”替換為最新核心的版本號。

    不要使用 /usr/src/linux 區域! 該區域有一組(通常不完整的)核心標頭檔案,供庫標頭檔案使用。 它們應該與庫匹配,並且不應被任何最新核心搞亂。

  • 您還可以透過打補丁在 6.x 版本之間升級。 補丁以 xz 格式分發。 要透過打補丁安裝,請獲取所有較新的補丁檔案,進入核心原始碼的頂層目錄 (linux-6.x) 並執行

    xz -cd ../patch-6.x.xz | patch -p1
    

    將“x”替換為大於當前原始碼樹版本“x”的所有版本,**按順序**,您應該可以。 您可能需要刪除備份檔案(some-file-name~ 或 some-file-name.orig),並確保沒有失敗的補丁(some-file-name# 或 some-file-name.rej)。 如果有,要麼你犯了錯誤,要麼我犯了錯誤。

    與 6.x 核心的補丁不同,6.x.y 核心(也稱為 -stable 核心)的補丁不是增量的,而是直接應用於基礎 6.x 核心。 例如,如果您的基礎核心是 6.0 並且您想應用 6.0.3 補丁,則您必須不要先應用 6.0.1 和 6.0.2 補丁。 同樣,如果您執行的是核心版本 6.0.2 並且想要跳轉到 6.0.3,您必須首先反轉 6.0.2 補丁(即,patch -R)**在**應用 6.0.3 補丁之前。 您可以在 Documentation/process/applying-patches.rst 中閱讀更多相關資訊。

    或者,指令碼 patch-kernel 可用於自動執行此過程。 它確定當前核心版本並應用找到的任何補丁

    linux/scripts/patch-kernel linux
    

    上面命令中的第一個引數是核心原始碼的位置。 補丁是從當前目錄應用的,但可以將備用目錄指定為第二個引數。

  • 確保您沒有任何過時的 .o 檔案和依賴項

    cd linux
    make mrproper
    

    現在您應該已正確安裝原始碼。

軟體要求

編譯和執行 6.x 核心需要各種軟體包的最新版本。 有關所需的最低版本號以及如何獲取這些軟體包的更新,請參閱 Documentation/process/changes.rst。 請注意,使用過舊版本的這些軟體包可能會導致難以追蹤的間接錯誤,因此不要假設您只能在構建或操作期間出現明顯問題時才更新軟體包。

核心的構建目錄

編譯核心時,預設情況下所有輸出檔案將與核心原始碼一起儲存。 使用選項 make O=output/dir 允許您為輸出檔案(包括 .config)指定備用位置。 示例

kernel source code: /usr/src/linux-6.x
build directory:    /home/name/build/kernel

要配置和構建核心,請使用

cd /usr/src/linux-6.x
make O=/home/name/build/kernel menuconfig
make O=/home/name/build/kernel
sudo make O=/home/name/build/kernel modules_install install

請注意:如果使用了 O=output/dir 選項,則必須將其用於所有 make 呼叫。

配置核心

即使您只是升級一個次要版本,也不要跳過此步驟。 每個版本都會新增新的配置選項,如果未按預期設定配置檔案,則會出現奇怪的問題。 如果您想以最少的工作量將現有配置移植到新版本,請使用 make oldconfig,這將只詢問您新問題的答案。

  • 備用配置命令為

    "make config"      Plain text interface.
    
    "make menuconfig"  Text based color menus, radiolists & dialogs.
    
    "make nconfig"     Enhanced text based color menus.
    
    "make xconfig"     Qt based configuration tool.
    
    "make gconfig"     GTK based configuration tool.
    
    "make oldconfig"   Default all questions based on the contents of
                       your existing ./.config file and asking about
                       new config symbols.
    
    "make olddefconfig"
                       Like above, but sets new symbols to their default
                       values without prompting.
    
    "make defconfig"   Create a ./.config file by using the default
                       symbol values from either arch/$ARCH/configs/defconfig
                       or arch/$ARCH/configs/${PLATFORM}_defconfig,
                       depending on the architecture.
    
    "make ${PLATFORM}_defconfig"
                       Create a ./.config file by using the default
                       symbol values from
                       arch/$ARCH/configs/${PLATFORM}_defconfig.
                       Use "make help" to get a list of all available
                       platforms of your architecture.
    
    "make allyesconfig"
                       Create a ./.config file by setting symbol
                       values to 'y' as much as possible.
    
    "make allmodconfig"
                       Create a ./.config file by setting symbol
                       values to 'm' as much as possible.
    
    "make allnoconfig" Create a ./.config file by setting symbol
                       values to 'n' as much as possible.
    
    "make randconfig"  Create a ./.config file by setting symbol
                       values to random values.
    
    "make localmodconfig" Create a config based on current config and
                          loaded modules (lsmod). Disables any module
                          option that is not needed for the loaded modules.
    
                          To create a localmodconfig for another machine,
                          store the lsmod of that machine into a file
                          and pass it in as a LSMOD parameter.
    
                          Also, you can preserve modules in certain folders
                          or kconfig files by specifying their paths in
                          parameter LMC_KEEP.
    
                  target$ lsmod > /tmp/mylsmod
                  target$ scp /tmp/mylsmod host:/tmp
    
                  host$ make LSMOD=/tmp/mylsmod \
                          LMC_KEEP="drivers/usb:drivers/gpu:fs" \
                          localmodconfig
    
                          The above also works when cross compiling.
    
    "make localyesconfig" Similar to localmodconfig, except it will convert
                          all module options to built in (=y) options. You can
                          also preserve modules by LMC_KEEP.
    
    "make kvm_guest.config"   Enable additional options for kvm guest kernel
                              support.
    
    "make xen.config"   Enable additional options for xen dom0 guest kernel
                        support.
    
    "make tinyconfig"  Configure the tiniest possible kernel.
    

    您可以在 配置目標和編輯器 中找到有關使用 Linux 核心配置工具的更多資訊。

  • 關於 make config 的注意事項

    • 擁有不必要的驅動程式會使核心更大,並且在某些情況下會導致問題:探測不存在的控制器卡可能會混淆您的其他控制器。

    • 編譯了數學模擬的核心仍然會使用協處理器(如果存在):在這種情況下,數學模擬永遠不會被使用。 核心會稍微大一些,但無論它們是否有數學協處理器,都可以在不同的機器上工作。

    • “核心駭客”配置詳細資訊通常會導致核心更大或更慢(或兩者兼而有之),甚至可能透過配置某些例程來主動嘗試破壞不良程式碼以查詢核心問題 (kmalloc()),從而使核心不太穩定。 因此,您可能應該對“開發”、“實驗性”或“除錯”功能的提問回答“n”。

編譯核心

  • 確保您至少有 gcc 8.1 可用。 有關更多資訊,請參閱 Documentation/process/changes.rst

  • 執行 make 以建立壓縮的核心映像。 如果您安裝了 lilo 或者您的發行版具有核心安裝程式識別的安裝指令碼,也可以執行 make install。 大多數流行的發行版都將具有可識別的安裝指令碼。 您可能需要先檢查發行版的設定。

    要執行實際安裝,您必須是 root 使用者,但通常的構建不應需要這樣做。 不要隨便使用 root 的名稱。

  • 如果您將核心的任何部分配置為 modules,您還必須執行 make modules_install

  • 詳細的核心編譯/構建輸出

    通常,核心構建系統以相當安靜的模式執行(但並非完全靜默)。 但是,有時您或其他核心開發人員需要完全按照執行的方式檢視編譯、連結或其他命令。 為此,請使用“verbose”構建模式。 這是透過將 V=1 傳遞給 make 命令來完成的,例如

    make V=1 all
    

    要使構建系統也告訴您每個目標的重建原因,請使用 V=2。 預設為 V=0

  • 手頭保留一個備份核心,以防出現問題。 這對於開發版本尤其如此,因為每個新版本都包含尚未除錯的新程式碼。 確保您也保留與該核心對應的模組備份。 如果您要安裝與您的工作核心版本號相同的新核心,請在執行 make modules_install 之前備份您的模組目錄。

    或者,在編譯之前,使用核心配置選項“LOCALVERSION”將唯一字尾附加到常規核心版本。 可以在“常規設定”選單中設定 LOCALVERSION。

  • 為了啟動您的新核心,您需要將核心映像(例如,編譯後的 .../linux/arch/x86/boot/bzImage)複製到找到您的常規可啟動核心的位置。

  • 在 BIOS(非 EFI 系統)中,不再支援在沒有 LILO 或 GRUB 等引導載入程式協助的情況下直接從儲存裝置引導核心。 但是,在 UEFI/EFI 系統上,您可以使用 EFISTUB,它允許主機板直接引導到核心。 在現代工作站和桌上型電腦上,通常建議使用引導載入程式,因為多個核心和安全啟動可能會出現問題。 有關 EFISTUB 的更多詳細資訊,請參閱“EFI 引導存根”。

  • 重要的是要注意,截至 2016 年,LILO (LInux LOader) 不再處於積極開發中,儘管由於它非常流行,因此經常出現在文件中。 流行的替代方案包括 GRUB2、rEFInd、Syslinux、systemd-boot 或 EFISTUB。 由於各種原因,不建議使用不再處於積極開發中的軟體。

  • 您的發行版很可能包含一個安裝指令碼,執行 make install 將是所需的全部。 如果不是這種情況,您將需要識別您的引導載入程式並參考其文件或配置您的 EFI。

舊版 LILO 說明

  • 如果您使用 LILO,則核心映像在檔案 /etc/lilo.conf 中指定。 核心映像檔案通常為 /vmlinuz、/boot/vmlinuz、/bzImage 或 /boot/bzImage。 要使用新核心,請儲存舊映像的副本,並將新映像複製到舊映像上。 然後,您必須重新執行 LILO 才能更新載入對映! 如果你不這樣做,你將無法啟動新的核心映像。

  • 重新安裝 LILO 通常是執行 /sbin/lilo 的問題。 您可能希望編輯 /etc/lilo.conf 以指定舊核心映像(例如 /vmlinux.old)的條目,以防新核心映像不起作用。 有關更多資訊,請參閱 LILO 文件。

  • 重新安裝 LILO 後,您應該一切就緒。 關閉系統,重新啟動,盡情享受吧!

  • 如果您需要更改核心映像中的預設根裝置、影片模式等,請在適當的情況下使用引導載入程式的引導選項。 無需重新編譯核心即可更改這些引數。

  • 使用新核心重新啟動並盡情享受吧。

如果出現問題

如果您遇到似乎是由於核心錯誤導致的問題,請按照“報告問題”中的說明進行操作。

有關理解核心錯誤報告的提示在“缺陷追蹤”中。 有關使用 gdb 除錯核心的更多資訊,請參閱“透過 gdb 除錯核心和模組”和“使用 kgdb、kdb 和核心偵錯程式內部結構”。