Linux内核编译
编译环境如下:
ubuntu-18.04.4-desktop-amd64当前内核5.3.0-28准备安装的内核版本
5.11.13
1.内核下载
网站 点击进入 (opens new window)
https://www.kernel.org进入网站后如下图

下载后的内核文件如下图

2.上传内核程序
可以使用WinSCP或者Xftp进行文件的上传,这里选择使用xshell 使用Linux中的lrzsz包进行上传。
参考这篇文章 xhell上传文件(opens new window)
备份
/boot/grub/grub.cfg文件这个文件他负责启动你的Ubuntu系统,你编译好内核之后是要把新内核信息加入到这个文件里面,这样你才能在启动Ubuntu的时候运用你的新内核。这个文件也是极其重要的。如果你在编译内核过程中操作不当,将里面的信息破坏了,那么你的系统将无法启动,这样你只能通过恢复这个文件来解决。
3.解压内核文件
进入文件上传后的目录
解压上传上的文件,下图以
linux-5.11.13.tar.xz为例,若无权限,前面加sudo即可。
tar -xavf linux-5.11.13.tar.xz如下图所示,即解压完成。

4.下载相关包
安装一系列软件。
sudo apt-get install libncurses5-dev openssl libssl-dev sudo apt-get install build-essential sudo apt-get install pkg-config sudo apt-get install libc6-dev sudo apt-get install bison sudo apt-get install flex sudo apt-get install libelf-dev sudo apt-get install zlibc minizip sudo apt-get install libidn11-dev libidn11 #
5.清理内核文件
进入解压后的目录,使用命令
make mrproper这个命令会删除所有的编译生成文件、内核配置文件(.config文件)和各种备份文件,所以几乎只在第一次执行内核编译前才用这条命令。
6.添加内核配置
将boot目录下的当前系统内核的config配置信息复制一份到当前目录下的.config文件中。
进入内核文件目录 输入
cd linux-5.11.13查看当前目录地址,输入
pwd复制当前使用的内核配置,我这里当前内核配置是
config-5.3.0-28-generic,到当前目录
cp /boot/config-5.3.0-28-generic ./.config
如下图所示:

输入
make menuconfig命令,会打开一个图形界面(此步骤需要在虚拟内部的终端中进行)。

移动键盘光标,到
{Load}上,再回车,可以看到确认是当前目录下的.config文件

选择OK后,再移动到Save上,保存并关闭,最后选择退出Exit
注意
在后面编译过程中如果出现这个错,应该配置中少了下面图片中的选项


#7.开始编译内核
输入下面的命令,开始编译,编译过程需要很长时间 (我这里是从19.30到22.00)
sudo make此命令后可加
-jn来使用多个进程进行编译,例如sudo make j4,但是第一次编译时使用了该命令编译速度很快不到10分钟,但是当前目录很明显大小并没有增加。以至于内核编译失败编译过程中可以新建一个终端查看该目录下内存大小是否在不断增加
du -sh编译完成后,输入命令
du -sh查看编译后的目录大小,如下图所示,可以看到我这里最终当前目录有21G,编译前只有1.3G。

#8.安装内核
输入下面的命令,安装内核模块
make modules_install安装开始:

安装结束:

输入下面的命令,安装内核
sudo make install
#9. 配置启动内核
依次输入下列命令(后面的版本号根据自己的修改,可以使用
{Tab}键自动补全)sudo mkinitramfs -o /boot/initrd.img-5.11.13 sudo update-initramfs -c -k 5.11.13 update-grub2如下面部分命令行内容所示
xyk@xyk-Virtual-Machine:~/mykernel/linux-5.11.13$ sudo mkinitramfs -o /boot/initrd.img-5. initrd.img-5.11.13 initrd.img-5.3.0-28-generic xyk@xyk-Virtual-Machine:~/mykernel/linux-5.11.13$ sudo mkinitramfs -o /boot/initrd.img-5.11.13 xyk@xyk-Virtual-Machine:~/mykernel/linux-5.11.13$ sudo update-initramfs -c -k 5. 5.11.13 5.3.0-28-generic xyk@xyk-Virtual-Machine:~/mykernel/linux-5.11.13$ sudo update-initramfs -c -k 5.11.13 update-initramfs: Generating /boot/initrd.img-5.11.13 xyk@xyk-Virtual-Machine:~/mykernel/linux-5.11.13$ sudo update-grub2 Sourcing file `/etc/default/grub' Generating grub configuration file ... Found linux image: /boot/vmlinuz-5.11.13 Found initrd image: /boot/initrd.img-5.11.13 Found linux image: /boot/vmlinuz-5.3.0-28-generic Found initrd image: /boot/initrd.img-5.3.0-28-generic Found memtest86+ image: /boot/memtest86+.elf Found memtest86+ image: /boot/memtest86+.bin done xyk@xyk-Virtual-Machine:~/mykernel/linux-5.11.13$输入下面的命令查看当前电脑版本号
uname -a
可以看到此虚拟机本来内核版本是
5.3.0
#10.重启电脑,查看是否安装成功
输入命令
sudo reboot重启计算机,再次检查内核版本,输入uname -a

可以看到我的内核版本以及换成
5.11.13
#11.失败经历
添加内核配置时,将
.config文件误以为是文件夹,最终导致编译过程中,出现很多配置的选项。最终直接将.config文件,放入内核目录下,得以解决。第一次编译时,采用 下面的方式进行,
#编译内核 make bzImage -j4 #编译模块 make modules -j4 #安装模块 make modules_install补充:经过后期再次实验下面的方法可行,在配置启动项时需要使用到如下代码
sudo mkinitramfs /lib/modules/5.11.14 -o /boot/initrd.img-5.11.14-generic
sudo cp ~/kernel/linux-5.11.14/arch/x86/boot/bzImage /boot/vmlinuz-5.11.14-generic
sudo cp ~/kernel/linux-5.11.14/System.map /boot/System.map-stem.map-5.11.14
sudo apt-get upgrade
最终导致启动时出现下图错误

出现此错误后,将虚拟机强行关闭后进入下图页面(若没用自动进入,在启动后按住
{Esc}或者{shift})
选择之前的内核进行启动,即可再次进入系统。
最后注意:
当编译失败后不要悲伤不要心急,输入make clean命令,此命令用于删除大多数的编译生成文件,但是会保留内核的配置文件.config,还有足够的编译支持来建立扩展模块。所以你若只想删除前一次编译过程的残留数据,只需执行make clean命令,在重新进行编译。
make clean