如何編譯 Linux 內核 | Linux 中國

2022-01-31 Linux中國

Jack 將帶你在 Ubuntu 16.04 伺服器上走過內核編譯之旅。

曾經有一段時間,升級 Linux 內核讓很多用戶打心裡有所畏懼。在那個時候,升級內核包含了很多步驟,也需要很多時間。現在,內核的安裝可以輕易地通過像 apt 這樣的包管理器來處理。通過添加特定的倉庫,你能很輕易地安裝實驗版本的或者指定版本的內核(比如針對音頻產品的實時內核)。

考慮一下,既然升級內核如此容易,為什麼你不願意自行編譯一個呢?這裡列舉一些可能的原因:

◈ 你需要啟用或者禁用內核中特定的選項,因為它們沒有出現在標準選項裡

不管出於什麼原因,懂得如何編譯內核是非常有用的,而且可以被視作一個通行權。當我第一次編譯一個新的 Linux 內核(那是很久以前了),然後嘗試從它啟動,我從中(系統馬上就崩潰了,然後不斷地嘗試和失敗)感受到一種特定的興奮。

既然這樣,讓我們來實驗一下編譯內核的過程。我將使用 Ubuntu 16.04 Server 來進行演示。在運行了一次常規的 sudo apt upgrade 之後,當前安裝的內核版本是 4.4.0-121。我想要升級內核版本到 4.17, 讓我們小心地開始吧。

有一個警告:強烈建議你在虛擬機裡實驗這個過程。基於虛擬機,你總能創建一個快照,然後輕鬆地從任何問題中回退出來。不要在產品機器上使用這種方式升級內核,除非你知道你在做什麼。

下載內核

我們要做的第一件事是下載內核源碼。在 Kernel.org[1] 找到你要下載的所需內核的 URL。找到 URL 之後,使用如下命令(我以 4.17 RC2 內核為例) 來下載源碼文件:

wget https://git.kernel.org/torvalds/t/linux-4.17-rc2.tar.gz

在下載期間,有一些事需要去考慮。

安裝需要的環境

為了編譯內核,我們首先得安裝一些需要的環境。這可以通過一個命令來完成:

sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison

務必注意:你將需要至少 128GB 的本地可用磁碟空間來完成內核的編譯過程。因此你必須確保有足夠的空間。

解壓源碼

在新下載的內核所在的文件夾下,使用該命令來解壓內核:

tar xvzf linux-4.17-rc2.tar.gz

使用命令 cd linux-4.17-rc2 進入新生成的文件夾。

配置內核

在正式編譯內核之前,我們首先必須配置需要包含哪些模塊。實際上,有一些非常簡單的方式來配置。使用一個命令,你能拷貝當前內核的配置文件,然後使用可靠的 menuconfig 命令來做任何必要的更改。使用如下命令來完成:

cp /boot/config-$(uname -r) .config

現在你有一個配置文件了,輸入命令 make menuconfig。該命令將打開一個配置工具(圖 1),它可以讓你遍歷每個可用模塊,然後啟用或者禁用你需要或者不需要的模塊。

圖 1: 運行中的 make menuconfig

很有可能你會禁用掉內核中的一個重要部分,所以在 menuconfig 期間小心地一步步進行。如果你對某個選項不確定,不要去管它。或者更好的方法是使用我們拷貝的當前運行的內核的配置文件(因為我們知道它可以工作)。一旦你已經遍歷了整個配置列表(它非常長),你就準備好開始編譯了。

編譯和安裝

現在是時候去實際地編譯內核了。第一步是使用 make 命令去編譯。調用 make 命令然後回答必要的問題(圖 2)。這些問題取決於你將升級的現有內核以及升級後的內核。相信我,將會有非常多的問題要回答,因此你得預留大量的時間。

圖 2: 回答 make 命令的問題

回答了長篇累牘的問題之後,你就可以用如下的命令安裝那些之前啟用的模塊:

make modules_install

又來了,這個命令將耗費一些時間,所以要麼坐下來看著編譯輸出,或者去做些其他事(因為編譯期間不需要你的輸入)。可能的情況是,你想要去進行別的任務(除非你真的喜歡看著終端界面上飛舞而過的輸出)。

現在我們使用這個命令來安裝內核:

sudo make install

又一次,另一個將要耗費大量可觀時間的命令。事實上,make install 命令將比 make modules_install 命令花費更多的時間。去享用午餐,配置一個路由器,將 Linux 安裝在一些伺服器上,或者小睡一會吧。

啟用內核作為引導

一旦 make install 命令完成了,就是時候將內核啟用來作為引導。使用這個命令來實現:

sudo update-initramfs -c -k 4.17-rc2

