作为 HomoLab 成员,怎么能不会编译 Linux 内核呢

本文所使用环境为全新安装的 Debian 12 amd64

E0: 环境准备

安装必要的工具

apt install git build-essential bc bison flex libssl-dev libncurses5-dev libelf-dev

如果需要交叉编译 arm64 或其他架构的内核,请继续安装与目标架构相符的 gcc 并设置环境变量

apt install gcc-aarch64-linux-gnu
export ARCH=arm64
export SUBARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-

E1: 构建内核

拉取源码

钦定一个你喜欢的 Linux 内核仓库,拉取之

使用 shallow clone 可以有效节省拉取时间

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git --depth=1

生成配置

arch/${ARCH:-x86}/configs 下查看可选的预设配置,选择一个生成 .config 配置文件

make x86_64_defconfig

如果你希望调整内核参数,请先查看 E3 小节,调整完毕后再进行编译

默认编译出的内核版本号末尾带有 +,版本号为 x.y.z+,可以通过设置 LOCALVERSION 环境变量去除

export LOCALVERSION=

也可以通过 LOCALVERSION 自定义内核版本后缀

export LOCALVERSION="-homolab"

某些预设配置编译出的内核版本号末尾还会带有当前 Git 版本哈希,可以参照 E3 小节关闭 CONFIG_LOCALVERSION_AUTO 去除

编译

make -j$(nproc)

kernel-result

编译完成后内核文件可在 arch/${ARCH:-x86}/boot 下找到

打包

对于 Debian 系或 Redhat 系用户,可以将内核打包成 deb/rpm 文件以便安装与管理

deb

安装打包依赖

apt install debhelper rsync

仅打包 deb

make -j$(nproc) bindeb-pkg

打包 deb 及源码

make -j$(nproc) deb-pkg

在上级目录下可以查看打包产物

kernel-deb

rpm

apt install rpm
make -j$(nproc) binrpm-pkg
make -j$(nproc) rpm-pkg

产物可在 rpmbuild/RPMS 下查看

kernel-rpm

E2: 更换内核

直接安装

make headers_install
make modules_install
make install

包管理器安装

dpkg -i ../linux-*.deb

kernel-boot

重启,享受自己编译的内核

kernel-uname

kernel-neofetch

E3: 调整内核参数

make menuconfig

kernel-menuconfig-index

键入 / 可以打开搜索

kernel-muneconfig-search

通过搜索结果提供的路径找到条目后,空格启用/关闭功能

kernel-menuconfig-virt

完成后退出并保存

如果你已经了解想开启功能的依赖,也可以直接修改 .config 文件

E4: 后记

遥想上次写博客还是四年前,这两天心血来潮决定写点东西,分享些折腾 HomoLab 时的 case study,顺便整理了好 contribute 给上游,考虑之后想写的几篇都涉及了内核编译,遂解耦并作为复活博客后的第一篇

顺便立个小 flag,争取周更月更