开发者
资源
文档评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

内核编译与安装

本文档中,不同操作系统下的操作若有不同,会进行说明区分,若未说明,则该操作在两个操作系统下一致。

获取内核源码

  1. 创建目录并进入该目录。
    1
    2
    mkdir -p /home/kernel-bcache
    cd /home/kernel-bcache
    
  2. 下载内核源码包至“/home/kernel-bcache”目录。
  3. 解压源码包。
    • CentOS 7.6
      1
      2
      rpm2cpio kernel-alt-4.14.0-115.10.1.el7a.src.rpm | cpio -divm
      tar -xvf linux-4.14.0-115.10.1.el7a.tar.xz
      
    • openEuler 20.03
      1
      2
      rpm2cpio kernel-4.19.90-2012.4.0.0053.oe1.src.rpm | cpio -divm
      tar -zxvf kernel.tar.gz
      
  4. 配置镜像源。(本步骤仅openEuler 20.03操作系统需要执行,CentOS 7.6操作系统用户请跳过。)
    1. 通过SFTP工具将“openEuler-***-everything-aarch64-dvd.iso”上传到服务器上“/root”目录下。
    2. 创建一个本地文件夹用于挂载本地镜像。
      1
      mkdir -p /iso
      
    3. 将iso文件挂载到本地文件夹。
      1
      mount /root/openEuler-***-everything-aarch64-dvd.iso /iso
      
    4. 创建镜像yum源。
      1
      vi /etc/yum.repos.d/openEuler.repo
      
      在文件中加入以下内容:
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      [Base]
      name=Base
      baseurl=file:///iso
      enabled=1
      gpgcheck=0
      priority=1
      
      [openEuler-source]
      name=openEuler-source
      baseurl=http://repo.openeuler.org/openEuler-20.03-LTS-SP1/source/
      enabled=1
      gpgcheck=1
      gpgkey=http://repo.openeuler.org/openEuler-20.03-LTS-SP1/source/RPM-GPG-KEY-openEuler
      
      [openEuler-os]
      name=openEuler-os
      baseurl=http://repo.openeuler.org/openEuler-20.03-LTS-SP1/OS/aarch64/
      enabled=0
      gpgcheck=1
      gpgkey=http://repo.openeuler.org/openEuler-20.03-LTS-SP1/OS/aarch64/RPM-GPG-KEY-openEuler
      
      [openEuler-everything]
      name=openEuler-everything
      baseurl=http://repo.openeuler.org/openEuler-20.03-LTS-SP1/everything/aarch64/
      enabled=0
      gpgcheck=1
      gpgkey=http://repo.openeuler.org/openEuler-20.03-LTS-SP1/everything/aarch64/RPM-GPG-KEY-openEuler
      
      [openEuler-EPOL]
      name=openEuler-epol
      baseurl=http://repo.openeuler.org/openEuler-20.03-LTS-SP1/EPOL/aarch64/
      enabled=1
      gpgcheck=0
      
      [openEuler-update]
      name=openEuler-update
      baseurl=http://repo.openeuler.org/openEuler-20.03-LTS-SP1/update/aarch64/
      enabled=1
      gpgcheck=0
      
  5. 安装依赖。
    • CentOS 7.6
      1
      yum -y install rpm-build m4 gcc xmlto asciidoc openssl-devel hmaccalc python-devel newt-devel perl-ExtUtils-Embed elfutils-devel zlib-devel binutils-devel bison audit-libs-devel java-devel numactl-devel pciutils-devel ncurses-devel createrepo genisoimage net-tools git bc
      
    • openEuler 20.03
      1
      dnf -y install ncurses-devel bison m4 flex rpm-build rpmdevtools asciidoc audit-libs-devel binutils-devel elfutils-devel elfutils-libelf-devel gtk2-devel java-1.8.0-openjdk-devel xz-devel libbabeltrace-devel libunwind-devel newt-devel numactl-devel openssl-devel pciutils-devel perl-generators python3-devel python3-docutils xmlto zlib-devel createrepo genisoimage
      

