1. 内核源代码链接:https://www.kernel.org/
Latest Stable Kernel is : 4.15.7
2. 3个重要路径:
1>内核源码放置路径:/usr/src/kernels/
2>模块安装路径:/lib/modules/$(uname -r)/kernel/,这个内核版本在之后创建虚拟文件系统需要用到,即$(uname -r)这个目录名,必须一致.
3> 内核功能与模块配置文件,内核文件,虚拟文件系统放置目录/boot/
3. 编译过程
1>make mrproper确保内核功能选择文件删除
2>make clean 删除中间目标文件
3>make menuconfig 以图形界面的方式选择内核功能
根据不同类型的选择,有不同的标识:
「 [ ] 」(excludes)表示该选项没有被选取,编译后的kernel 将不会有此功能。
「 < > 」(module capable)表示该选项没有被选取,而且是可以被当做是module,可以在开机之后另外载入的。
「 [*] 」(built-in)表示该选项有被选取,编译后的kernel 包含此功能,而且该功能会被编入kernel image 中,这意味着在kernel 被载入时该功能就已经存在,有些功能是一定要在kernel 被载入时就存在的,例如读取filesystem,因为kernel 无法从它认不出的filesystem 里读取档案。 虽然将各能选成内建可以将整个kernel 的功能包成一个kernel image 档,但它也会造成执行时一些不必要的记忆体以及初始化时间的浪费。
「
依据自己电脑选择适当功能,安装完save退出将生成一个.config的配置文件
4. make bzImage 编译经过压缩的内核(fedora提前安装好openssl-devel,Ubuntu sudo apt-get install opensll, sudo apt-get install libssl-dev 不然会提示错误) (Image — image)
5. make modules 编译模块
6. make modules_install安装模块,模块安装在/lib/modules/下
7. cp /usr/src/kernels/linux-4.15.7/arch/x86/boot/bzImage /boot/vmlinuz-4.15.7 移动内核到/boot
8. cp /usr/src/kernels/linux-4.15.7/.config /boot/config-4.15.7 备份设置文件
9. mkinitrd -v /boot/initramfs-4.15.7.img 4.15.7
(Ubuntu: mkinitramfs -o /boot/initrd.img-4.18.5 4.18.5)
新建虚拟文件系统,4.15.7即是上面提到的$( uname -r)目录,因为SCSI硬盘需要模块化,加载模块需要在根目录,但是此时硬盘根本无法使用,目录树不存在,故使用initrd来新建虚拟文件系统,仿真成为根目录。
10. grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg 自动更新grub文件,UEFI机器上 (Ubuntu sudo update-grub2)
11. 重新启动,在选择操作系统界面会出现4.15.7这个操作系统,我第一次安装进入了紧急模式,在编译3次之后在可以进入操作系统(不知道哪里错了…),只是内核变了,界面依旧是fedora的界面,执行命令uname -r 能看到版本是4.15.7