24.5 以最新核心版本编译 CentOS 7.x 的核心

如果你跟鸟哥一样,曾经为了某些缘故需要最新的 4.x.y 的核心版本来实作某些特定的功能时,那该如何是好?没办法,只好使用最新的核心版本来编译啊! 你可以依照上面的程序来一个一个处理,没有问题~不过,你也可以根据 ELRepo 网站提供的 SRPM 来重新编译打包喔! 当然你可以直接使用 ELRepo 提供的 CentOS 7.x 专属的核心来直接安装。

下面我们使用 ELRepo 网站提供的 SRPM 文件来实作核心编译。而要这么重新编译的原因是,鸟哥需要将 VFIO 的 VGA 直接支持的核心功能打开! 因此整个程序会变成类似这样:

  1. 先从 ELRepo 网站下载不含源代码的 SRPM 文件,并且安装该文件
  2. 从 www.kernel.org 网站下载满足 ELRepo 网站所需要的核心版本来处理
  3. 修改核心功能
  4. 通过 SRPM 的 rpmbuild 重新编译打包核心

就让我们来测试一下啰!(注意,鸟哥使用的是 2015/10/20 当下最新的 4.2.3 这一版的核心。由于核心版本的升级太快,因此在你实作的时间, 可能已经有更新的核心版本了。此时你应该要前往 ELRepo 查阅最新的 SRPM 之后,再决定你想使用的版本喔!)

1\. 先下载 ELRepo 上面的 SRPM 文件!同时安装它:
[root@study ~]# wget http://elrepo.org/linux/kernel/el7/SRPMS/kernel-ml-4.2.3-1.el7.elrepo.nosrc.rpm
[root@study ~]# rpm -ivh kernel-ml-4.2.3-1.el7.elrepo.nosrc.rpm

2\. 根据上述的文件,下载正确的核心源代码:
[root@study ~]# cd rpmbuild/SOURCES
[root@study SOURCES]# wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.2.3.tar.xz
[root@study SOURCES]# ll -tr
.....(前面省略).....
-rw-r--r--. 1 root root 85523884 Oct  3 19:58 linux-4.2.3.tar.xz  # 核心源代码
-rw-rw-r--. 1 root root      294 Oct  3 22:04 cpupower.service
-rw-rw-r--. 1 root root      150 Oct  3 22:04 cpupower.config
-rw-rw-r--. 1 root root   162752 Oct  3 22:04 config-4.2.3-x86_64 # 主要的核心功能

3\. 修改核心功能设置:
[root@study SOURCES]# vim config-4.2.3-x86_64
# 大约在 5623 行找到下面这一行,并在下面新增一行设置值!
# CONFIG_VFIO_PCI_VGA is not set
CONFIG_VFIO_PCI_VGA=y

[root@study SOURCES]# cd ../SPECS
[root@study SPECS]# vim kernel-ml-4.2.spec
# 大概在 145 左右找到下面这一行:
Source0: ftp://ftp.kernel.org/pub/linux/kernel/v4.x/linux-%{LKAver}.tar.xz
# 将它改成如下的模样:
Source0: linux-%{LKAver}.tar.xz

4\. 开始编译并打包:
[root@study SPECS]# rpmbuild -bb kernel-ml-4.2.spec
# 接下来会有很长的一段时间在进行编译行为,鸟哥的机器曾经跑过两个小时左右才编译完!
# 所以,请耐心等候啊!
Wrote: /root/rpmbuild/RPMS/x86_64/kernel-ml-4.2.3-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/kernel-ml-devel-4.2.3-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/kernel-ml-headers-4.2.3-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/perf-4.2.3-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/python-perf-4.2.3-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/kernel-ml-tools-4.2.3-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/kernel-ml-tools-libs-4.2.3-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/kernel-ml-tools-libs-devel-4.2.3-1.el7.centos.x86_64.rpm

如上表最后的状态,你会发现竟然已经有 kernel-ml 的软件包产生了!接下来你也不需要像手动安装核心一样,得要一个一个项目移动到正确的位置去, 只要使用 yum install 新的核心版本,就会有 4.2.3 版的核心在你的 CentOS 7.x 当中了耶!相当神奇!

[root@study ~]# yum install /root/rpmbuild/RPMS/x86_64/kernel-ml-4.2.3-1.el7.centos.x86_64.rpm
[root@study ~]# reboot

[root@study ~]# uname -a
Linux study.centos.vbird 4.2.3-1.el7.centos.x86_64 #1 SMP Wed Oct 21 02:31:18 CST 2015 x86_64 
x86_64 x86_64 GNU/Linux

这样就让我们的 CentOS 7.x 具有最新的核心啰!与核心官网相同版本咧~够帅气吧!

24.6 重点回顾

  • 其实核心就是系统上面的一个文件而已,这个文件包含了驱动主机各项硬件的侦测程序与驱动模块;
  • 上述的核心模块放置于:/lib/modules/$(uname -r)/kernel/
  • “驱动程序开发”的工作上面来说,应该是属于硬件发展厂商的问题
  • 一般的使用者,由于系统已经将核心编译的相当的适合一般使用者使用了,因此一般入门的使用者,基本上,不太需要编译核心
  • 编译核心的一般目的:新功能的需求、原本的核心太过臃肿、与硬件搭配的稳定性、其他需求(如嵌入式系统)
  • 编译核心前,最好先了解到您主机的硬件,以及主机的用途,才能选择好核心功能;
  • 编译前若想要保持核心源代码的干净,可使用 make mrproper 来清除暂存盘与配置文件;
  • 挑选核心功能与模块可用 make 配合:menuconfig, oldconfig, xconfig, gconfig 等等
  • 核心功能挑选完毕后,一般常见的编译过程为:make bzImage, make modules
  • 模块编译成功后的安装方式为: make modules_install
  • 核心的安装过程中,需要移动 bzImage 文件、创建 initramfs 文件、重建 grub.cfg 等动作;
  • 我们可以自行由硬件开发商之官网下载驱动程序来自行编译核心模块!

发表评论