Centos 7 源碼編譯安裝內核4.14.12
需要新功能的支持:
在生產環境中,突然會需要使用一些新的功能,但是原有的內核並不支持此功能,這是就需要重新編譯出一個新的內核來提供對此新功能的支持,比如虛擬化、iptables功能必須要在2.4.X以上版本的內核中才支持。
原核心太過於臃腫:
原來安裝的內核中,有很多不常用甚至基本上用不到的功能支持,而這些功能又會使內核文件變得很大,這時要將此變成一個簡化切功能夠用的內核就需要進行重新編譯。
與硬件搭配的穩定性:
很多情況下,系統內核中默認一般默認支持的CPU類型為Inter,但在其它廠商,如AMD或者是較新的CPU硬件上使用此系統,可能就不能很好的支持,且不穩定。因此就需要重新編譯內核來支持最新的硬件驅動。
其它特殊需求:
linux除了在pc機上運行,當然也能支持一些其它設備,比如嵌入式的APM、智能手機等,這時或許就要進行重新編譯支持的CPU架構來支持這些特殊需求。
總結一點:kernel的作業就是所需要的硬件支持,因此在此基礎上只加需要的功能,來實現內核文件的短小精幹。
實驗環境:VMware Workstation Pro 14(試用版)
系統平臺:
CentOS Linux release 7.4.1708 (Core) 內核 3.10.0-693.el7.x86_64
步驟如下:
內核源碼官網,請下載標記為stable的版本
https://www.kernel.org/
本次編譯的源碼版本為
1.準備編譯環境
a.至少準備10GB的磁盤剩余空間
b.# yum -y groups install "Development Tools"
# yum -y install ncurses-devel elfutils-libelf-devel bc openssl-devel.x86_64
2.解壓源碼包
#tar xvf linux-4.14.12.tar.xz
源碼包解壓後的大小為979M
3.在當前已經安裝的系統中的/boot目錄下存在一個名為conf-xxx 的文件,那個文件其實就是核心功能列表選擇文件,如
-rw-r--r--. 1 root root 140894 Aug 22 17:21 config-3.10.0-693.el7.x86_64
copy當前系統內核中的config-xxx文件到需要編譯的內核目錄下。這一步不是必須的,可以用來參考之前系統的內核選項。
#cp config-3.10.0-693.el7.x86_64 /kernel/linux-4.14.12
4.所有操作均在源碼編譯目錄內進行
#cd /kernel/linux-4.14.12/
編碼內核選擇界面(生成.config的方法):
5.使用make menuconfig 命令進行菜單化界面來選擇內核功能:
左右箭頭鍵:用來移動選擇最下面的select、exit、help、save、load幾個按鈕
上下箭頭鍵:可移動上面的菜單來選中對應的功能選項,選項後與--> 表示內部有子菜單需要選擇。
選定項目:使用上下鍵選擇設定的項目,並使用左右鍵選擇select按鈕,然後按回車就可進入項目中 的子菜單選擇。
挑選功能:在項目的功能名稱前面,有 [ ]或者 < > 才可以使用 空格鍵 來選擇。
挑選說明:
[ ]: 不編譯此項
[M]: 表示編譯成模塊,也就是存放在/lib/modules/內核版本號/
< * > [ * ] : 表示編譯進核心,也就是/boot下的vmlinuz-內核版本號 文件
功能選擇的建議:
核心一定要的功能,直接編譯進核心內;
可能以後會用到的功能,盡量編譯成模塊;
離開選擇項:左右鍵選擇Exit按回車即可
一些編譯項目如下:
[*] 64-bit kernel
General setup ---> 基本的linux核心功能,最相關的驅動程序、版本說明 核心說明代碼
[*] Enable loadable module support ---> 模塊加載和卸載
-*- Enable the block layer ---> 塊設備的支持
Processor type and features ---> 處理器類型和其功能選擇
Power management and ACPI options ---> 電源管理和ACPI選項
Bus options (PCI etc.) ---> 總線選項和PCI插槽
Executable file formats / Emulations ---> 編譯後執行檔的格式
[*] Networking support ---> 核心網絡功能
Device Drivers ---> 設備驅動
Firmware Drivers --->
File systems ---> 文件系統的支持
Kernel hacking --->
Security options ---> 安全相關模塊
-*- Cryptographic API --->
[*] Virtualization --->
Library routines --->
這裏以編譯2個功能為演示
(Hunk-2018v1.0) Local version - append to kernel release 追加內核版本
[*] Automatically append version information to the version string 自動追加版本號
DOS/FAT/NT Filesystems ---> 核心層支持NTFS 文件系統格式讀寫
都選擇好核心功能後,記得選擇SAVE保存
6.編譯
要想快一點,可以查詢當前系統CPU有幾個核
#lscpu
CPU(s): 4
為了防止意外發生,開啟一個screen窗口,命令功能請自行man
#screen -S kernel
#make -j 4
編譯好之後的源碼目錄為9.8G
#make -j 4 modules
7.編譯後安裝
#make modules_install
#make install
安裝好之後,會在/boot內生成對應的內核相關文件
模塊目錄也會生成/lib/modules/4.14.12Hunk-2018v1.0
#cat /boot/grub2/grub.cfg
menuentry 'CentOS Linux (4.14.12Hunk-2018v1.0) 7 (Core)'
8.檢查無誤後,重啟以便使用新內核
#uname -r
4.14.12hunk-2018-1.0
至此,內核編譯安裝成功。
編譯中的一些選擇
?全編譯: make [-j #]
?編譯內核的一部分功能:
(a) 只編譯某子目錄中的相關代碼
進入源碼文件夾內
# make dir/ 註意,不要進到那個需要編譯指定部分功能的子目錄。
(b) 只編譯一個特定的模塊
cd /usr/src/linux
# make dir/file.ko
例如:只為e1000編譯驅動:
# make drivers/net/ethernet/intel/e1000/e1000.ko
卸載內核
? 刪除/lib/modules/目錄下不需要的內核庫文件
#rm -rf 4.14.12hunk-2018-1.0/
? 刪除源碼目錄
? 刪除/boot目錄下啟動的內核和內核映像文件
#rm *-4*
rm: remove regular file ‘initramfs-4.14.12hunk-2018-1.0.img’? y
rm: remove regular file ‘initramfs-4.14.12hunk-2018-1.0.img.gz’? y
rm: remove regular file ‘System.map-4.14.12hunk-2018-1.0’? y
rm: remove regular file ‘vmlinuz-4.14.12hunk-2018-1.0’? y
? 更改grub的配置文件,刪除不需要的內核啟動列表
# vim /boot/grub2/grub.cfg
Centos 7 源碼編譯安裝內核4.14.12