【linux系列】内核编译最新教程+常见问题总结

编译环境

  • 虚拟机: VMware workstation pro 16
  • 虚拟机操作系统: ubuntu-20.04.3-desktop-amd64
  • 原系统内核版本:5.11.0-46-generic
  • 内核源码版本:5.11.1

环境准备

编译准备

  • 建议将内核源码移动到 /usr/src/
1
sudo cp linux-5.11.1.tar.xz /usr/src/
  • 切换目录到 /usr/src/
1
cd /usr/src/
  • 将内核源码解压,这里使用的是 linux-5.11.1.tar.xz.xz为双重压缩,因此先使用 xz命令解压
1
sudo xz -d linux-5.11.1.tar.xz
  • 然后使用 tar命令 解压
1
sudo tar -xf linux-5.11.1.tar
  • 切换到 linux-5.11.1 目录下
1
cd linux-5.11.1

修改配置

linux 提供的三种配置命令

1
2
3
4
5
6
7
8
9
10
11
12
13

// 不建议使用
sudo make config


// 建议使用(图形界面,键盘操作)
sudo make menuconfig



// 强烈建议使用(图形界面,鼠标操作)
sudo make gconfig

使用 gconfig 配置

  • 安装 make
1
sudo apt install make
  • 安装 gcc
1
sudo apt install gcc
  • 安装 gtk+-2.0gmodule-2.0libglade-2.0
1
sudo apt install libgtk2.0-dev libglib2.0-dev libglade2-dev
  • 安装 flex
1
sudo apt install flex
  • 安装 bison
1
sudo apt install bison
  • 启动 gconfig
1
sudo make gconfig
gconfig界面
  • 如果需要修改配置可以在 gconfig中图形化进行设置,在这里需要注意,配置选项有时分为三类,分别对应 NMY
    • N 未选中,即编译时不加入,gconfig中为不选中
    • M 编译成模块,gconfig中选中时为 - 表示
    • Y 编译入内核,gconfig中选中时为 表示
  • 配置好后点击 Save 即可保存配置,生成 .config 文件
  • 通常源码所带的默认配置所需编译的内核和模块很多,编译一次时间大约在 2-3小时左右(与虚拟机的配置和电脑的性能有关)
  • 因此在开发中遇到需要编译内核的情况,往往对内核进行裁剪,这里我准备了一份裁剪过的内核配置(裁剪的较多,很多模块缺失,谨慎使用)
  • 使用方式

编译内核

  • 安装 ssl
1
sudo apt install libssl-dev
  • 安装 elf
1
sudo apt install libelf-dev
  • 执行编译命令
1
sudo make -j4
  • 编译时间大概为半小时,开把游戏,倒杯茶,走几圈。
  • 编译成功如下图

安装内核

  • 安装模块
1
sudo make modules_install
  • 安装成功如下图

  • 安装内核
1
sudo make install
  • 安装成功如下图

载入新内核

  • 重启 Ubuntu

    1
    reboot

  • 系统会默认将新安装的内核作为 grub 的第一个启动项

  • 如果想要自行切换不同内核,在出现载入进度条时,点击 shift

  • 进入 grub 后选择 ubuntu 高级选项

  • 回车进入后,上下选择自己想要进入的内核,回车进入

检查内核

  • 检查内核版本

    1
    uname -r

  • 结果如下

常见问题

1
sudo: make:找不到命令

解决办法: 安装 make


1
2
3
/bin/sh: 1: gcc: not found
make[1]: *** [scripts/Makefile.host:95scripts/basic/fixdep] 错误 127
make: *** [Makefile:534scripts_basic] 错误 2

解决办法: 安装 gcc


1
2
3
4
5
6
7
8
*
* Unable to find the GTK+ installation. Please make sure that
* the GTK+ 2.0 development package is correctly installed.
* You need gtk+-2.0 gmodule-2.0 libglade-2.0
*
make[1]: *** [scripts/kconfig/Makefile:204scripts/kconfig/gconf-cfg] 错误 1
make: *** [Makefile:601gconfig] 错误 2

解决办法: 安装 gtk+-2.0gmodule-2.0libglade-2.0


1
2
3
/bin/sh: 1: flex: not found
make[1]: *** [scripts/Makefile.host:9scripts/kconfig/lexer.lex.c] 错误 127
make: *** [Makefile:601gconfig] 错误 2

解决办法: 安装 flex


1
2
3
/bin/sh: 1: bison: not found
make[1]: *** [scripts/Makefile.host:17scripts/kconfig/parser.tab.h] 错误 127
make: *** [Makefile:601gconfig] 错误 2

解决办法: 安装 bison


1
2
3
4
5
6
7
scripts/extract-cert.c:21:10: fatal error: openssl/bio.h: 没有那个文件或目录
21 | #include <openssl/bio.h>
| ^~~~~~~~~~~~~~~
compilation terminated.
make[1]: *** [scripts/Makefile.host:95scripts/extract-cert] 错误 1
make[1]: *** 正在等待未完成的任务....
make: *** [Makefile:1185scripts] 错误 2

解决办法: 安装 ssl


1
2
error: Cannot generate ORC metadata for CONFIG_UNWINDER_ORC=y, please install libelf-dev, libelf-devel or elfutils-libelf-devel
make: *** [Makefile:1222prepare-objtool] 错误 1

解决办法: 安装 elf


1
2
3
进入initramfs
alert:uuid=xxxxxx does not exist,
ls /dev下没有sda

原因分析: 内核裁剪过度,将 SCSI 模块裁剪,MPT模块裁剪 解决办法: 重新修改内核配置,将 Device Drivers下, - Fusion MPT device suppot中所有模块加入 - SCSI device support下与 SCSI 有关的模块加入 - SCSI device supportSCSI low-level driversLSI MPT Fusion SAS 3.0 & SAS 2.0 Device Driver加入


【linux系列】内核编译最新教程+常见问题总结
https://hwh-2019.github.io/2022/12/03/【linux系列】内核编译最新教程-常见问题总结/
作者
HWH
发布于
2022年12月3日
许可协议