Centos7编译内核

建议所有操作都在root账户下进行

  • 查看系统版本
[root@master ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 

Centos是红帽的重新编译版本,除了没有红帽的标志性商标以及红帽收费版的软件外,其他功能与红帽几乎一致,包括这里的 redhat-release 文件,这是一个在红帽系统或者Centos系统中都有的文件,用来记录系统的版本信息,乍一看还以为是RHEL系统。

  • 查看内核版本
[root@master ~]# hostnamectl
   Static hostname: master
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 7166dcf32e654437a557a9410acd3632
           Boot ID: 3366d3ff4a0f4972a42e0a6c1ac91062
    Virtualization: vmware
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-957.el7.x86_64
      Architecture: x86-64
  • 安装必要的编译环境
 yum install gcc g++ gdb make
  • 下载内核

所有Liunux内核版本下载地址

进入4.x内核版本的文件目录,往下翻,直到找到.tar.gz的文件,内核大小一半在120M左右。
在这里插入图片描述

复制内核下载链接地址
右键要下载的内核链接地址,选择复制链接地址,然后再切换到/usr/src/kernels目录下,因为这是内核存放的目录,所以我们直接下载到内核到该目录,接着在终端输入 wget + 复制的链接地址开始下载,下载过程比较慢。

wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.1.16.tar.gz
  • 查看cpu核心数

趁着下载的时间,我们查看一下cpu的核心数,一会编译会用到,/proc/cpuinfo 文件中存放着cpu的信息,用 cat /proc/cpuinfo | grep process 命令查看的话内容比较多,所以我们用 grep 命令将 processor筛选出来,由此可以看出我的cpu核心数为6,对于多cpu和超多核心的cpu来说这样看起来也不是很方便,通常核心数就好几页,这时候就需要用到统计命令 wc -l 了,共六行,也就是6核心。

[root@master kernels]# cat /proc/cpuinfo | grep processor
processor	: 0
processor	: 1
processor	: 2
processor	: 3
processor	: 4
processor	: 5
[root@master kernels]# cat /proc/cpuinfo | grep process | wc -l
6
  • 内核编译模式

要增加对某部分功能的支持,比如网络之类,可以把相应部分编译到内核中(build-in),也可以把该部分编译成模块(module),动态调用。如果编译到内核中,在内核启动时就可以自动支持相应部分的功能,这样的优点是方便、速度快,机器一启动,你就可以使用这部分功能了;缺点是会使内核变得庞大起来,不管你是否需要这部分功能,它都会存在,这就是Windows惯用的招数,建议经常使用的部分直接编译到内核中,比如网卡。如果编译成模块,就会生成对应的.o文件,在使用的时候可以动态加载,优点是不会使内核过分庞大,缺点是你得自己来调用这些模块。

  • 配置内核

内核编译的选择很多,我只想升级内核,就不对内核进行设置了,只要保留原来内核的设置就好了,将旧内核的配置选项复制到 /usr/src/kernals/内核解压目录/.config 目录下

cp config-3.10.0-957.el7.x86_64 /usr/src/kernels/linux-4.1.16/.config

在旧内核配置的基础上配置新内核,执行这条命令后会有很多选项,只是升级不想配置内核的话可以按住回车键全部默认,直到配置结束,大概按住个几十秒就能配置完成。

make oldconfig 
  • 编译内核

确保当前目录为 /usr/src/kernels/新内核解压目录/,执行make -j6 all

在使用make命令编译源码的时候可以用-jn指定用n颗cup核心进行多核编译提高编译速度,我的核心数是6,所以用 -j6 6核心去编译,编译速度很快。

make -j6 all
  • 安装内核

编译完成后执行 sudo make modules_install 命令

sudo make modules_install

再执行内核安装命令

make install

到这一步内核编译就全部完成了,只要重启系统,在内核选择界面就会出现新的内核选项,选择新的内核版本启动就可以使用新内核了
新内核
进入系统查看系统信息,可以看到内核已经由 3.10.0 变成了 4.1.16

[root@master ~]# uname -r
4.1.16
  • 设置默认的内核启动项

查看可以使用的内核选项

[root@master ~]# cat /boot/grub2/grub.cfg | grep menuentry
if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
  menuentry_id_option=""
export menuentry_id_option
menuentry 'CentOS Linux (4.1.16) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-957.el7.x86_64-advanced-285c095e-2eb9-4458-aded-8a70bef7c92f' {
menuentry 'CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-957.el7.x86_64-advanced-285c095e-2eb9-4458-aded-8a70bef7c92f' {
menuentry 'CentOS Linux (0-rescue-7166dcf32e654437a557a9410acd3632) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-7166dcf32e654437a557a9410acd3632-advanced-285c095e-2eb9-4458-aded-8a70bef7c92f' {

内核选项

设置 4.1.16 版本的内核作为开机默认使用内核

[root@master ~]# grub2-set-default 'CentOS Linux (4.1.16) 7 (Core)'

查看修改结果

root@master ~]# grub2-editenv list
saved_entry=CentOS Linux (4.1.16) 7 (Core)

再次重启系统可以看到,默认内核选项是4.1.16版本
默认内核选项

  • 删除不用的内核版本

查看系统中安装了哪些内核版本

[root@master ~]# rpm -qa |grep kernel
kernel-tools-3.10.0-957.el7.x86_64
abrt-addon-kerneloops-2.1.11-52.el7.centos.x86_64
kernel-3.10.0-957.el7.x86_64
kernel-tools-libs-3.10.0-957.el7.x86_64
kernel-headers-3.10.0-1062.9.1.el7.x86_64

使用 yum removerpm -e 删除内核,从开机画面中可以看到,我们更新内核前所用的内核版本是 kernel-3.10.0-957.el7.x86_64,我们试着删除这个内核。

[root@master ~]# yum remove kernel-3.10.0-957.el7.x86_64
Loaded plugins: fastestmirror, langpacks
Repository base is listed more than once in the configuration
Resolving Dependencies
--> Running transaction check
---> Package kernel.x86_64 0:3.10.0-957.el7 will be erased
--> Processing Dependency: kernel >= 2.6.32 for package: lldpad-1.0.1-3.git036e314.el7.x86_64
--> Processing Dependency: kernel >= 3.10.0-862.el7 for package: kmod-kvdo-6.1.1.125-5.el7.x86_64
省略部分输出...

重新开机,3.10.0 的内核已经被删除了
删除内核
可能会出现的问题——boot分区存储空间不足
我们编译的新内核是放在boot分区中的,由于我的boot分区中没有其他内核,所以在本次编译的过程中很顺利,没有出现boot分区存储空间不足的情况,所以建议大家如果有一定的基础的话在安装Linux系统的时候不要选择默认安装,除非你只是用来学习一些简单的命令,特别是在生产环境下,一定要自己手动配置分区,然后给boot分区配置的存储空间大一点,毕竟现在的硬盘基本是白菜价,配置个1g或者八九百M的应该不会占用很多存储空间,免得到时候升级内核带来很多不必要的麻烦。

附上一篇关于内核编译的详细说明
非常好的Linux编译内核详解

发布了92 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zZzZzZ__/article/details/103938280