引言
一直想了解和操作一波Linux内核构建和安装等相关知识,奈何在网上没有找到相应的好的讲解文档。因此自己去搜索了相应的书籍。强烈推荐这本书
这本书详细讲解了内核的构建和安装,不过讲解的是5.4版本的内核。本文基于该书,总结一下 linux-5.15内核的构建和安装过程,以需要的时候能复习。
准备环境
本文所利用的虚拟机为 virtualbox虚拟机,其下载地址为Download VirtualBox
unbutun 20.0.4 TLS :提供的下载bt为
ubuntu-20.04
virtualbox安装unbutun可参考:Oracle VM virtualbox安装Linux,并访问外网,和宿主机互通
源码下载
在完成上一节后,需要安装wget
sudo apt install wget
下载linux内核源码
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.1.tar.xz
解压缩内核源码到本地目录 详细可参考 如何解压缩 tar.xz 文件
tar -xvf linux-5.15.1.tar.xz
运行如下命令
sudo apt update
sudo apt install gcc make perl
sudo apt update
sudo apt install git fakeroot build-essential tar ncurses-dev tar xz-utils
sudo apt install libssl-dev bc stress python3-distutils libelf-dev linux-headers-$(uname -r)
sudo apt install bison flex libncurses5-dev util-linux net-tools linux-tools-$(uname -r)
sudo apt install exuberant-ctags cscope sysfsutils gnome-system-monitor curl
sudo apt install perf-tools-unstable gnuplot rt-tests indent tree pstree smem libnuma-dev
sudo apt install numactl hwloc bpfcc-tools sparse flawfinder cppcheck tuna hexdump
sudo apt install openjdk-14-jre trace-cmd virt-what
构建与安装
本次构建以及安装过程,需要给予你完成上述环境准备的基础之上进行。本文中的构建过程具体如下
1. 切换到相应的源码目录下,运行如下命令
lsmod > /tmp/mod.now
make LSMOD=/tmp/mod.now localmodconfig
上述命令会出现如下过程,红色圈中的只需要按 Enter键。
最终会出现如下结果,说明此步运行正确。
同时在你的内核源码根路径下,会发现多了红色圆圈中的两个文件。
2 运行如下命令,编辑相应的内核config文件
make menuconfig
该命令运行后会出现如下UI界面
关于这个UI界面的内容,如果后续有时间会写相应博客总结,目前先知道这是一个UI界面,且里面每个出现的均是相应的主菜单即可。其他的操作可以自己实验。
出现上述UI界面后,可参考如下表格,配置相应的config。该表格来自于Linux Kernel Programming: A comprehensive guide to kernel internals, writing kernel modules, and kernel synchronization
上述表格中具体说明如下
第一列为 配置项的说明
第二列为 配置项在UI界面中的路径
第三列为 配置项在.config文件中的变量名
第四列为 需要做的修改,如果y->n 表示你需要在相应的UI界面中找到相应配置项,并按下 空格键; 如果n->m 表示你需要找到相应配置项 按下m键。 关于n,m, y什么含义暂且不用理会,后续博客会讲解。
举例,通过UI界面来修改上述表格的第一行中的内容,在此我们改变相应的内容,改成-llkdqls01. 具体过程如下,
在主界面上,将光标移到如下高亮的部分
按enter键进入,出现如下界面
根据表格路径找到相应的配置选项,如下所示
按enter键进入后,显示如下方框,键入需要修改的内容,然后按enter键保存
此后,会回到如下界面,选到红色方框中的save,并按enter键保存
至此,表格中的第一项配置设置完毕。剩下的配置只需要按照相应的配置来操作即可。
配置完成后可以通过如下命令,验证是否配置成功,譬如上述配置运行
grep CONFIG_LOCALVERSION .config
显示如下结果,表示配置成功
CONFIG_LOCALVERSION="-llkdqls01"
# CONFIG_LOCALVERSION_AUTO is not set
3 完成相应的配置后,开始构建内核,通过如下命令
make -j4
在构建的过程中,如果出现如下错误
make[1]: *** No rule to make target 'debian/canonical-revoked-certs.pem' , needed by certs/x509_revocation_list'. STOP. make: ***[Makefile:1851:certs] Error 2
可参考该解决方案:I am installing kernel in my ubuntu but getting an error
也即运行如下命令
scripts/config --disable SYSTEM_REVOCATION_KEYS
然后继续make,此后会等待较长时间。
4 安装内核模块(kernel modules)
完成构建后,运行如下命令
sudo make modules_install
如果此刻出现错误,则可参考Why virtualbox fails to install on Ubuntu20.04
解决方案为
sudo apt-get purge "^virtualbox-.*"
sudo apt-get autoremove && sudo apt-get autoclean && sudo apt-get clean
然后重新安装内核模块即可
5 生成initramfs image
在源代码根目录下运行如下命令
sudo make install
上述命令完成后,可以在/boot 目录下找到相应的initrd.img-5.15XXX的文件,表示生成成功。
6 修改GRUB 启动文件
先运行如下命令,对原生grub文件进行备份
sudo cp /etc/default/grub /etc/default/grub.orig
然后运行如下命令
sudo vim /etc/default/grub
将其内容修改为如下
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
# info -f grub -n 'Simple configuration'
#GRUB_DEFAULT=0
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.11.0-38-generic"
#GRUB_TIMEOUT_STYLE=menu
GRUB_HIDDEN_TIMEOUT_QUIET=false
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"
# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true
# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"
# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"
至此,所有准备工作构建完成,然后在你的虚拟机运行如下命令,使grub修改生效
sudo update-grub
安装新版内核
在你的虚拟机中,键入如下命令
sudo reboot
出现如下界面
按enter键,出现如下页面
出现了最新构建的内核,选择,并按enter,此后虚拟机会重启成功。
在虚拟机运行如下命令
uname -r
出现如下结果
5.15.0-rc7llkdqls01
可知,最终我们构建并成功安装了最新内核。
总结
由于自己一直想研究内核,并且相信也有很多想研究内核,但想构建linux内核的同学,苦于网上找不到合适的构建安装教程,因此在我调研学习完后,便总结了该文档,希望能帮助感兴趣的同学构建linux内核。
关于文章中出现的一些术语,后续如果有时间会写相应的博客总结一下。此处就不再赘述了。
最后,祝愿大家都能享受构建,研究内核的乐趣。