當然,你需要將上述內核版本號替換成你編譯完的。當命令執行完畢後,使用如下命令來更新 grub:

sudo update-grub

現在你可以重啟系統並且選擇新安裝的內核了。

恭喜!

你已經編譯了一個 Linux 內核!它是一項耗費時間的活動;但是,最終你的 Linux 發行版將擁有一個定製的內核,同時你也將擁有一項被許多 Linux 管理員所傾向忽視的重要技能。

從 Linux 基金會和 edX 提供的免費 「Introduction to Linux」[2] 課程來學習更多的 Linux 知識。

via: https://www.linux.com/learn/intro-to-linux/2018/4/how-compile-linux-kernel-0

作者:Jack Wallen[4] 選題:lujun9972 譯者:icecoobe 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

相關焦點

  • 手把手教你樹莓派linux內核如何編譯
    之前我們講過樹莓派交叉編譯工具鏈的安裝和配置,今天我們就來講如何利用我們安裝好的交叉編譯器編譯樹莓派linux內核。
  • Linux驅動05 | 內核編譯
    翻譯如下:如果需要編譯外部的內核模塊,這時候我們必須擁有一個已經預先成功編譯好的內核,在編譯內核過程當中,它會生成內核模塊所需要的頭文件和配置文件。當前使用了一個發布版本的內核,如當前的內核為linux-3.4.39-gec,那麼這個時候開發板的內核也得是linux-3.4.39-gec,若版本不一致,內核模塊無法進行加載。
  • 在 21 世紀該怎樣編譯 Linux 內核 | Linux 中國
    回到 20 世紀(甚至是 21 世紀初期),對於 Linux 用戶來說,在剛買到新的硬體後就需要下載最新的內核代碼並編譯安裝才能使用這是不可理喻的。而現在你也很難見到 Linux 用戶為了好玩而編譯內核或通過高度專業化定製的硬體的方式賺錢。現在,通常已經不需要再編譯 Linux 內核了。這裡列出了一些原因以及快速編譯內核的教程。
  • Linux內核配置、編譯及Makefile簡述
    1.解壓縮打補丁  首先是解壓縮你獲取到的Linux內核。這裡我用到的是linux.2.22.6版本的內核。在Linux下命令行通過tar xjf linux.2.22.6.tar.bz2解壓內核。然後,如果你需要對這個內核打補丁的話,用patch命令:patch -px <../linux.2.22.6.patch。
  • Linux 內核學習:環境搭建和內核編譯
    git需要先配置用戶名和email: 6 環境搭建完成可以正式開始我們的linux內核學習之旅了。二、linux內核學習之二:編譯內核環境搭好後,馬上就進入到下一環節--編譯內核。linux的內核是整個系統最核心的部分,內核的功能基本上決定了系統的能力。
  • 在 MacOS 上編譯 Linux 內核(2020 edition)
    內核只能在 Linux 編譯?\_百度搜索[15]macos 編譯 linux 內核\_百度搜索[17]參考資料[1]Downloads – Oracle VM VirtualBox: https://www.virtualbox.org/wiki/Downloads[2]Download Ubuntu Desktop | Download | Ubuntu: https://ubuntu.com/download
  • 編譯運行Linux內核源碼中的eBPF示例代碼
    TL;DR聲明:下文提到的bpf/BPF字樣是泛指,包括cBPF和eBPF。通過文章,你能了解Linux內核代碼中關於bpf程序的編譯運行機制,並能學會如何基於Linux內核bpf示例環境編寫你自己的bpf程序。
  • 嵌入式開發Linux驅動篇——驅動編譯到內核
    怎麼和Makefile文件建立的關係驅動編譯到內核make menuconfig圖形化配置界面1. 怎麼進入到make menuconfig圖形化界面?圖形化界面的操作搜索功能配置驅動狀態把驅動編譯編譯成模塊(用M表示)把驅動編譯到內核裡面(用*來表示)不編譯3.
  • 如何用 Rust 編寫一個 Linux 內核模塊 | Linux 中國
    編者按:近些年來 Rust 語言由於其內存安全性和性能等優勢得到了很多關注,尤其是 Linux 內核也在準備將其集成到其中,因此,我們特邀阿里雲工程師蘇子彬為我們介紹一下如何在 Linux 內核中集成 Rust 支持。 2021 年 4 月 14 號,一封主題名為《Rust support》的郵件出現在 LKML 郵件組中。
  • 【工程師分享】在Petalinux編譯多個源文件的Linux內核模塊,以及擴展Makefile功能
    」指示Kbuild將模塊編譯成Linux內核模塊文件linux-test-module.ko。更多信息可以參考相關文檔,比如深入理解 Linux 配置/構建系統是如何工作的,LINUX內核編譯學習筆記, Linux 內核模塊編譯 Makefile, Linux 2.6內核Makefile淺析。如果有多個源文件,也可以學習Linux內核模塊的Makefile寫法,使Petalinux的內核模塊也支持多個源文件。
  • Linux 有問必答:如何刪除 Ubuntu 上不再使用的舊內核
    如何用最簡單的方法刪除Ubuntu上先前版本的內核?在Ubuntu上,有幾個方法來升級內核。在Ubuntu桌面中,軟體更新允許你每天檢查並更新到最新的內核上。在Ubuntu伺服器上,最為重要的安全更新項目之一就是 unattended-upgrades 軟體包會自動更新內核。然而,你也可以手動用apt-get或者aptitude命令來更新。
  • 在 Ubuntu 中如何安裝或升級 Linux 內核到4.2
    所以這就到了,而且 4.3 的合併窗口現已打開。我已經有了幾個等待處理的合併請求,明天我開始處理它們,然後在適當的時候放出來。 從 rc8 以來的簡短日誌很小,已經附加。這個補丁也很小...新內核 4.2 有哪些改進?
  • Linux 內核的持續集成測試 | Linux 中國
    Linux 測試問題許多 Linux 發行版只在需要的時候對 Linux 內核進行測試。而這種測試往往只在版本發布時或者用戶發現錯誤時進行。有時候,出現玄學問題時,維護人員需要在包含了數萬個補丁的變更中匆忙地尋找哪個補丁導致這個新的玄學 Bug。診斷 Bug 需要專業的硬體設備、一系列的觸發器以及內核相關的專業知識。
  • 如何在 Ubuntu 18.04 LTS 中獲取 Linux 5.0 內核 | Linux 中國
    你如何升級到這些小數點版本?答案很簡單。只需要像平時一樣更新你的 Ubuntu 系統,這樣你將在最新的小數點版本上了。你可以查看 Ubuntu 版本來了解正在使用的版本。我檢查了一下,因為我用的是 Ubuntu 18.04.3,我以為我的內核會是 5。當我查看 Linux 內核版本時,它仍然是基本內核 4.15。
  • macOS 和 Linux 的內核有什麼區別 | Linux 中國
    作為交易的一部分,史蒂夫·賈伯斯回到了蘋果公司,同時 NeXTSTEP 成為了 macOS 和 iOS 的基礎。Linux 內核的歷史與 macOS 內核不同,Linux 的創建並非源於商業嘗試。相反,它是由芬蘭計算機科學專業學生林納斯·託瓦茲Linus Torvalds於 1991 年創建的[4]。
  • 如何在 Ubuntu/Linux Mint 中安裝最新 Linux內核
    它提供了一個帶有「主線mainline」內核更新列表的簡單界面,允許在基於 Ubuntu 的發行版中一鍵安裝、刪除或清除內核。如何在Ubuntu中安裝Mainline:注意:主線內核由Ubuntu內核團隊提供,用於測試和調試。它們不受支持,也不適合生產使用。您應該只在它們可能修復當前內核的一個嚴重問題時才安裝它們。
  • Linux內核內存管理總結
    代碼和測試環境搭建3.1 QEMU安裝QEMU以及相關編譯工具sudo apt-get install qemu libncurses5-dev gcc-arm-linux-gnueabi build-essential3.2 Busybox 1.24下載Busybox 1.24代碼:git clone https:
  • 升級 Ubuntu Linux 內核的幾種不同方法 | Linux 中國
    然後下載符合以下格式的兩個文件(其中 X.Y.Z 是最高版本號):1. linux-image-X.Y.Z-generic-*.deb2. linux-modules-X.Y.Z-generic-.deb在終端中改變到文件所在的目錄,然後執行此命令手動安裝內核:$ sudo dpkg --install *.deb重啟系統,使用新內核:
  • 一次搞定 Arm Linux 交叉編譯
    arm-linux-gnueabi-gcc 和 aarch64-linux-gnu-gcc 適用於 Arm Cortex-A 系列晶片,前者針對 32 位晶片,後者針對 64 位晶片,它使用的是 glibc 庫。可以用來編譯 u-boot、linux kernel 以及應用程式。
  • Linux內核結構詳解
    目前,較新而又穩定的內核版本是2.0.x和2.2.x,因為版本不同稍有差別,因此如果你想讓一個新的驅動程序既支持2.0.x,又支持2.2.x,就需要根據內核版本進行條件編譯,要作到這一點,就要支持宏LINUX_VERSION_CODE,假如內核的版本用a.b.c來表示,這個宏的值就是216a+28b+c。