1 内核源码的编译
先查看当前内核版本
在内核ftp下载点下载与当前版本相近的内核源码,我选择了5.3.1的版本。
在编译内核前,要根据目标内核的运行硬件环境对内核的编译选项进行配置,如make menuconfig
等,为了简便,我这里在当前系统的config文件基础上进行编译。该config文件是在安装ubuntu是自动生成的,适配于本机硬件环境。本机的config文件在目录/boot/
下
可以看到文件config-5.3.0-42-generic就是配置文件,然后将配置文件复制到内核源码目录下cp /boot/config-4.15.0-45-generic .config
,然后执行配置操作make oldconfig
。
用make-kpkg clean
命令清除之前生成的目标文件。
安装两个工具包apt install kernel-package
和apt install libncurses5-dev
。
然后进行内核编译make-kpkg --initrd kernel-headers kernel_image
,注意要留出较大外存,大于30GB,编译过程中会生成许多目标文件,占用大量硬盘空间。
编译完成后会在上一级目录生成两个.deb文件,
然后切换至该目录下,安装这两个deb文件dpkg -i *.deb
,然后重启电脑reboot
。
什么是make-kpkg
make-kpkg用来制作Ubuntu的内核安装包deb的工具,make-kpkg的安装包是kernel-package,–initrd用于生成initramfs,kernel_image用于生成内核和模块的安装包, kernel_headers用于生成内核头文件的安装包。
2 编译并安装后的变化
重启电脑后我们可以看到在/usr/src/
目录下创建了/usr/src/linux-headers-4.15.0
目录,该目录中存放了用于编译内核模块的若干Makefile文件、Kconfig文件,include子目录存放了若干头文件。
建立了/lib/modules/5.3.1
目录,
该目录下有以下文件,其中build和source均是符号链接,指向编译内核时的源码目录,其中kernel
目录,保存了编译好的各个内核模块文件。/boot
目录下新增加文件如图,config-5.3.1
是配置文件,System.map-5.3.1
是符号表文件,vmlinuz-5.3.1
是未压缩的内核映像。initrd.img-5.3.1
是一个临时的根文件系统,其中存放了系统启动时所必需的各种驱动程序。
什么是initrd
在系统启动过程中,一个重要的任务就是mount根文件系统,rootfs存放了大部分系统程序,通常位于磁盘上,而要mount根文件系统,则必须有磁盘的驱动程序和文件系统驱动程序。对于建立在IDE硬盘上的ext文件系统,内核映像通常都包含有IDE硬盘驱动和ext文件系统驱动,但是对于其他设备、其他文件系统,内核映像就不一定有相应的驱动。因为Linux需要尽可能多地支持各种各种的硬件设备,但是由于内核映像大小受限,不能随便把硬件设备驱动程序放入内核映像中。所以现在将各种硬件设备、文件系统的驱动程序模块化,在编译内核时,会根据当前硬件配置情况,选出系统启动需要的驱动程序ko,并据此制作成initrd。/boot/grub
目录下存放了各种启动时的菜单选项,/boot/grub/grub.cfg
是启动时的GRUB配置文件。