从kernel.org选择想要的版本, 下载到本地并解压.
tar -xvf linux-<VERSION>.tar.xz
进入kernel代码目录, 清理已存在的config和一些文件, 为编译做准备.
对于刚下载的项目, 一般不会有任何影响, 不过这是个好习惯.
cd linux-<VERSION>
make mrproper
# make mrproper Delete the current configuration, and all generated files
内核编译的一些帮助可以通过make help查看.
make menuconfig
此模块会构建一个图形交互界面, 用以配置想要的配置文件.
配置完成后, 保存以.config, 并退出.
默认的配置为最小设置, 将会使编译耗时很短, 且缺少许多必要的模块.
建议在配置前, 对于各项模块的设置有一定的理解.
make localmodconfig
localmodcofig会先检测kernel代码当前目录下是否已有.config,
若不存在, 则会从/proc/config.gz获得正在运行的kernel的config file.
并得到正在运行的内核模块, 询问是否加入config file.
Arch Linux中, 已有的内核配置文件可从/lib/modules/$(uname -r)/build/.config获得, 不同distribution的路径可能不同. 使用已有的配置文件, 一般不会出现问题, 之后也可以在此基础上进行微调地配置.
make -j10编译kernel, 根据主机CPU的核数以及线程数, 调整使用的线程. 编译内核比较吃算力, 根据主机以及编译模块的不同, 会花费二十分钟到几小时不等.
sudo make modules_install会将内核模块包括内核库, 内核头文件等安装到/usr/lib/modules/目录下.
DKMS编译的驱动, 需要dkms autoinstall -k <KERNEL-VERSION>, 对新的kernel编译安装.
一种方法, 可以预先安装好LILO, 然后运行sudo make install, 应该就能成功布置好boot.
但是发现好像LILO已停止更新, 并且为了使boot更符合自定义, 同时更好的学习, 所以决定还是手动配置启动项部分.
经过略微深度挖掘发现, make install也只是跑了一个脚本. 参考脚本./arch/x86/boot/install.sh, 其中只是简单将image file和map file复制到/boot/路径下, 并在最后调用LILO.
复制image file: sudo cp arch/x86/boot/bzImage /boot/vmlinuz-<VERSION>
复制map file: sudo cp System.map /boot/System.map-<VERSION>
创建initramfs.img: sudo mkinitcpio -k <KERNEL-VERSION> -c /etc/mkinitcpio.conf -g /boot/initramfs-<VERSION>.img.
我的机子使用systemd-boot作为boot manager, 根据自己的boot manager添加对应的配置文件.
Arch Linux可以使用mkinitcpio创建initramfs.
initramfs是一个简易版的文件管理系统, 被kernel调用, 用以在加载完整的系统之前完成一些必要的任务. 比如root目录可能在存放在不同环境的硬盘中, 甚至是加密的, 这时候就需要通过initramfs加载相对应的硬盘驱动, 来读取硬件, 用以加载更完整的系统.
initramfs先后通过cpio和gzip压缩, 可通过file initramfs.img查看.
可以通过层层解压, 还原初始的文件用以更好的食用.
sudo cp /boot/initramfs.img initramfs.img.gz
sudo gzip -d initramfs.img.gz
sudo cpio -i < initramfs.img