[CentOS 7] 別偷懶了,好好認真的照規矩來編譯核心吧

by 11月 09, 2016 5 意見        

我們之前試過 核心升級免苦惱,三行指令就搞定 這種偷懶的方法來升級 Kernel。
可是,為什麼要這麼做呢?手工打造自己的系統,那可是專屬於 Linux 人的浪漫啊。

沒錯!我們應該要貫徹工程師的精神,一步一步來從頭編譯核心才是王道!

取得核心的原始碼


先看一下目前的 Kernel 版號是 3.10.0-372.36.3。
uname -a

為了避免權限問題而造成編譯過程的錯誤,我們先切換到 root 帳號。
su -

用瀏覽器連上 The Linux Kernel Archives,可以看到目前最新的穩定版號是 4.8.6,將下載連結複製起來。

回到 Shell,將原始碼下載回來。
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.8.6.tar.xz

解壓縮到 /usr/src/kernels 裡,這是專門用來處理 Kernel 原始碼的目錄。
tar -Jxvf linux-4.8.6.tar.xz -C /usr/src/kernels

大小約在 746MB,而在編譯之後會爆增到 8GB 以上。

開始設定


切換到剛剛解壓縮的目錄。
cd /usr/src/kernels/linux-4.8.6

安裝編譯器、curses 開發套件、OpenSSL 開發套件、Perl、以及它們的相依套件。
yum -y install gc gcc ncurses ncurses-devel bc openssl-devel perl

清理上一次編譯時產生的目標檔、暫存檔、模組檔 ... 等,以及最重要的核心組態檔和備份檔。
make mrproper

將使用中的核心組態檔複製過來。
cp /boot/config-3.10.0-327.36.3.el7.x86_64 .config

再以文字視窗的方式來挑選增加或移除的功能。
make menuconfig

上下鍵用來移動區域1 的功能指標,左右鍵跟 Enter 鍵用來處理區域 2 的選項:選擇 (Select)、退出(Exit)、說明(Help)、儲存(Save)、載入(Load),按空白鍵決定功能的啟用與否,* 代表直接加入 Kernel 裡,M 代表編譯成 Kernel Module。

其實編譯核心最困難的地方就是這個部份。

裡面有許多的選項,到底是要增加還是刪除、直接內建還是編成模組、驅動程式的種類與數量、功能的支援與調教、功能之間的相依性與相容性 ...... 等等的考量。

調錯了開不了機、當機連連,調對了怕檔案太肥、速度太慢,每重來一次之後,往往又花了好幾個小時,進退之間的細節,實在是充滿著道不盡的 OOXX。

這次我們試著增加 NTFS 檔案系統的支援,先進入「File systems」選單,再進入「DOS/FAT/NT Filesystems」選單,加入「NTFS file system support」選項。



不過以實務上來說,NTFS 的支援一般會使用 NTFS-3G 這個 Kernel Module ,因為它的支援性跟效果都比較好。

別忘了把修改過的設定值儲存起來,預設會存到現行工作目錄的 .config 檔案。


如果想用先前調整過的核心組態檔為基礎來修改,又怕改壞掉,可以用 make oldconfig 複製一個新的來實驗。


進行編譯


開始編譯。
make

這個步驟要花費非常多的時間。

我在 Intel E8300 2.83GHz CPU、4G RAM、320G SATA2 HDD 的 Win10 x64 PC 上建立的虛擬機裡,使用 2 個 Core、2G RAM、200GB 虛擬硬碟,等了約二個半小時左右才完成。

如果編譯到一半有問題,只要執行 make clean 保留核心組態檔跟必要的模組,並且把先前執行時產生的檔案全清掉,再重新 make 一次就可以了 。

編譯核心模組。
make modules

安裝核心模組。
make modules_install

安裝核心。
make install

最後,我們就可以在 /boot 目錄裡看到已經安裝好剛剛編譯完成的 Kernel。


正式使用


本來在 GRUB 開機選單裡,只有三個選項,第一個就是我們目前使用的 3.10.0-327 版。

完全無法掛載 NTFS 格式的隨身碟。

現在則是可以看到增加了 4.8.6 版的選項。

開機之後來驗明正身一下,真的是新版的核心。

而且真的可以掛載 NTFS 了 ...
只不過,認是認得出來啦,要讀寫又是另外一回事了。XD

在一切順利的狀況下,不多啦!從頭到尾大概「只」花掉了我們三個半小時的時間。

是誰說要自己把核心編譯一次的,
給我站出來,我保證不打他的臉!!!


注意事項


如果不是要升級新版核心,而是要針對現行版本的核心增刪功能的話,步驟就不太一樣了。

先到 http://vault.centos.org 去取得原始碼,像是我的 CentOS 版號是 7.2.1511,核心的版號是 3.10.0-372,檔案位置就會是在 /7.2.1511/os/Source/SPackages/kernel-3.10.0-372.el7.src.rpm。

再依照 CentOS Wiki - I need the Kernel Source 的說明來操作。


參考資料

圖片來源
  • https://pixabay.com/
  • http://onefunnyjoke.com/

更新紀錄
  • 2016/11/09 撰文。

Heracles Jam,江湖人稱「海公公」

IT 技術家 - 創站部落客

一個常用 Windows、慣用 macOS、愛用 Linux 的 3C 阿宅
現職 MIS / 業界講師 / 資訊顧問 / 部落客

5 則留言 :

  1. menuconfig實在是太好用了,遠古年代,我試著去改.config
    結果.............就此長眠,從此以後,我再也不敢玩make kernel

    回覆刪除
    回覆
    1. 幫 QQ ......
      我雖然沒有走過那一段,
      但是這次光是為了截圖,反反覆覆 Compile 不下十數次,
      大概就可以想見當年戰況之慘烈與悲壯了....

      刪除
    2. 話說…是不是在make時,加上-j 2會快一點呢

      刪除
    3. 對哦~~~ 完全忘了這回事,感謝提醒。
      另外,聽說 -j 的數字是跟著 CPU 的核心數走,不知道是不是醬子???

      刪除
  2. linode编译过内核,不过是增加功能,速度还是挺快的

    回覆刪除