替换Bcache模块

  1. 获取Bcache源码放到“/home”。
  2. 解压源码。
    • CentOS 7.6
      1
      2
      cd /home
      unzip bcache-swc-v0.2.0.zip
      
    • openEuler 20.03
      unzip openeuler-kernel-openEuler-1.0-LTS.zip
  3. 替换Bcache。
    • CentOS 7.6
      1
      cp -rf /home/bcache-swc-v0.2.0/drivers/md/bcache /home/kernel-bcache/linux-4.14.0-115.10.1.el7a/drivers/md/
      
    • openEuler 20.03
      1
      cp -rf /home/kernel/drivers/md/bcache /home/kernel-bcache/kernel/drivers/md/
      

修改内核配置

  1. 获取内核配置文件。
    • CentOS 7.6
      1
      2
      cd /home/kernel-bcache/linux-4.14.0-115.10.1.el7a
      cp ../kernel-alt-4.14.0-aarch64.config .config
      
    • openEuler 20.03
      1
      2
      cd /home/kernel-bcache/kernel
      cp arch/arm64/configs/openeuler_defconfig .config
      
  2. 配置Bcache模块。
    1
    make menuconfig
    
    1. 选择“Device Drivers ”。

    2. 按“Enter”键进入下一级菜单,选择“Multiple device driver support (RAID and LVM )”。

    3. 按“Enter”键进入下一级菜单,选中“Block device as cache”,键盘输入“M”选中该配置。

    4. 按两次“exit”返回至第一层。

  3. 修改内核PAGESIZE大小为4K。
    1. 选择“Kernel Features”。

    2. 按“Enter”键进入下一级菜单,选择“Page size(64KB)”。

    3. 按“Enter”键进入选择,按“Space”键选择4KB。

    4. 按两次“exit”保存并退出。

  4. 修改配置文件。(本步骤仅CentOS 7.6操作系统执行,openEuler 20.03操作系统用户请跳过。)
    1
    vi .config
    

    手动在第一行添加“#aarm64”。

  5. 确认配置文件。
    1. 确认Bcache模块打开。

    2. 确认PAGESIZE为4k。

  6. 覆盖默认配置文件。
    • CentOS 7.6
      1
      cp .config ../kernel-alt-4.14.0-aarch64.config
      

      输入y确认。

    • openEuler 20.03
      1
      cp .config arch/arm64/configs/openeuler_defconfig
      

      输入y确认。

