Linux-Kernel

核心編譯中這些術語有什麼區別

  • February 5, 2021

條款如何

make、make bzImage、make modules、make install、make modules_install 相互關聯。

我看到的一個核心教程使用了所有 make bzImage、make modules、make install、make modules_install 命令來編譯和安裝新核心。而另一個只使用 make、make install 和 make modules_install 命令。那麼有什麼區別呢?

隨著時間的推移,Linux 核心編譯過程本身得到了進一步的發展。它變得更加複雜,但也更加精簡。在核心源目錄中執行make help以查看所有make目標的列表以及每個目標的簡要說明。

對於目前的 5.x 核心系列,命令makemake all是等效的:它們都將執行特定於體系結構的預設目標列表。

在 x86 硬體架構上,預設列表包含:

  • make vmlinux建構裸核心(如果您執行make bzImage,這也會自動執行,因為在您可以製作壓縮的可引導核心映像文件之前,您首先需要製作您想要壓縮的東西;未壓縮的版本也適用於某些核心調試工具。)
  • make modules建構核心模組
  • make bzImage創建可引導的壓縮核心映像文件。

以上所有操作都可以作為普通使用者執行,無需額外權限。

另一方面,make install將使用其中一個~/bin/installkernel/sbin/installkernel如果它們存在。您自己的~/bin/installkernel可能包括sudo在適用的情況下使用或類似的,但係統/sbin/installkernel通常被編寫為期望您已經具有 root 訪問權限。

同樣,make modules_install會將新核心版本的模組複製到/lib/modules/<kernel_version>/目錄樹中,因此需要 root 訪問權限才能成功執行。

由於最佳實踐是避免在沒有特定需要的情況下以 root 身份執行任何冗長而復雜的程序(例如核心編譯!),因此目前最小的核心編譯過程將類似於:

  • 將核心配置為普通使用者
  • 執行makemake all作為普通使用者
  • 執行sudo make modules_install安裝核心模組
  • 執行sudo make install以安裝實際的核心。我建議最後這樣做,因為/sbin/installkernel可能會觸發其他操作,例如自動建構 initramfs 文件,如果新的核心模組已經到位,這些其他操作會更成功。

但是如果你在做核心開發,而不是僅僅為你自己的需要建構一個定制的核心,你可能想要使用更細粒度的過程;例如,如果您正在開發一個核心模組,您可能希望make modules作為一個單獨的步驟執行,以便您可以更輕鬆地查看它是否由於您犯的錯誤而失敗,並且可以更快地修復錯誤。修復錯誤後,您將能夠再次跳到執行make modules,因為前面的步驟已經成功完成。

同樣,使用早期核心啟動過程的開發人員可能只希望 bzImage 在另一個系統中進行測試(具有一組棘手的 ACPI 表或其他系統),而根本不關心模組。

引用自:https://unix.stackexchange.com/questions/632748