1. 前言
Linux 內核升級到最新的版本,需要先升級gcc
的版本,本文主要以 RHEL8.0 爲 OS,講解 Linux 內核5.6.3
版本和 GCC 編譯器7.5
爲例,講解整個更新過程。
2. 升級必須的安裝包
OS 安裝選擇的是 Desktop 下包全選,如果是其他安裝,需要檢查 OS 是否安裝 gcc,libstdc++,make 以及 kernel-headers,kernel-devel,ncurses-devel 等等,如果沒有安裝,可以通過 yum 安裝"development tools" group.
yum groupinstall "Development Tools
yum install ncurses-devel
3. 更新gcc
編譯器版本到 7.5
1.解壓 gcc 壓縮包到指定目錄
tar -xvf gcc-7.5.0.tar.gz -C /usr/local/src/
一般我們將第三方的軟件源代碼放置在/usr/local/src
目錄
2.下載必要的編譯庫
cd /usr/local/src/gcc-7.5.0
可以通過目錄contrib/download_prerequisites
查看到必要的庫有以下幾個:
如果機器已經連接互聯網,則可以通過執行以下命令,直接從互聯網自動下載
./contrib/download_prerequisites
當然如果沒有聯網,可以通過自己手動下載,下載地址是ftp://gcc.gnu.org/pub/gcc/infrastructure/,然後將這四個壓縮包放置到gcc
源碼根目錄/usr/local/src/gcc-7.5.0
,然後再執行即可。
[root@localhost gcc-7.5.0]# cp /mnt/Private/Compressed/gmp-6.1.0.tar.bz2 .
[root@localhost gcc-7.5.0]# cp /mnt/Private/Compressed/mpfr-3.1.4.tar.bz2 .
[root@localhost gcc-7.5.0]# cp /mnt/Private/Compressed/mpc-1.0.3.tar.gz .
[root@localhost gcc-7.5.0]# cp /mnt/Private/Compressed/isl-0.16.1.tar.bz2 .
[root@localhost gcc-7.5.0]# ./contrib/download_prerequisites
gmp-6.1.0.tar.bz2: OK
mpfr-3.1.4.tar.bz2: OK
mpc-1.0.3.tar.gz: OK isl-0.16.1.tar.bz2: OK
All prerequisites downloaded successfully.
3.編譯安裝
./configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
make -j24
make install
shutdown -r now
--disable-multilib
意味着只編譯 64bit 編譯器,如果想編譯 32bit 編譯器,可以用--enbale-multilib
,OS 必須安裝 i686 的包,這些包默認是沒有安裝的。 --enbale-languages
指定編譯的語言,如果不指定,可能需要好幾天的時間。 make -j24
並行多線程編譯,可以減少編譯時間。24
指定 jobs number.可以指定爲 CPU 支持的最大線程數。
48 個 jobs,我這可是一個 48 cores 的機器,編譯用時 13 分鐘,如果是個人 PC,那估計沒個幾個小時,是不可能完事,開始編譯,該幹嘛就可以幹嘛去了。
安裝完成後必須重啓系統,不然下一步升級內核會報錯
重啓後,gcc -v
查看當前gcc
版本是否是最新的版本。
[root@localhost ~]# gcc -v
Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/7.5.0/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: ./configure --enable-checking=release --enable-languages=c,c++ --disable-multilib Thread model: posix gcc version 7.5.0 (GCC)
4. 更新內核到5.6.3
開始編譯前,需要先安裝 libelf-dev, libelf-devel 或者 elfutils-libelf-devel。 RHEL8.0 OS, 我們選擇安裝 elfutils-libelf-devel.
yum install elfutils-libelf-devel
還需要安裝openssl-devel
加解密開發包
yum install openssl-devel
1.解壓內核源文件到指定目錄
tar -xvf linux-5.6.3.tar.xz -C /usr/src/kernels/
一般我們將內核源代碼放置在目錄/usr/src/kernels
,該目錄同樣是系統默認內核的 kernel source 所在位置。
2.編譯安裝
cd /usr/src/kernels/linux-5.6.3/ sh -c 'yes "" | make oldconfig' make -j48 make modules_install make install
第二個命令用於將當前系統的內核選項生成到當前目錄,會在內核目錄生成.config
文件,該文件內記錄了哪些編譯爲模塊,哪些是 buildin。
另外,
可以通過make clean
清理編譯環境,這個命令會清理掉已經編譯的,但不包含配置文件,如.config
可以通過make mrproper
清理編譯環境,包含所有的編譯內容。
編譯過程中顯示的CC
是check compile
的縮寫。
[M]
表示編譯爲module
,否則爲 buildin。
如果有特殊編譯需求,可以通過make menuconfig
逐一配置編譯項。
3.切換啓動內核爲新的內核
grub2-set-default 0
切換默認引導項爲第一項,可以查看 grub.cfg 文件。
4.重啓後查看內核版本
[root@localhost ~]# uname -r 5.6.3
5. Debug
-
如果報以下錯誤
make[1]: *** No rule to make target 'certs/rhel.pem', needed by 'certs/x509_certificate_list'.
可以查看.config 文件中,CONFIG_SYSTEM_TRUSTED_KEYS="certs/rhel.pem"
改爲CONFIG_SYSTEM_TRUSTED_KEYS=""
即可。