生成内核RPM包

  1. 内核源码重新打包。
    • CentOS 7.6
      1
      2
      3
      4
      cd /home/kernel-bcache
      tar -cvf linux-4.14.0-115.10.1.el7a.tar linux-4.14.0-115.10.1.el7a
      rm -f linux-4.14.0-115.10.1.el7a.tar.xz
      xz -z linux-4.14.0-115.10.1.el7a.tar
      
    • openEuler 20.03
      1
      2
      cd /home/kernel-bcache
      tar -zcvf kernel.tar.gz kernel
      
  2. 生成“rpmbuild”目录。
    1
    2
    3
    mkdir -p /home/rpmbuild
    cd /home/rpmbuild
    mkdir -p BUILD  RPMS  SOURCES  SPECS  SRPMS
    
  3. 修改默认“rpmbuild”路径。
    1
    vi /root/.rpmmacros
    

    增加如下内容:

    1
    %_topdir /home/rpmbuild
    
  4. 拷贝文件至“rpmbuild”目录。
    • CentOS 7.6
      1
      2
      3
      cp -r /home/kernel-bcache/* SOURCES/
      cp /home/kernel-bcache/kernel-alt.spec SPECS/
      rm -rf SOURCES/linux-4.14.0-115.10.1.el7a
      
    • openEuler 20.03
      1
      2
      3
      cp -r /home/kernel-bcache/* SOURCES/
      cp /home/kernel-bcache/kernel.spec SPECS/
      rm -rf SOURCES/kernel
      
  5. 更新内核补丁。(本步骤仅CentOS 7.6操作系统执行,openEuler 20.03操作系统用户请跳过。)
    1
    rpmbuild -bp /home/rpmbuild/SPECS/kernel-alt.spec
    
  6. 编译生成内核RPM包。
    • CentOS 7.6
      1
      rpmbuild -bb /home/rpmbuild/SPECS/kernel-alt.spec --with baseonly --without debug --without debuginfo
      
      Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/rpmbuild/BUILDROOT/kernel-alt-4.14.0-115.10.1.el7a.aarch64
      Wrote: /home/rpmbuild/RPMS/aarch64/kernel-4.14.0-115.10.1.el7a.aarch64.rpm
      Wrote: /home/rpmbuild/RPMS/aarch64/kernel-headers-4.14.0-115.10.1.el7a.aarch64.rpm
      Wrote: /home/rpmbuild/RPMS/aarch64/perf-4.14.0-115.10.1.el7a.aarch64.rpm
      Wrote: /home/rpmbuild/RPMS/aarch64/python-perf-4.14.0-115.10.1.el7a.aarch64.rpm
      Wrote: /home/rpmbuild/RPMS/aarch64/kernel-tools-4.14.0-115.10.1.el7a.aarch64.rpm
      Wrote: /home/rpmbuild/RPMS/aarch64/kernel-tools-libs-4.14.0-115.10.1.el7a.aarch64.rpm
      Wrote: /home/rpmbuild/RPMS/aarch64/kernel-tools-libs-devel-4.14.0-115.10.1.el7a.aarch64.rpm
      Wrote: /home/rpmbuild/RPMS/aarch64/kernel-devel-4.14.0-115.10.1.el7a.aarch64.rpm
      Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.4Lfz8M
      + umask 022
      + cd /home/rpmbuild/BUILD
      + cd kernel-alt-4.14.0-115.10.1.el7a
      + rm -rf /home/rpmbuild/BUILDROOT/kernel-alt-4.14.0-115.10.1.el7a.aarch64
      + exit 0
    • openEuler 20.03
      1
      vi /usr/lib/rpm/macros
      

      修改“%_unpackaged_files_terminate_build 1”为“%_unpackaged_files_terminate_build 0”。

      1
      rpmbuild -bb /home/rpmbuild/SPECS/kernel.spec --with baseonly --without debug --without debuginfo
      
  7. 查看生成的内核RPM包。
    ls /home/rpmbuild/RPMS/aarch64/

安装内核

  1. 将生成内核RPM包中生成的内核RPM包上传至所有需要使用智能写Cache的服务器的“/home/kernel-rpm”目录。
    1
    mkdir -p /home/kernel-rpm
    
  2. 安装内核RPM包。
    • CentOS 7.6
      1
      2
      cd /home/kernel-rpm
      yum -y install kernel-4.14.0-115.10.1.el7a.aarch64.rpm kernel-devel-4.14.0-115.10.1.el7a.aarch64.rpm kernel-headers-4.14.0-115.10.1.el7a.aarch64.rpm
      
    • openEuler 20.03
      1
      2
      cd /home/kernel-rpm
      dnf -y install kernel-4.19.90-2012.4.0.0053.aarch64.rpm kernel-devel-4.19.90-2012.4.0.0053.aarch64.rpm
      
  3. 查看默认内核启动项。
    1
    grub2-editenv list
    

    查看其中的默认内核版本号。

    • 如果默认版本是新安装的内核版本,则跳过4。
    • 如果默认版本不是新安装的内核版本,则执行4。
  4. 修改默认内核启动项。
    • CentOS 7.6
      1
      cat /etc/grub2-efi.cfg  | grep CentOS
      

      其中“CentOS Linux (4.14.0-115.10.1.el7a.aarch64) 7 (AltArch)”为新装内核版本。

      grub2-set-default "CentOS Linux (4.14.0-115.10.1.el7a.aarch64) 7 (AltArch)"
    • openEuler 20.03
      1
      cat /etc/grub2-efi.cfg  | grep openEuler
      

      其中“openEuler (4.19.90-2012.4.0.0053.aarch64) 20.03 (LTS-SP1)”为新安装内核版本。

      grub2-set-default "openEuler (4.19.90-2012.4.0.0053.aarch64) 20.03 (LTS-SP1)"
  5. 重启系统。
    1
    reboot