美文网首页
centos7 编译内核的方法

centos7 编译内核的方法

作者: jony456123 | 来源:发表于2017-09-07 16:04 被阅读237次

    通过源码的方式替换

    1.  获取内核源码

    获取内核源码的路径:https://www.kernel.org/pub/linux/kernel/

    2.  解压内核源码

    解压内核源码到路径/usr/src/kernels/

    3.  Make mrproper

    Make mrproper的作用是在每次配置并重新编译内核前执行该命令。将会清理源代码树,包括过去曾经配置的内核配置文件“.config”都将被清除。以免影响新的内核编译。

    4.  Make menuconfig

    make menuconfig命令用于生成的内核配置文件

    内核配置的方式分为如下几种,选择其中一种即可:

    #make menuconfig //基于ncurse库编制的图形工具界面

    #make config //基于文本命令行工具,不推荐使用

    #make xconfig //基于X11图形工具界面

    #make gconfig //基于gtk+的图形工具界面

    采用make menuconfig 时出现图形界面的含义如下:

    对每一个配置选项,用户有三种选择,它们分别代表的含义如下:

    <*>或[*]——将该功能编译进内核

    [ ]——不将该功能编译进内核

    [M]——将该功能编译成可以在需要时动态插入到内核中的代码

    最后要执行save(版本不同可能执行方式不同,3.10.40会有save选项,而2.6.33则是有一个选项:save an alternate configuration file),这样就生成了配置好的.config。

    5.  Make

    开始编译内核源码,通过make将生成内核模块和vmlinuz,initrd.img,Symtem.map文件

    注:#make相当于分别执行#makebzImage 和#make modules。根据需要也可以分开执行

    6.  Make modules_install

    安装模块:编译成功后,系统会在/lib/modules目录下生成一个****(版本号)子目录,里面存放着新内核的所有可加载模块(即将编译好的modules拷贝到/lib/modules下)

    7.  Make install

    安装内核,该命令会复制.config,vmlinuz,initrd.img,System.map文件到/boot目录、更新grub。

    8.  修改grub.conf

    通过更改default的值,来执行内核的默认启动版本。如图,如果default=0,则系统默认启动的内核版本为2.6.31.1

    9.  Reboot

    重启设备之后,通过命令uname –a 、 uname -r查看系统内核版本。

    通过rpm的方式替换

    1.  获取内核rpm

    //http://vault.centos.org/6.5/centosplus/Source/SPackages/

    源代码的官网:http://vault.centos.org/

    进入官网后,再一次进入6.7/,进入os/,进入Source/,进入SPackages/,找到kernel-2.6.32-573.el6.src.rpm下载就行了

    我使用的是kernel-2.6.32-431.el6.centos.plus.src.rpm

    2.  解压内核rpm

    rpm -i kernel-2.6.32-431.el6.centos.plus.src.rpm

    该步骤结束之后会生成/root/rpmbuild/SPECS/kernel.spec

    可能会遇到如下问题:

    rpm -ivhkernel-2.6.32-431.el6.centos.plus.src.rpm

    1:kernel                 warning: user mockbuild doesnot exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    ###########################################[100%]

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning:group mockbuild does not exist - using root

    warning:user mockbuild does not exist - using root

    warning: group mockbuild does not exist - using root

    解决方式:添加用户和组后,再重新执行上述步骤

    groupaddmockbuild

    useradd mockbuild-g mockbuild

    3.  生成源码

    执行命令:rpmbuild -bb kernel.spec

    ① 安装依赖包

    可能会遇到如下问题:

    [root@ServerSPECS]# rpmbuild -bb kernel.spec

    error:Failed build dependencies:

    redhat-rpm-config is needed bykernel-2.6.32-431.el6.centos.plus.x86_64

    patchutils is needed bykernel-2.6.32-431.el6.centos.plus.x86_64

    xmlto is needed bykernel-2.6.32-431.el6.centos.plus.x86_64

    asciidoc is needed bykernel-2.6.32-431.el6.centos.plus.x86_64

    binutils-devel is needed bykernel-2.6.32-431.el6.centos.plus.x86_64

    newt-devel is needed bykernel-2.6.32-431.el6.centos.plus.x86_64

    audit-libs-devel is needed bykernel-2.6.32-431.el6.centos.plus.x86_64

    perl(ExtUtils::Embed) is needed bykernel-2.6.32-431.el6.centos.plus.x86_64

    bison is needed bykernel-2.6.32-431.el6.centos.plus.x86_64

    flex is needed bykernel-2.6.32-431.el6.centos.plus.x86_64

    hmaccalc is needed bykernel-2.6.32-431.el6.centos.plus.x86_64

    解决方式:

    说明依赖的包没有安装,需要将下边的包安装上。

    bison-2.4.1-5.el6.x86_64.rpm        perl-ExtUtils-Embed-1.28-141.el6_7.1.x86_64.rpm

    flex-2.5.35-9.el6.x86_64.rpm        redhat-rpm-config-9.0.3-51.el6.centos.noarch.rpm

    asciidoc-8.4.5-4.1.el6.noarch.rpm

    hmaccalc-0.9.12-2.el6.x86_64.rpm

    slang-devel-2.2.1-1.el6.x86_64.rpm

    audit-libs-devel-2.4.5-3.el6.x86_64.rpm         newt-devel-0.52.11-3.el6.x86_64.rpm

    xmlto-0.0.23-3.el6.x86_64.rpm

    binutils-devel-2.20.51.0.2-5.44.el6.x86_64.rpm

    patchutils-0.3.1-3.1.el6.x86_64.rpm

    ② 其他依赖包

    安装这些包的过程中,可能会依赖其他包,如下:

    audit-libs-2.4.5-3.el6.x86_64.rpm

    lynx-2.8.6-27.el6.x86_64.rpm

    perl-libs-5.10.1-141.el6_7.1.x86_64.rpm

    centos-indexhtml-6-2.el6.centos.noarch.rpm

    perl-5.10.1-141.el6_7.1.x86_64.rpm

    安装过程中可能会遇到如下问题:

    [root@Server 1]# rpm -ivhperl-5.10.1-141.el6_7.1.x86_64.rpm

    error:Failed dependencies:

    perl-libs = 4:5.10.1-141.el6_7.1 is needed byperl-4:5.10.1-141.el6_7.1.x86_64

    [root@Server1]# rpm -ivh perl-libs-5.10.1-141.el6_7.1.x86_64.rpm

    error:Failed dependencies:

    perl = 4:5.10.1-141.el6_7.1 is needed byperl-libs-4:5.10.1-141.el6_7.1.x86_64

    解决方式:

    这是因为安装perl时二者相互依赖,且与之前的包有冲突。可以通过如下方式:

    rpm -ivh perl-libs-5.10.1-141.el6_7.1.x86_64.rpmperl-5.10.1-141.el6_7.1.x86_64.rpm --force

    ③安装rng命令

    安装完以上依赖包后,重新执行rpmbuild -bb kernel.spec命令时,可能会出现如下问题:

    卡住gpg:keyring `./pubring.gpg' created不动了

    解决方式:

    执行一下命令:rngd  -r  /dev/urandom

    但是rng这个工具在我们的icfs系统中已经被裁减(原版的ceotos上存在该命令,已验证),因此需要手动安装上。步骤如下:

    rpm -ivhrng-tools-5-2.el6_7.x86_64.rpm

    到此,结束以上所有步骤之后,会在以下目录中生成内核源码:

    /root/rpmbuild/BUILD/kernel-2.6.32-431.el6/linux-2.6.32-431.el6.centos.plus.x86_64

    4.  拷贝.config

    进入生成的源码目录:

    cd  /root/rpmbuild/BUILD/kernel-2.6.32-431.el6/linux-2.6.32-431.el6.centos.plus.x86_64

    cp  /boot/config-2.6.32-431.el6.x86_64  .config

    或者cp/usr/src/kernels/2.6.32-431.el6.x86_64/.config     .config

    5.  编译源码

    Make –j24

    6.    Make modules_install

    7.  Make install

    8.  修改grub.conf

    9.  reboot

    说明:在方式二中,在源码init/main.c中添加了打印信息,在内核启动后能够在/var/log/messages中找到。

    风险事项:

    1.      安装包时有冲突项。

    2.

    相关文章

      网友评论

          本文标题:centos7 编译内核的方法

          本文链接:https://www.haomeiwen.com/subject/kamijxtx.html