1、安装必要库依赖:
sudo apt-get upgrade
sudo apt-get install libncurses5-dev
sudo apt-get install openssl
apt-get install 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
sudo apt-get install ystd
2、下载并解压内核:
cd /usr/src
wget https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.12.9.tar.xz
由于下载的内核为*tar.xz文件,所以执行命令:
tar -xavf linux-5.12.9.tar.xz -C /usr/src
3.添加系统调用:
(1)声明系统调用
vim arch/x86/entry/syscalls/syscall_64.tbl(32位系统选择32.tbl,64位系统选择64.tbl)
345 64 mysyscall sys_mysyscall
号需要未被使用,每个字符串之间是tab键,不是空格键,最后一列建议跟上文保持一致,没有__64_的,直接sys开头就行。
(2)加入函数声明:
vim include/linux/syscalls.h
shift +g到最后一行:
asmlinkage long sys_mysyscall(void);
(3)编写函数
vim kernel/sys.c
最后一行定义一下:
4、编译前处理(在内核目录下执行):
进入内核目录:cd /usr/src/linux-5.12.9
(1)make mrproper
make clean
(2)终端中使用root权限使用命令#gedit .config:
CONFIG_SYSYTEM_TRUSTED_KEY= "debian/canonical-certs.pem"将“”中内容清空
CONFIG_DEBIG_INFO_BTF = y ,将 y 改为 n
处理完后make menuconfig进入菜单
此处可能报错,一种原因是前面提到的包未安装,另一种是窗口太小无法显示。
开头说明括号内的符号什么意思,大家可以根据自己的需要进行勾选,或者参考网上的裁剪示例进行内核编译。如果默认save的话编译下来大概20g不到,不同版本具体大小不同。
我这里步骤是这样的:
load -> save -> exit -> exit
5、编译内核和模块以及安装:
make bzImage
编译完成后会在arch/x86/boot路径下生成bzImage文件,即编译出来的新内核
执行make install将其移动到boot路径下
接下来执行命令make modules来编译这些模块
最后执行命令make modules_install将内核模块安装到/lib/modules中
6、添加启动项
mkinitramfs /lib/modules/5.12.9 -o /boot/initrd.img-5.12.9-generic
cp /usr/src/linux-5.12.9/arch/x86/boot/bzImage /boot/vmlinuz-5.12.9-generic
cp /usr/src/linux-5.12.9/System.map /boot/System.map-5.12.9
进入/boot/grub/ 然后执行update-grub2 更新grub目录
7、设置 /etc/default/grub:(改变系统启动是启动项加载时间)
cd /etc/default/grub
GRUB_DEFAULT=2
GRUB_TIMEOUT=10
#GRUB_TIMEOUT_STYLE=hidden
GRUB_CMDLINE_LINUX_DEFAULT="text"
然后执行
sudo update-grub
重启系统:
reboot
8.进入新内核版本,并进行测试:
重启后进入该界面,不同版本显示的内容可能有所区别
选择第二项(高级选项:)
选择不带(recovery mode)的,新下载的内核的选项
#uname -r查询 5.12.9 (内核版本号)
说明内核更换成功!!!
编写测试程序:
编写test.c测试文件
测试程序需要将系统调用号修改成自己添加的
编译运行该测试文件:
如果出现问题,根据报错信息修改测试程序或者查看三个部分(系统调用表、结构体、函数声明)是否书写有错,对应文件目录是否有错,然后重新编译内核。
可能遇到的问题:
(1)磁盘容量不足,需要扩容
解决:
可以参考这篇文章
vmware:ubuntu虚拟机如何扩容?_vmware ubuntu scsi硬盘扩容-优快云博客
但如果在编译内核时提示内存已满,且不小心把虚拟机关机,再次打开进不去系统的时候,可以在开机时,进入bois模式下,具体进入该模式下的几种方法,可以参考这篇文章:
真没想到,vmware进入 bios设置 的方法是这样的_vmware bios-优快云博客
接着具体操作可以参考这篇文章:
[Linux] VMware虚拟机开机后直接进入memtest_虚拟机开机出现memtest-优快云博客
(2)make modules_install时可能会有报错
可能会提示:Linux内核编译错误:make[1]: *** 没有规则可制作目标“debian/canonical-certs.pem”,由“certs/x509_certificate_list” 需求。 停止。
推测是由于在解决make环节的报错make[1]: *** 没有规则可制作目标“debian/canonical-certs.pem”,由“certs/x509_certificate_list” 需求。 停止时将CONFIG_MODULE_SIG_KEY与CONFIG_SYSTEM_TRUSTED_KEYS均置空的操作导致。 CONFIG_MODULE_SIG_KEY的置空可能会引起make modules_install的报错。
解决:
终端中使用root权限使用命令#gedit .config
将CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"恢复后解决。(也可重置.config配置解决,注意CONFIG_SYSTEM_TRUSTED_KEYS仍需置空)
CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem" #这个要删除
(3)报错:FAILED:load BTF from vmlinux:No such file or directory
解决:
终端中使用root权限使用命令#gedit .config