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
一个呢?有:
- 自己打个 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