---
title: 内核编译与安装
description: "本文档中，不同操作系统下的操作若有不同，会进行说明区分，若未说明，则该操作在两个操作系统下一致。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/220RC3/sds/kunpengsdss_swc_27_0006.html
sourcePath: /source/zh/kunpengboostkithistory/220RC3/sds/kunpengsdss_swc_27_0006.html
indexId: ba3db1320816823c41c8b806800226f3e8e582c171cef9358e795c69d04bbe5873
---
# 内核编译与安装

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


#### 获取内核源码

1. 创建目录并进入该目录。
  1 2 mkdir -p /home/kernel-bcache cd /home/kernel-bcache

2. 下载内核源码包至“/home/kernel-bcache”目录。

  - CentOS 7.6
    下载路径：http://vault.centos.org/7.6.1810/updates/Source/SPackages/(http://vault.centos.org/7.6.1810/updates/Source/SPackages/)

  - openEuler 20.03
    下载路径：https://repo.openeuler.org/openEuler-20.03-LTS-SP1/source/Packages/(https://repo.openeuler.org/openEuler-20.03-LTS-SP1/source/Packages/)

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操作系统用户请跳过。）

  a. 通过SFTP工具将“openEuler-***-everything-aarch64-dvd.iso”上传到服务器上“/root”目录下。
  b. 创建一个本地文件夹用于挂载本地镜像。
    1 mkdir -p /iso

  c. 将iso文件挂载到本地文件夹。
    1 mount /root/openEuler-***-everything-aarch64-dvd.iso /iso

  d. 创建镜像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”。
  下载链接：https://github.com/kunpengcompute/bcache/releases/tag/swc-v0.2.0(https://github.com/kunpengcompute/bcache/releases/tag/swc-v0.2.0)

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模块。
```
make menuconfig
```


  a. 选择“Device Drivers ”。
  b. 按“Enter”键进入下一级菜单，选择“Multiple device driver support (RAID and LVM )”。
  c. 按“Enter”键进入下一级菜单，选中“Block device as cache”，键盘输入“M”选中该配置。
  d. 按两次“exit”返回至第一层。
3. 修改内核PAGESIZE大小为4K。

  a. 选择“Kernel Features”。
  b. 按“Enter”键进入下一级菜单，选择“Page size（64KB）”。
  c. 按“Enter”键进入选择，按“Space”键选择4KB。
  d. 按两次“exit”保存并退出。
4. 修改配置文件。(本步骤仅CentOS 7.6操作系统执行，openEuler 20.03操作系统用户请跳过。）
  1 vi .config

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

5. 确认配置文件。

  a. 确认Bcache模块打开。
  b. 确认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. 查看默认内核启动项。
```
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
