内核编译
# 内核编译
Owner: -QVQ-
第一步:下载源码,根据自己系统对应的内核版本下载源码(uname -a查看)
内核版本信息
内核版本号的格式通常是x.y.z,其中x表示主版本号,y表示次版本号,z表示补丁级别,Ubuntu版本号的格式通常是x.y.z-数字,其中x表示Ubuntu系统的主版本号,y表示次版本号,z表示补丁级别,数字表示Ubuntu系统的版本号。
例如:5.19.0-38-generic
这个版本号是 Linux 内核的版本号,其中 5 表示主版本号,19 表示次版本号,0 表示补丁级别,38 表示 Ubuntu 系统的版本号,generic 表示使用的内核类型。
补丁级别指内核的修补程序版本。每个版本的内核都可能有不同的 bug 和安全漏洞,因此内核维护者会定期发布修改程序来修复这些问题。补丁级别指的是这些修补程序的版本号。在这个版本号中,补丁级别为 0 表示没有修补程序。
内核版本的代码下载:
官网下载:
在tag中选择合适的版本下载(【……】展开全部)
官网下载太慢,推荐用镜像下载
Index of /kernel/linux/kernel/v5.x/ (opens new window)
git下载:
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitmake -j8要看自己电脑性能决定用哪个
下下来的代码不要在Windows下解压,在linux用
tar -zxvf 压缩文件名.tar.gz 被压缩文件名解压
第二步:配置
在下下来的代码路径下,
简便操作, 重用系统的config文件cp /boot/config-5.19.0-38-generic ./
然后在这个路径执行make oldconfig 使用现有的配置文件,也可以使用make menuconfig设置配置项
当执行
make oldconfig时出现/bin/sh: 1: ./scripts/pahole-flags.sh: Permission denied用如下命令开启权限
chmod +x scripts/*.sh当执行
make oldconfig时出现make[1]: *** [scripts/Makefile.host:95: scripts/basic/fixdep] Error 127解决方法:分别安装词法解析器flex,和语法解析器bison:
apt install flex
apt install bison
第三步:编译内核
准备:
apt-get install kernel-package
apt-get install软件时出现Package kernel-package is not available, but is referred to by another package.https://blog.csdn.net/thanklife/article/details/125496134 (opens new window)
apt-get install libssl-dev
不然会报错:fatal error: openssl/opensslv.h: No such file or directory
apt-get install libelf-dev
不然会报错:atal error:gelf.h:No such file or directory
apt-get install dwarves
将当前目录下的.config文件里CONFIG_SYSTEM_TRUSTED_KEYS参数设置为"”
apt-get install zstd
编译:
make-kpkg clean
make-kpkg --initrd kernel-headers kernel_image
上面两个命令我没成功
用的
make bzImage -j8
用8线程编译内核,注意如果虚拟机没有8线程可以改成其他线程数
如果报错Failed to create a ./debian directory: No such file or directory,
则需要先
make-kpkg clean一下编译指令时加上的initrd
起因:
系统启动时一个重要的任务就是mount根文件系统(存放了大部分系统程序位于磁盘上),而这必需要要有磁盘的驱动程序和文件系统驱动程序,对于建立在IDE硬盘上的ext文件系统,内核映像通常都包含有IDE硬盘驱动和ext文件系统驱动,但是对于其他设备、其他文件系统,内核映像就不一定有相应的驱动
由于硬件和兼容性的限制,内核映像的大小不能太大Linux需要尽可能多地支持各种各种的硬件设备,但是由于内核映像大小受限,不能随便把硬件设备驱动程序放入内核映像中
可能的解决方法:
1.发行商提供预先编译好的支持各种设备的不同内核,用户安装时选择不同的内核。一一硬件总类、组合太多,不可行
2.让用户根据自己机器的配置情况,自己制作启动盘加载根文件系统一一太麻烦
现行方法:
显然上面的方法不太行,因此我门可以将各种硬件设备、文件系统的驱动程序模块化
发行商提供内核映像、系统安装程序
系统安装过程中,会根据当前硬件配置情况,选出系统启动需要的驱动程序,并据此制作成initrd
initrd相当于一个临时的根文件系统,其中存放了系统启动必须的各种驱动程序构建于内存盘之上
No rule to make target ‘debian/canonical-certs.pem‘, needed by ‘certs/x509_certificate_list‘修改路径下.config文件
CONFIG_SYSTEM_TRUSTED_KEYS项置空CONFIG_SYSTEM_REVOCATION_KEYS项置空kernel/rcu/tree.o: No such file or directory
cp /boot/config-5.19.0-38-generic ./最好是复制带有补丁的配置文件
fixdep: error opening file,: .min_addr.o.d: No such file or directory
重新解压,重新编译
如果编译的文件夹/arch/x86/boot/bzImage存在,则编译成功
第四步:编译内核模块
内核模块需要单独编译安装
编译:
make modules
遇到的问题:
drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c:25:10: fatal error: aux.h: No such file or directory在https://elixir.bootlin.com/ (opens new window)网站中找到自己的版本,直接下载
aux.h和aux.c两个文件到自己的目录里推测可能是包在下载解压的时候损坏了,补上这两个文件即可
编译编到一般,电脑断电休眠了,再编时出现
*No rule to make target 'net/netfilter/xt_DSCP.o', needed by '__build'.修改makefile文件
vim scripts/Makefile.build$(subdir-ym) := $(subst xt_DSCP.c,xt_dscp ,$(subdir-ym))
安装:
make modules_install
如果存储空间不够大,需要扩展虚拟机磁盘
安装
上一步的编译会在上层目录生成两个.deb文件
dpkg -i *deb
reboot
第五步:
make install #安装内核
其中做了更改grub的配置文件,把新内核的相关信息添加到配置中
出现Warning: os-prober will not be executed to detect other bootable partitions
vim /etc/default/grub在其中增加如下内容
GRUB_DISABLE_OS_PROBER=false GRUB_SAVEDEFAULT=true GRUB_DEFAULT='Advanced options for Ubuntu>Ubuntu, with Linux <你的版本号,一直到generic>'1
2
3保存后退出,更新grub文件
update-grub
reboot重启电脑,长按shift可以进入选择系统的模式
按e,再按ctrl+x进入选择模式,选择自己编译的那个内核版本
此时在**/usr/src**路径下生成一个linux-headers-5.19.0文件,其中存放了编译内核模块的文件,也包括完整的内核代码,如果修改了代码就需要重新编译
- /include 包含了头文件
- /lib/modules中生成一个5.19.0文件,其中包含两个符号连接(build、source)指向这里编译出来的路径,其中kernel放了编译好的内核模块
- /root下生成config-5.19.0 和initrd.img-5.19.0和sysyem.map-5.19.0(符号表信息)和vmlinuz-5.19.0(内核映像、可以理解成内核编译好后的可执行程序)
- /boot/grub/ 下增加了grub.cfg存放grub各种启动时的菜单选项
- config-x.x.x文件是内核的配置文件,
- initrd.img-x.x.x是初始化ram磁盘文件,
- vmlinuz-x.x.x是内核映像文件。
安装完后,原本的代码和编程出来的文件可以删除,但建议保留内核映像文件(vmlinuz)和初始化ram磁盘文件(initrd.img)因为它们是内核编译生成的可执行文件和根文件系统,可以在需要时用于引导计算机。
例如可以使用以前的内核映像文件启动计算机,以便回滚到以前的版本。
同样,如果需要在计算机上安装另一个操作系统,可以使用initrd.img文件引导计算机并安装新操作系统。
# 卸载内核
make /usr/src/uninstall
rm -rf /lib/modules/版本号
