建議所有操作都在root賬戶下進行
- 查看系統版本
[root@master ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
Centos是紅帽的重新編譯版本,除了沒有紅帽的標誌性商標以及紅帽收費版的軟件外,其他功能與紅帽幾乎一致,包括這裏的
redhat-release
文件,這是一個在紅帽系統或者Centos系統中都有的文件,用來記錄系統的版本信息,乍一看還以爲是RHEL系統。
- 查看內核版本
[root@master ~]# hostnamectl
Static hostname: master
Icon name: computer-vm
Chassis: vm
Machine ID: 7166dcf32e654437a557a9410acd3632
Boot ID: 3366d3ff4a0f4972a42e0a6c1ac91062
Virtualization: vmware
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-957.el7.x86_64
Architecture: x86-64
- 安裝必要的編譯環境
yum install gcc g++ gdb make
- 下載內核
進入4.x內核版本的文件目錄,往下翻,直到找到.tar.gz的文件,內核大小一半在120M左右。
複製內核下載鏈接地址
右鍵要下載的內核鏈接地址,選擇複製鏈接地址,然後再切換到/usr/src/kernels
目錄下,因爲這是內核存放的目錄,所以我們直接下載到內核到該目錄,接着在終端輸入 wget
+ 複製的鏈接地址開始下載,下載過程比較慢。
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.1.16.tar.gz
- 查看cpu核心數
趁着下載的時間,我們查看一下cpu的核心數,一會編譯會用到,/proc/cpuinfo
文件中存放着cpu的信息,用 cat /proc/cpuinfo | grep process
命令查看的話內容比較多,所以我們用 grep
命令將 processor篩選出來,由此可以看出我的cpu核心數爲6,對於多cpu和超多核心的cpu來說這樣看起來也不是很方便,通常核心數就好幾頁,這時候就需要用到統計命令 wc -l
了,共六行,也就是6核心。
[root@master kernels]# cat /proc/cpuinfo | grep processor
processor : 0
processor : 1
processor : 2
processor : 3
processor : 4
processor : 5
[root@master kernels]# cat /proc/cpuinfo | grep process | wc -l
6
- 內核編譯模式
要增加對某部分功能的支持,比如網絡之類,可以把相應部分編譯到內核中(build-in),也可以把該部分編譯成模塊(module),動態調用。如果編譯到內核中,在內核啓動時就可以自動支持相應部分的功能,這樣的優點是方便、速度快,機器一啓動,你就可以使用這部分功能了;缺點是會使內核變得龐大起來,不管你是否需要這部分功能,它都會存在,這就是Windows慣用的招數,建議經常使用的部分直接編譯到內核中,比如網卡。如果編譯成模塊,就會生成對應的.o文件,在使用的時候可以動態加載,優點是不會使內核過分龐大,缺點是你得自己來調用這些模塊。
- 配置內核
內核編譯的選擇很多,我只想升級內核,就不對內核進行設置了,只要保留原來內核的設置就好了,將舊內核的配置選項複製到 /usr/src/kernals/內核解壓目錄/.config
目錄下
cp config-3.10.0-957.el7.x86_64 /usr/src/kernels/linux-4.1.16/.config
在舊內核配置的基礎上配置新內核,執行這條命令後會有很多選項,只是升級不想配置內核的話可以按住回車鍵全部默認,直到配置結束,大概按住個幾十秒就能配置完成。
make oldconfig
- 編譯內核
確保當前目錄爲 /usr/src/kernels/新內核解壓目錄/
,執行make -j6 all
在使用make命令編譯源碼的時候可以用-jn指定用n顆cup核心進行多核編譯提高編譯速度,我的核心數是6,所以用
-j6
6核心去編譯,編譯速度很快。
make -j6 all
- 安裝內核
編譯完成後執行 sudo make modules_install
命令
sudo make modules_install
再執行內核安裝命令
make install
到這一步內核編譯就全部完成了,只要重啓系統,在內核選擇界面就會出現新的內核選項,選擇新的內核版本啓動就可以使用新內核了
進入系統查看系統信息,可以看到內核已經由 3.10.0
變成了 4.1.16
[root@master ~]# uname -r
4.1.16
- 設置默認的內核啓動項
查看可以使用的內核選項
[root@master ~]# cat /boot/grub2/grub.cfg | grep menuentry
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
menuentry_id_option=""
export menuentry_id_option
menuentry 'CentOS Linux (4.1.16) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-957.el7.x86_64-advanced-285c095e-2eb9-4458-aded-8a70bef7c92f' {
menuentry 'CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-957.el7.x86_64-advanced-285c095e-2eb9-4458-aded-8a70bef7c92f' {
menuentry 'CentOS Linux (0-rescue-7166dcf32e654437a557a9410acd3632) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-7166dcf32e654437a557a9410acd3632-advanced-285c095e-2eb9-4458-aded-8a70bef7c92f' {
設置 4.1.16
版本的內核作爲開機默認使用內核
[root@master ~]# grub2-set-default 'CentOS Linux (4.1.16) 7 (Core)'
查看修改結果
root@master ~]# grub2-editenv list
saved_entry=CentOS Linux (4.1.16) 7 (Core)
再次重啓系統可以看到,默認內核選項是4.1.16版本
- 刪除不用的內核版本
查看系統中安裝了哪些內核版本
[root@master ~]# rpm -qa |grep kernel
kernel-tools-3.10.0-957.el7.x86_64
abrt-addon-kerneloops-2.1.11-52.el7.centos.x86_64
kernel-3.10.0-957.el7.x86_64
kernel-tools-libs-3.10.0-957.el7.x86_64
kernel-headers-3.10.0-1062.9.1.el7.x86_64
使用 yum remove
或 rpm -e
刪除內核,從開機畫面中可以看到,我們更新內核前所用的內核版本是 kernel-3.10.0-957.el7.x86_64
,我們試着刪除這個內核。
[root@master ~]# yum remove kernel-3.10.0-957.el7.x86_64
Loaded plugins: fastestmirror, langpacks
Repository base is listed more than once in the configuration
Resolving Dependencies
--> Running transaction check
---> Package kernel.x86_64 0:3.10.0-957.el7 will be erased
--> Processing Dependency: kernel >= 2.6.32 for package: lldpad-1.0.1-3.git036e314.el7.x86_64
--> Processing Dependency: kernel >= 3.10.0-862.el7 for package: kmod-kvdo-6.1.1.125-5.el7.x86_64
省略部分輸出...
重新開機,3.10.0
的內核已經被刪除了
可能會出現的問題——boot分區存儲空間不足
我們編譯的新內核是放在boot分區中的,由於我的boot分區中沒有其他內核,所以在本次編譯的過程中很順利,沒有出現boot分區存儲空間不足的情況,所以建議大家如果有一定的基礎的話在安裝Linux系統的時候不要選擇默認安裝,除非你只是用來學習一些簡單的命令,特別是在生產環境下,一定要自己手動配置分區,然後給boot分區配置的存儲空間大一點,畢竟現在的硬盤基本是白菜價,配置個1g或者八九百M的應該不會佔用很多存儲空間,免得到時候升級內核帶來很多不必要的麻煩。
附上一篇關於內核編譯的詳細說明
非常好的Linux編譯內核詳解