编译Linux kernel

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, 并退出. 默认的配置为最小设置, 将会使编译耗时很短, 且缺少许多必要的模块. 建议在配置前, 对于各项模块的设置有一定的理解.

通过本地modules(lsmod)配置

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编译安装.

boot

一种方法, 可以预先安装好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添加对应的配置文件.

Then reboot, and you will find it!

关于initramfs

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