读前须知:
有的新功能只有新版的linux内核才支持. 所以我们可能会遇到升级内核的情况
目前最新的稳定版本是5.9.14, 但是编译该版本的内核需要高版本的gcc, 生产环境gcc尽量保持与发行版本一致
所以我们本次环境以5.5.9为例
kernel官网:https://www.kernel.org/
kernel-5.5.9国内地址:https://mirrors.tuna.tsinghua.edu.cn/kernel/v5.x/linux-5.5.9.tar.gz
1.下载kernel并解压
得提前准备14GB的空间, 解压内核要1G, 编译之后要占12GB
wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v5.x/linux-5.5.9.tar.gz
tar -xvf linux-5.5.9.tar.gz -C /usr/local
cd /usr/local/linux-5.5.9
2. 设置环境
主要是安装一些常用的依赖, 现在不安装,等编译时候报错再安装也一样的. 因为我安装过的, 所以知道有哪些依赖
代码语言:javascript复制yum install elfutils-libelf-devel bc ncurses-devel flex bison -y
3.配置内核
3.1
我们编译内核的原因是因为我们要定制它, 但是有好几千个选项, 我们不可能一个个去选, 我们可以参考其它发行版本的配置,做一点点修改
代码语言:javascript复制cp -p /boot/config-3.10.0-1127.el7.x86_64 /usr/local/linux-5.5.9/.config #版本要换成你自己的
3.2 编辑内核配置
CONFIG_XXX=y 的表示直接编译到二进制文件里的,
CONFIG_XXX=m 是编译为模块的
3.2.1 方法1 图形化
我们可以用make menuconfig配置
代码语言:javascript复制make menuconfig
我们本次环境就简单点, 修改个透明大页就是了
Memory Management options --> Transparent Hugepage Support 设置为空
3.2.2 方法二 编辑文件
觉得麻烦的也可以直接修改 .config 文件
我再演示下修改.confg文件吧....
用vim或者sed或者edit之类的工具编辑 .config 文件即可, 为方便给命令我就使用sed了
代码语言:javascript复制sed -i '/CONFIG_LOCALVERSION=/cCONFIG_LOCALVERSION="ddcw__modifid_kernel"' .config #我修改的名字而已,表面这玩意是我改的
还有很多参数(没得的就表示不支持, 没有选中的功能,一般会用注释说明的):
如透明大页: CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS
硬件厂商应该也有.config的例子, 毕竟内核要跑在他们的硬件上.
4. 编译内核 和 安装内核 和 安装模块
4.1 编译内核
编译内核非常慢, 我的环境配置还行,我就用12线程跑,结果还是跑了半小时.
代码语言:javascript复制make -j 12
4.2安装模块
就是刚才编译的那些模块
代码语言:javascript复制make modules_install
安装后/usr/lib 目录增大了很多,主要是驱动太大.
4.3 安装内核
代码语言:javascript复制make install
至此安装结束, 接下来就是测试了
5.测试并设置默认启动内核
5.1测试
就直接重启,重启的时候选择我们刚才编译的内核
5.1.1 检查内核版本
代码语言:javascript复制[root@ddcw ~]# uname -r
5.5.9ddcw__modifid_kernel
5.1.2 验证透明大页功能
代码语言:javascript复制[root@ddcw ~]# cat /sys/kernel/mm/transparent_hugepage/enabled #这是centos的透明大页位置,redhat有点名字区别
cat: /sys/kernel/mm/transparent_hugepage/enabled: No such file or directory
[root@ddcw ~]#
5.2 没得问题的话, 就设置为默认启动就行
5.2.1查看当前有哪些可选启动项
代码语言:javascript复制[root@ddcw ~]# grep 'menuentry ' /boot/grub2/grub.cfg
menuentry 'CentOS Linux (5.5.9ddcw__modifid_kernel) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-1127.el7.x86_64-advanced-0c09efad-a4bf-4385-b564-8bef37062843' {
menuentry 'CentOS Linux (3.10.0-1127.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-1127.el7.x86_64-advanced-0c09efad-a4bf-4385-b564-8bef37062843' {
menuentry 'CentOS Linux (0-rescue-4420387e65d64ba29fe9cbc54731d59f) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-4420387e65d64ba29fe9cbc54731d59f-advanced-0c09efad-a4bf-4385-b564-8bef37062843' {
[root@ddcw ~]#
5.2.2 设置默认启动内核
代码语言:javascript复制grub2-set-default 'CentOS Linux (5.5.9ddcw__modifid_kernel) 7 (Core)' #也可以修改/etc下的配置文件,但是太麻烦
grub2-editenv list #列出当前默认启动内核
#然后再重启一下,默认就是我们设置的内核了
6. 内核rpm包
编译安装太麻烦,
也可以去下载编译好的rpm包来升级,
也可以自己编译好了做成RPM包,
也可以直接tar打包然后拷贝到模板环境再安装都是可行的
做RPM包的时候最好是参考官网给的SRPM来做
发行版本官网一般都有SRPM目录来放RPM源码包的
如centos7.8的内核SRPM包: https://archive.kernel.org/centos-vault/7.8.2003/os/Source/SPackages/kernel-3.10.0-1127.el7.src.rpm
感兴趣的可以自己去整整, 也可以参考我之前写的nginx制作为RPM包 ,虽然不够专业,但是够简单
特别说明: 生产环境尽量别升级内核, 除非你很想要某个新功能. 稳定大于一切!!!