我們之前試過 核心升級免苦惱,三行指令就搞定 這種偷懶的方法來升級 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 的說明來操作。
參考資料
- Unixmen - How to upgrade or update kernel of the CentOS to Latest stable Kernel
- 鳥哥的 Linux 私房菜 - 第二十四章、Linux 核心編譯與管理
圖片來源
- https://pixabay.com/
- http://onefunnyjoke.com/
更新紀錄
- 2016/11/09 撰文。
menuconfig實在是太好用了,遠古年代,我試著去改.config
回覆刪除結果.............就此長眠,從此以後,我再也不敢玩make kernel
幫 QQ ......
刪除我雖然沒有走過那一段,
但是這次光是為了截圖,反反覆覆 Compile 不下十數次,
大概就可以想見當年戰況之慘烈與悲壯了....
話說…是不是在make時,加上-j 2會快一點呢
刪除對哦~~~ 完全忘了這回事,感謝提醒。
刪除另外,聽說 -j 的數字是跟著 CPU 的核心數走,不知道是不是醬子???
linode编译过内核,不过是增加功能,速度还是挺快的
回覆刪除