Centos7編譯內核

建議所有操作都在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
  • 下載內核

所有Liunux內核版本下載地址

進入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 removerpm -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編譯內核詳解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章