Ubuntu 编译安装内核

本文是一个实操笔记,记录本地如何编译一个内核版本并安装到系统中使用。我使用的环境如下:

1
2
3
4
5
6
7
8
9
10
11
$ cat /etc/issue
Ubuntu 20.04.5 LTS

$ cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
8 Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz

$ grep 'processor' /proc/cpuinfo | sort -u | wc -l
8

$ cat /proc/cpuinfo | grep "cpu cores" | uniq
cpu cores : 4

以上表明我使用的是 Ubuntu 20.04.5,机器是 Intel 4 核 8 线程 CPU,每个频率都是 2.60GHz。我编译的版本是 Linux kernel 主线的版本,相当于从 github 上直接拉下来的代码,我下的代码最新的提交是 c1649ec55708ae42091a2f1bca1ab49ecd722d55。以下方法不保证比较老的内核也可以编译通过。

环境

因为我之前已经编译安装过内核,所以一些工具依赖我很早之前就搞好了,以下是我在网上找的需要的工具,需要提前安装下:

1
2
3
$ sudo apt update

$ sudo apt install libncurses5-dev openssl libssl-dev build-essential pkg-config libc6-dev bison flex libelf-dev zlibc minizip libidn11-dev libidn11

下载内核代码

可以到 https://www.kernel.org/ 这个网站下载想要的版本,如果这个网站没有你想要的版本,可以到 https://mirrors.edge.kernel.org/pub/linux/kernel/ 找。当然你也可以直接从 github 仓 https://github.com/torvalds/linux 拉取代码,如果 github 拉取比较慢,可以从 gitee 镜像 https://gitee.com/mirrors/linux_old1 拉取,我的代码是从 gitee 镜像拉取的。

编译

为了不出现什么奇怪的问题,我是直接使用 /boot 下面的 config 文件编译的,为了不污染内核代码,我创建了一个 out 目录来做编译工作,如:

1
2
3
$ cd linux_old1
$ mkdir out
$ cp /boot/config-5.15.0-57-generic out/.config

为了编译成功,需要编辑 out/.config,修改 CONFIG_SYSTEM_TRUSTED_KEYS 这一项为 CONFIG_SYSTEM_TRUSTED_KEYS=""

接下来告诉内核使用 out/.config 来配置:

make O=out menuconfig,然后选择 保存退出:

menuconfig.png

接下来就开始真正的编译了,为了查看编译消耗时间,我加了个 time 命令,如果不想看编译耗时,time 就不用加:

1
2
3
$ time make O=out -j8
...
make O=out -j8 26370.08s user 2871.80s system 597% cpu 1:21:34.95 total

total 字段,我编译花了将近 1 个半小时,我这是 2016 年买的电脑。

因为我是 x86 平台,所以默认编出来的是 out/arch/x86/boot/bzImage。vmlinux 文件在 out 下。

安装

首先安装内核模块:

1
2
3
4
5
$ sudo time make O=out modules_install

...
146.80user 41.54system 6:42.64elapsed 46%CPU (0avgtext+0avgdata 94512maxresident)k
1904168inputs+5799840outputs (17major+4103485minor)pagefaults 0swaps

安装内核:

1
2
3
4
5
$ sudo time make O=out install

...
41.63user 33.93system 2:42.55elapsed 46%CPU (0avgtext+0avgdata 95268maxresident)k
586720inputs+1444200outputs (125major+2277644minor)pagefaults 0swaps

更新 grub:

1
$ sudo update-grub

重启选择内核进入。