https://www.cnblogs.com/eddie1127/p/11439718.html
https://zhuanlan.zhihu.com/p/458441866
1、下載最新穩定版本的內核源碼包到 /usr/local/src ,並解壓到當前目錄
內核網址,網址提供多種協議進行下載(https://www.kernel.org/)
root@localhost /usr/src cd /usr/local/src
root@localhost /usr/src wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.17.tar.xz
已經下載完成:(注意:如果下載很慢或者不能下載也可直接到網址上下載好后再上傳到centos,這樣比較快)
解壓:tar -xvf linux-5.17.tar.xz
解壓完成:
如果不安裝中文補丁可以直接跳過下面步驟,到步驟拷貝config配置文件
從git上克隆Linux中文補丁包:cjktty-patches
命令:git clone https://github.com/zhmars/cjktty-patches/
如果克隆不下來,就直接去網址上下載再上傳到centos上,自行解壓也可以,還比較快
解壓到指定目錄:
安裝patch工具(用於向內核包添加中文補丁包cjtty):
進入目錄:/usr/src/linux-5.17
命令:cd /usr/src/linux-5.17
執行命令:patch -Np1 < ../cjktty/v5.x/cjktty-5.17.patch #把cjtty補丁添加到內核源碼上
拷貝config配置文件
從現正運行的系統版本目錄 /boot 下將現有版本的內核編譯config配置文件拷過來到放到新的內核源碼解壓目錄(/usr/src/linux-5.17/)內並重命名為.config的隱藏文件
這是要拷貝的文件位置:
命令(注意這里的目錄是在待編譯的內核目錄下): cp /boot/config-5.16.12-1.el7.elrepo.x86_64 ./.config
從boot目錄拷貝原內核的config文件過來主要是為了方便,這個文件保存了在安裝系統時內核所安裝的模塊配置信息(否則需要重新手動指定每一個模塊的編譯配置)。
安裝依賴包
安裝開發工具包組
[root@localhost linux-5.2.11]# yum -y groupinstall "development tools"
安裝ncurse-devel包 (make menuconfig 文本界面窗口依賴包)
[root@localhost linux-5.2.11]# yum -y install ncurses-devel
運行 make menuconfig,開啟文本界面的編譯選項菜單窗口,可以對內核加載的模塊編譯選項進行調整,如修改編譯后的內核名稱、新添加之前系統缺少的模塊等。
此處提示gcc版本過低:
CentOS/RHEL Linux 發行版以穩定性著稱,所有的軟件都要盡可能 stable,導致的一個結果就是基礎軟件的版本非常的低,比如 CentOS 6.7(15年發布) 中 gcc 版本還是 4.4.7(12年的版本)。這對開發來說就不是很友好,比如我們想用 C++ 11 中的某個特性,就必須自己編譯一個高版本的 gcc 出來,但是這會有另外一個問題,開發環境不好維護,如果自己有多台電腦或者多個人合作的項目,每台機器上都要自己編一份,維護起來就比較麻煩。
那么有沒有法子像正常的安裝 rpm 包一樣,yum install
一個呢?有:
- 自己打個 rpm 包,維護個 yum 源,這個代價太大 ==!;
- 用別人提供的 rpm 包。
本文介紹的就是第二種,推薦 devtoolset + scl,也最好用這種方法
devtoolset 是由 Linux @ CERN 維護的,
scl 是方便 RedHat Software Collections 軟件包使用的工具。
需要升級gcc,通過安裝devtoolset來管理gcc各個版本,有需要就可以自由切換:devtoolset版本:devtoolset-1.1 devtoolset-2 devtoolset-3 devtoolset-4,以上版本分別對應gcc的版本為4.7、4.8、4.9、5.2
devtoolset-3對應gcc4.x.x版本
sudo yum install centos-release-scl-r
列出最新的devtoolset-8包列表:
sudo yum list devtoolset-8\*
sudo yum-config-manager --enable centos-sclo-rh-testing
安裝: sudo yum install devtoolset-8
啟用新版本(切換):
scl enable devtoolset-8 bash
查看gcc版本已經切換了
更新了gcc ,啟動 make menuconfig
要修改的三個項目(注意這里如果要安裝中文補丁第一項和第二項必須修改,第三項是可選的,如果只是編譯安裝新的內核可以只修改第三項):
1. Cryptographic API -> Certificates for signature checking -> Provide system-wide ring of trusted keys,將這一行里的內容清空(編輯下面...X.509...行,刪除所有內容)。或者編輯.config文件設置CONFIG_SYSTEM_TRUSTED_KEYS=""
2. Library routines -> CJK 16x16 font & CJK 32x32 font,確認勾選。對應的是.config文件CONFIG_FONT_CJK_16x16=y & CONFIG_FONT_CJK_32x32=y
3. General setup -> Local version - append to kernel release,建議編輯添加下描述(在內核信息末尾添加-cjktty)。對應的是.config文件CONFIG_LOCALVERSION="-cjktty"
添加內核NTFS文件系統支持模塊:
File systems --->DOS/FAT/NT Filesystems --->NTFS file system support
建議選擇以模塊方式(M選項)編譯。(*號則是以靜態方式編譯打包進內核文件中,如果新添加的模塊較多,會導致內核文件體積增大)
編譯內核
[root@localhost linux-5.2.11]# make -j 4 #根據CPU核數開啟多線程編譯以加快編譯速度,這里是4核
有錯誤提示如果要安裝OpenSSL
這里提示的是目錄下的文件 scripts/sign-file.c 找不到openssl/opensslv.h 也就是 #include <openssl/openssl.h> 找不到頭文件openssl/openssl.h出現錯誤
查看是否安裝OpenSSL : yum info openssl
使用命令:echo|gcc -x c -v -E - ,來查看gcc頭文件搜索目錄:
使用命令:find / -name openssl 查看所有文件夾或文件有名稱為openssl的目錄
從上目錄看出確實openssl確實不在gcc頭文件的尋找目錄下
在/usr/include 目錄下添加 目錄 /usr/local/openssl/include/openssl 文件夾的軟連接: ln -s /usr/local/openssl/include/openssl /usr/include/openssl
再次運行出現錯誤:
查看:/usr/src/linux-5.17/scripts/Makefile
然后輸入命令: pkg-config --libs libcrypto
輸出:-L/usr/local/lib -lcrypto
把這句話,復制替換scripts
目錄下的Makefile :
備份下Makefile: cp Makefile Makefile.bak
查看有沒有安裝crypto庫:ldconfig -p|grep crypto
這里提示的是已經安裝
查看 scripts/Makefile文件的內容,針對sign-file的編譯和鏈接都是用pkg-config來做的:
pkg-config簡單的說就是向用戶提供相應庫的路徑,版本號,頭文件路徑等信息的綜合調用程序。
--cflags 提供編譯時的庫或頭文件路徑 ,相當於根據pc文件生成用我們直接用gcc編譯時的CFLAGS參數
--libs 提供鏈接時的庫或頭文件路徑,相當於生成我們用gcc在鏈接時使用的LDFLAGS參數
有時候可能調試信息沒有打開需要設置兩個環境變量:
都設置為1可以正常顯示
因此當我們需要在自己的工程中編譯鏈接時只需要合理的使用pkg-config工具,把上面那些參數加入到gcc的參數里即可,這個就是pkg-config工具的核心作用,它會檢查你的庫,產生相應信息,為你集成某個第三方庫提供便利。
*.pc文件解析
第三方庫的使用主要涉及頭文件的路徑設置,庫的路徑設置以及動態庫的環境變量設置。一般來講,第三方庫都會提供一個*.pc
文件,pkg-config程序通過讀取這個*.pc
的文件,獲取了庫的頭文件位置和庫的路徑等信息,然后告知編譯器,實現庫的自動使用。一般來說,*.pc
文件的大體內容如下格式
查找crypto庫的pc文件:
查看crypto庫的pc文件,格式大概是這樣:
其中,
prefix
一般是指定庫的默認安裝路徑exec_prefix
一般是指庫的另外指定的安裝路徑inludedir
指定庫的頭文件路徑libdir
指定庫的lib文件的路徑Name
指定庫的名稱,比如筆者使用的SQLite數據庫Description
表示庫的描述Version
是版本號Cflags
是gcc鏈接頭文件的指令,以-I
緊接頭文件路徑設置Libs
是gcc鏈接lib文件的指令, 是-L
緊接lib文件路徑,-l
緊接所使用的lib的名字。
如何編譯鏈接到你的工程?
注意,使用pkg-config工具提取庫的編譯和鏈接參數需要有兩個基本前提:
1)庫本身安裝的時候必須提供一個.pc文件。沒有這個文件的說明庫不支持pkg-config工具;
2)pkg-config必須要知道去哪找.pc文件;
對於支持pkg-config工具的庫來說,庫文件的搜索路徑實際就是對.pc文件的搜索路徑,一般系統的默認搜索路在/usr/lib/pkgconfig 中,庫的頭文件一般在/usr/include中。而個人使用的第三方庫,不能每次編譯后都裝到/usr目錄下吧。所以私有工程在編譯鏈接第三方庫時可以通過修改環境變量PKG_CONFIG_PATH來設置,pkg-config工具將按照設置路徑的先后順序進行搜索,直到找到指定的.pc文件為止。
先查看環境變量PKG_CONFIG_PATH
/opt/rh/devtoolset-8/root/usr/lib64/pkgconfig
顯然沒有包含目錄:/usr/lib64/pkgconfig/libcrypto.pc
查看目錄/usr/lib64/pkgconfig/ 下面包含很多pc文件:
所以應該把這個目錄加到原來變量的前面:
export PKG_CONFIG_PATH='/usr/lib64/pkgconfig':$PKG_CONFIG_PATH
最終解決辦法在PKG_CONFIG_PATH環境變量的目錄上添加openssl 的pkgconfig目錄
還有一個錯誤是bash找不到openssl命令,要把openssl的可執行文件軟連接到/usr/bin 目錄下,再次編譯,注意上面出現的兩個錯誤都是因為我之前為了安裝Python 3.9 的pip升級了openssl版本而沒有配置好openssl的緣故,主要是沒有配置把openssl 的頭文件和庫文件添加到系統或gcc默認查找頭文件和庫文件的目錄下造成的編譯錯誤,另外,make工作用到了pkg-config命令,也沒有把openssl的pkconfig目錄添加到環境變量$PKG_CONFIG_PATH上,這也是第二個錯誤的原因.
編譯如果沒有報錯順利完成后(大概需要2個小時左右,磁盤空間需要25G左右)
執行編譯安裝模塊
編譯完成后執行make modules_install 安裝內核模塊
[root@localhost linux-5.2.11]# make modules_install
內核模塊安裝完成后:
安裝內核核心文件
[root@localhost linux-5.2.11]# make install
重啟后進入,可以支持中文了
此筆記肯定有諸多不足之處,有引用者發現不足處,多多包涵指正
有關cjktty的文章,另外一種新框架Wayland解決方案,
https://my.oschina.net/u/5575069/blog/5496659
https://zhuanlan.zhihu.com/p/423462310