注1:现在的内核版本 5.13.0-40 替换成 5.8.1
不准确的地方,请多多指正,谢谢。
1,从官网下载源码 Index of /pub/linux/kernel/v5.x/
3,在编译之前要做一些环境准备:
安装一些工具:
sudo apt-get install build-essential kernel-package libncurses5-dev
如果不是第一次编译,则需要执行 make mrproper来清理以前编译生成的一些文件,具体删除了哪些文件,可以参考下面的文章:
make mrproper及mrproper的含义_求佛_ce123的博客-CSDN博客_make mrproper什么意思
4,如果直接在解压后的 /usr/src/linux-5.8.1/ 下执行make all 全编译,会报错:
报错:.config文件没找到,需要运行下面的一些命令来生成
注:关于menuconfig,.config等,给大家提供两篇文章参考
Linux内核配置.config文件 - ITtecman - 博客园
menuconfig工作机制 · OneOS开发者文档
5,运行menuconfig:make menuconfig
若运行报错,应该是menuconfig相关的一些文件没装好,可搜一下解决办法。一般是装下面的文件即可:
sudo apt-get install bison
sudo apt-get install flex
在成功运行menuconfig后,会生成 .config文件,然后运行 make all -j8 编译内核和模块(make -j8应该也行?可以试一下)
注2:make 命令以及后面的 -j8 参数,给出参考文章:
make all、make clean、make install 等命令的来源_electrocrazy的博客-CSDN博客
【linux编译】make -j 参数简介_zl3090的博客-程序员宝宝 - 程序员宝宝
注3:在我参考的一些文章,有的是用现在内核的 .config 文件。
比如 /boot 路径下的 config-5.13.0-40-generic 是现在的 .config 文件,名字不同而已。
所以编译时也可按照上述的做法,将现在的 .config 文件(config-5.13.0-40-generic) copy 到 /usr/src/linux-5.8.1/ 路径下,将其名字修改为 .config,然后运行 make all -j8 编译内核和模块。 可以试一下能否编译通过。
解决方法可参考下面的文章:内核错误: No rule to make target ‘debian/canonical-certs.pem‘, needed by ‘certs/x509_certificate_list‘_ImagineMiracle的博客-CSDN博客
在 arch/x86/boot 下有一个 bzImage ,一般可认为编译完成。
8,安装模块和内核:
注4:先安装模块,再安装内核,试过顺序反过来,启动会有问题
安装模块:make modules_install
安装内核:make install
先执行 make modules_install ,会自动安装至 /lib/modules/5.8.1/ 路径下,类似于原来已经安装的内核模块(可恶的水印挡住了)
再执行 make install ,会在 /boot/ 路径下生成一些文件:
比如:config-5.8.1 , initrd.img-5.8.1 ,System.map-5.8.1 ,vmlinuz-5.8.1 ...
具体这些文件有啥用,可以自己搜索一下。
注5: 这里要注意 initrd.img-5.8.1 的大小,一般不能超过100M,否则启动时会卡主,缩小nitrd.img-5.8.1大小可以用 make INSTALL_MOD_STRIP=1 modules_install 。
9,修改grub配置文件,更新grub引导:
我的想法,开机按shift进入grub引导菜单,然后自己选择可启动的内核。所以需要做两个动作:
修改grub的配置文件:vim /etc/default/grub
注释掉 第7行 ,将GRUB_TIMEOUT值改为30,GRUB_CMDLINE_LINUX_DEFAULT修改为text
更新grub引导: update_grub
10,reboot,在grub引导菜单选择启动的内核,进系统之后查看内核版本,uname -a,搞定!
注6:如果想固定启动的内核,不用每次开机选择,可以参照下面的文章进行修改:
Ubuntu设置默认内核启动版本_SweeNeil的博客-CSDN博客_ubuntu设置默认启动内核