centos 編譯安裝新內核並添加中文內核補丁(cjktty)模塊


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 一個呢?有:

  1. 自己打個 rpm 包,維護個 yum 源,這個代價太大 ==!;
  2. 用別人提供的 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版本

devtoolset-4對應gcc5.x.x版本
devtoolset-6對應gcc6.x.x版本
devtoolset-7對應gcc7.x.x版本
devtoolset-8對應gcc8.x.x版本
devtoolset-9對應gcc9.x.x版本
devtoolset-10對應gcc10.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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM