实验内容:在系统中下载统一发行版本的版本号较高的内核,编译之后运行自己编译的内核,并使用uname-r命令查看是否运行成功。
实验步骤:
1.查看实验环境和内核版本
图1 实验环境
VMware中虚拟机Ubuntu(24.04)、内存8G、CPU(8核)、磁盘128G(下载Ubuntu虚拟机的时候一定要注意分配足够的磁盘空间,建议100G)。
图2 查看内核版本
初始内核版本是6.11.0。
为了提升下载速度,换源:
我打算换清华源,从清华大学开源软件镜像站得知:从 Ubuntu 24.04 开始,Ubuntu 的软件源配置文件变更为 DEB822 格式,路径为 /etc/apt/sources.list.d/ubuntu.sources
换源思路:将系统自带的对应文件做个备份,然后根据格式的选择做网页中(ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror)对应的内容替换,即可使用选择的软件源镜像。
图3 查看Ubuntu版本
执行了lsb_release -a 命令,获取到系统信息:这是 Ubuntu 24.04.2 LTS 版本 ,代号为noble 。接下来换清华源,步骤如下:
备份源文件:
图4 备份源文件
执行sudo cp /etc/apt/sources.list.d/ubuntu.sources备份当前软件源配置文件。这样就能正确找到源文件并将其备份到用户主目录下,文件名是ubuntu.sources.bak 。
图5 Ubuntu上没有安装vim
图5告诉我们Ubuntu上还没有vim,并且提供了安装不同版本vim的命令。
Vim是从vi发展出来的一个文本编辑器,最初的简称是Vi IMitation,随着功能的不断增加,正式名称改成了Vi IMproved。
下载vim:
图6 更新apt
在终端执行sudo apt update,因为软件包列表可能不是最新的,会导致找不到对应软件包。
图7 安装vim-gtk3
在Ubuntu软件包搜索中,与vim-gtk匹配的软件包是vim-gtk3,在终端执行 sudo apt-get install vim-gtk3 -y。什么是gtk3?因为这是vim安装的图形化界面。
Vim还需要进行配置,这不是本实验的内容,参考博客:基于 Ubuntu 系统的 Vim 全面配置(持续更新)_ubuntu vim-CSDN博客。(已配置vim到自动补全符号)。之后安装了VMware Tools。
前面已完成了备份,接下来要换清华源:
获取清华源配置:
访问清华大学开源软件镜像站(https://mirrors.tuna.tsinghua.edu.cn/ ),找到 Ubuntu 镜像使用帮助,获取适用于 Ubuntu 24.04(代号noble )的清华源配置内容 。
图8 原有内容
在终端执行sudo vim /etc/apt/sources.list.d/ubuntu.sources ,删除原有内容,粘贴清华源配置(在上文给出的链接里面就有清华源配置内容)后按ESC退出插入模式,进入正常模式,输入:wq按回车键保存退出。
执行sudo apt update ,更新软件包索引,之后即可基于清华源进行软件安装、升级等操作 。
进入Linux 内核的官网,下载最新版本,或者其它版本的内核代码。在Linux系统中,只需要在命令行输入如下命令就可以下载Linux内核压缩包了。
2.下载内核
图9 执行“wget 下载链接”
3.解压
下载后在终端输入sudo tar-xvflinux-6.13.1.tar.xz解压缩。
图10 解压完成
之后要将解压的文件移动到/usr/src路径下。
图11 将解压缩文件移动到/usr/src中
也可以直接执行tar xf linux-6.13.1.tar.xz -C /usr/src,这样完成了解压并且放置到/usr/src路径下。
4.安装编译工具和依赖的软件包
接下来安装编译工具以及其它依赖的软件包,执行sudo apt-get install build-essential libncurces-dev bison flex libssl-dev zstd、sudo apt-get install libelf-dev。
(a)
(b)
图12安装编译工具以及依赖的软件包
按下Y接着执行即可。
5.配置内核
在编译内核之前,对内核源代码进行配置。配置的目的主要是确定哪些模块会编译到内核当中。执行sudo make menuconfig进行配置。
图13 进入配置界面
对每个配置选项可通过点击<Select>来选择:
<*>或[*]:将该功能编译进内核;
[]:不将该功能编译进内核;
[M]:将该功能编译成可以在需要时动态
插入内核的模块。
图14 进行配置
如图所示,将Compile also drivers which will not load和Compile the kernel with warnings as errors设置成将该功能编译进内核。进行保存后退出。(也可以不配置这两项内容,保持默认配置,Save--->ok--->Exit--->Exit)。
必做配置:
进入kernel hacking,然后修改warn for stack frames larger than 的数值,将其修改为4096(最好不要大过这个数值)。这一步骤的图在下文图21。
图15 查看.config文件属性
在 Linux 系统中使用ll(等同于 ls -l )命令查看.config文件属性的结果。
接下来要对.config文件进行配置:
执行sudo vim .config打开当前目录下的 .config 文件,配置如下两项内容。
CONFIG_SYSTEM_TRUSTED_KEYS=””
CONFIG_SYSTEM_REVOCATION_KEYS=””
图16 vim 中打开 .config 文件
图17 配置.config文件前
如图17所示,在 vim 命令模式下(进入 vim 后默认是命令模式,如果不是,按 Esc 键进入 ),输入 /CONFIG_SYSTEM_TRUSTED_KEYS ,然后按回车键。vim 会自动定位到首次出现该配置项的位置 。如果位置不对,可按 n 键查找下一个匹配项。找到之后,按i键进入插入模式,删除双引号内的内容(如果有 ),使其变为 CONFIG_SYSTEM_TRUSTED_KEYS="" 。同理,找到 CONFIG_SYSTEM_REVOCATION_KEYS 所在行,按i键进入插入模式,删除双引号内的内容(如果有 ),设置为 CONFIG_SYSTEM_REVOCATION_KEYS="" 。
按 Esc 键回到命令模式,然后输入 :wq 并回车,保存修改并退出 vim 。
6.编译内核
前情提要:因为没安装libelf-dev以及配置内核(warn for stack frames larger than 的数值)发生了报错(上文已经告诉读者进行了操作,如果前面操作过了应该不会出现报错),如果在前面没有安装libelf-dev以及配置内核,为了避免报错,请在编译内核前请执行sudo apt-get install libelf-dev、执行sudo make menuconfig进行配置(具体操作界面见图21)。
利用make命令开始编译内核。使用 -j 选项来多线程处理,可以更有效的利用CPU资源。参数是并发数量,通常可以是CPU的2倍。如图18所示,使用sudo make -j$(nproc)。sudo make -j$(nproc) 是在 Linux 系统中用于并行编译内核或其他软件项目的命令。
图18 编译内核
(a)
(b)
(c)
(d)
(e)
图19 编译内核过程中出现错误
从报错信息 “fatal error: libelf.h: 没有那个文件或目录” 和 “fatal error: gelf.h: 没有那个文件或目录” 可知,是缺少相关开发库文件导致编译失败 。libelf 库用于处理 ELF(可执行与可链接格式)文件,编译内核时部分工具和模块依赖它。
可通过以下命令安装 libelf 开发库来解决:sudo apt-get install libelf-dev。安装完成后,重新执行 sudo make -j$(nproc) 命令继续编译内核 。
图20 再次报错
在编译内核模块驱动时,如果出现如上报错信息,主要是因为内核中设置了堆栈报警大小,其默认为1024bytes。将其修改为4096既可以消除告警信息。
解决方法:
(1)make menuconfig
(2)kernel hacking
(3)修改warn for stack frames larger than 的数值,将其修改为4096(最好不要大过这个数值)
(4)重新编译内核模块则不会出现如上的告警信息。
图21 解决报错
图22 编译成功
7.编译和安装模块
接下来是编译和安装模块。执行make modules_install。
图23 执行make modules_install之后
8.安装内核
注意,该步骤出现了警告,图25下方给出了解决办法,请先阅读完这部分再进行操作。
将编译好的内核文件复制到/boot目录下,并更新GRUB配置:
图24 出现警告
出现的 Warning: os-prober will not be executed... 警告,是因为 GRUB_DISABLE_OS_PROBER 可能被设置,导致 os-prober 工具不被执行,无法检测其他可引导分区并添加到 GRUB 配置中。
图25 解决警告
解决警告的过程:使用文本编辑器vim,打开/etc/default/grub文件,命令为sudo vim /etc/default/grub。在文件中找到GRUB_DISABLE_OS_PROBER这一行。如果该行被注释(行首有#),去掉注释符号#,并确保其值为false。保存并关闭/etc/default/grub文件后,在终端执行sudo update-grub命令。该命令会重新生成 GRUB 配置文件,应用刚才的修改。执行后,os-prober工具将被允许执行,扫描其他可引导分区并添加到 GRUB 配置中,相应警告也会消失。
图26 重新生成grub文件
此时警告提示变为os-prober will be executed...
,说明配置修改生效,os-prober
工具已能正常执行去检测其他可引导分区,这是预期的正确状态。可查看/boot/grub/grub.cfg
文件(使用sudo cat /boot/grub/grub.cfg
查看内容),确认新内核及其他相关启动项是否正确添加。
接下来要对/etc/default/grub文件进行配置。
图27 打开/etc/default/grub文件
图28 进行配置前
图29 进行配置后
图30 更新grub
实验结果
执行reboot重启系统。
图31 重启系统界面
图32 检查新内核
执行uname -r查看内核版本。结果是6.13.1,说明成功。
关于报错的总结
①编译内核时出现 “fatal error: libelf.h: 没有那个文件或目录” 和 “fatal error: gelf.h: 没有那个文件或目录” 的错误,这是因为缺少相关开发库文件。通过执行sudo apt-get install libelf-dev命令安装libelf开发库,解决了该问题,使编译能够继续进行。
②在编译内核模块驱动时,出现 “the frame size of 1152 bytes is larger than 1024 bytes” 的错误。这是由于内核中设置的堆栈报警大小默认为 1024bytes。通过make menuconfig进入内核配置界面,找到 “Kernel hacking” -> “Compile - time checks and compiler options”,将 “Warn for stack frames larger than” 的数值修改为 4096,重新编译内核模块后,消除了警告信息。
③安装内核时出现 “Warning: os - prober will not be executed...” 的警告,这是因为GRUB_DISABLE_OS_PROBER可能被设置,导致os - prober工具不被执行,无法检测其他可引导分区并添加到 GRUB 配置中。使用sudo vim /etc/default/grub打开文件,找到GRUB_DISABLE_OS_PROBER这一行,去掉注释符号#并确保其值为false,保存并关闭文件后执行sudo update - grub命令,重新生成 GRUB 配置文件,解决了该警告问题。
如果对你有帮助的话,请为我点个赞吧❤