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

posted @ 2022-04-23 18:16  尘星空  阅读(1919)  评论(0编辑  收藏  举报