本人TaoistBoy,小白一枚。最近在进行 Linux 内核编译时遇到了许多问题,拜读了前辈相关博客的文章,决定记录一下内核编译的步骤以及一些需要格外注意的地方,希望对有需要的人提供一些参考,文中不够准确的地方请大家多多批评。

VirtualBox安装

   VirtualBox是免费的虚拟机平台,可以搭载操作系统。可以直接到VirtualBox官网下载你需要的版本。安装过程非常简单,中间只需要选定一个安装目录即可,其他直接next,安装完成

Linux安装

   我选择的是Fedora 32发行版(Fedora-Workstation-Live-x86_64-32-1.6),可以到 linix kernel 官网 下载所需iso镜像

  1. 打开VirtualBox,新建虚拟机,名称自定义,类型选择 Linux,版本选择 Fedora(64bit)(按自己需要选择)
  2. 配置内存大小,默认就好,基本够用
  3. 创建虚拟硬盘,选择现在创建虚拟硬盘,点击创建
  4. 选择VDI,点击下一步
  5. 选择动态分配,点击下一步
  6. 设置文件位置和大小
    大小不要默认8GB,在后面编译内核时根本不够用,我就是初始选太小导致在后面不得不进行磁盘扩展操作。建议最小设50GB,并且手动更改 Fedora-root 挂载点下的磁盘空间为40GB以上
    位置要设置在非系统盘,建议新建自己的文件夹,把文件都放里面,完成后点击创建
  7. 添加虚拟光盘
    假设你新建的虚拟机叫fedora,右键点击fedora->设置->存储->没有盘片,点击最右边的光盘标志,选择一个虚拟光盘,即你的操作系统镜像(.iso)文件(我的是Fedora-Workstation-Live-x86_64-32-1.6),完成后右键fedora->启动
  8. 打开 Fedora
    在setting中设置语言为‘简体中文’,设置 root 用户和密码,可以添加用户及密码
    之后设置安装到硬盘,一路向下,完成 Linux 安装
  9. 分离镜像
    最后一定要分离镜像(.iso)文件,不然你每次打开 Fedora 都提示你进行安装(即使你已经安装过了……)
    分离可以右键点击 Fedora->设置->存储->没有盘片,点击最右边的光盘标志,删除你的操作系统镜像(.iso)文件即可

编译内核

   编译内核很耗时间,新手可能要编译好几次才能得到满意的内核,提前注意一些坑可以提高效率。由于我选择的是 Linux Fedora 32 发行版,下面的一些指令针对于 Fedora 版本,对于 Linux 其他版本如 Ubuntu ,指令要做调整

一、安装一些必要的软件包

   启动虚拟机Fedora,打开终端,输入su root 与自己设置的密码,取得root权限:

[TaoistBoy@localhost ~]$ su root
密码:

   在实验前需要安装一些必要的软件包,包括gcc make 和 执行make menuconfig 所需的工具:

$ yum install gcc
$ yum install gcc-c++
$ yum -y install ncurses
$ yum install ncurses-devel		//安装图形依赖包

   至此,你可以进行下一步了。但是我在后面遇到许多errors,都是因为库文件缺失,下面的是我解决各种错误时增加的库,可以安装一下规避后续风险:

$ yum install *curses* -y
$ yum install elfutils-libelf-devel
$ yum install openssl-devel		//error:scripts/sign.file.c:25:10:致命错误:openssl/opensslv.h
$ yum install dwarves		//error:BTF:.tmp_vmlinux.btf:pahole(pahole) is not available

二、下载内核源代码

   所有版本的内核源代码都能在官方网站里下载得到,我选择的内核版本是 linux-5.7.2.tar.xz
   进入虚拟机cd /usr/src目录,进行内核下载与解压(也可以用Firefox下载)

//进入相应目录
$ cd /usr/src

//下载linux-5.7.2.tar.xz
$ wget https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.7.2.tar.xz

//解压linux-5.7.2.tar.xz
$ tar xvf linux-5.7.2.tar.xz -C /usr/src

//转到内核解压目录下
$ cd /usr/src/linux-5.7.2

三、配置

   1. 如果以前编译过,那么用make mrproper删除以前垃圾文件

   2. 用make menuconfig启动配置的图形界面。因为配置选项很多,短时间根本搞不懂哪些选项是必须的,哪些是可以不要的,所以,最佳的办法是在一个已经存在的配置文件上面修改

   3. 很显然,Fedora 就有现成的一个。把 /boot目录里面 config-4.6.3-fc32.x86_64(不一定是这个名称,要进入 /boot 目录用 ls -l 命令找自己的版本名称)复制到/usr/src/linux-5.7.2里面并命名为.config。当执行make menuconfig时,首先寻找.config,如果找到就读取。否则进入arch目录里面寻找相应体系结构默认的配置文件

$ make mrproper
$ cp /boot/config-4.6.3-fc32.x86_64 /usr/src/linux-5.7.2/.config

//从 /boot 目录回到 linux-5.7.2 解压目录
$ cd /usr/src/linux-5.7.2

$ make menuconfig

   4. 配置成功出现下面界面,直接 [ESC] 退出即可:
在这里插入图片描述

四、执行编译

   这是个漫长的过程,我的 4 核 CPU 跑了3个多小时(……),中途缺少库文件就会导致失败,我编译了两次才完成
   这一步执行 make all , 就相当于:make dep(建立相依的属性关系),make clean(将旧的资料去除掉),make bzImage(开始编译核心),make modules(开始编译模块)

$ make all

   可以用 df -h 命令查看挂载点空间,及时扩展 live-root 空间,防止空间不足导致编译失败。我在编译成功后用了28G空间:

$ df -h

挂载点空间

五、安装模块与内核

   披荆斩棘,终于到了最后一步。分别安装模块与内核,最后重启 Fedora

$ make modules_install 		//安装模块
$ make install  			//安装内核
$ reboot  				    //重启

   重启 Fedora后,可以使用 uname -srm 命令查看当前内核版本

$ uname -srm

   输出 Linux 5.7.2 x86_32 , 恭喜你,安装成功!

Logo

更多推荐