【Arch Linux】编译安装 AUR 上的 Linux 内核

原帖地址:https://blog.imakiseki.cf/techdev/arch/kernel-compilation/


Arch Linux 可以使用多种 Linux 内核. 默认的内核由官方 core 仓库的 linux 包提供, 一般另附有 linux-headers 包. 官方仓库中提供的预编译内核还有同为 core 仓库的 linux-ltsextra 仓库的 linux-zen. 不过, 在一些场合下, 例如需要更新的或是有 patch 的内核时, 我们可能需要从 AUR 中获取需要的内核并手动编译安装. 本文以 linux-mainline 包为例, 主要借助 yay 更便捷地处理相关操作.

通常情况下, 只需要 yay -S linux-mainline 即可. 以下需要对编译安装过程做一些可选操作.

获取 PKGBUILD

使用 yay-G 选项仅获得 PKGBUILD 等相关的文件. 添加 --force 以强制保持与上游 AUR 包内容一致. 由于该操作默认目标文件夹为当前文件夹, 所以可以切换到 ~/.cache/yay 后再获取.

mkdir -p ~/.cache/yay && cd ~/.cache/yay
yay -G --force linux-mainline

(可选) 修改上游仓库 URL

进入 linux-mainline 文件夹查看 PKGBUILD 后可以发现其从 <kernel.org> 的 Git 服务器获取上游的 Linux 源码:

...
source=(
"$_srcname::git+https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git#tag=$_tag"
config # the main kernel config file
)
...

但是完整的 Linux 仓库体积已经超过 2 GB, 对于中国大陆用户不够友好. 好在 <kernel.org> 在北京已经设置 Git 镜像: https://kernel.source.codeaurora.cn/. 所以我们可以修改上游仓库的 URL, 以提高下载速度. 在编辑器中打开 PKGBUILD:

26c26
< "$_srcname::git+https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git#tag=$_tag"
---
> "$_srcname::git+https://kernel.source.codeaurora.cn/pub/scm/linux/kernel/git/torvalds/linux.git#tag=$_tag"

或者是执行下面的命令修改:

sed -i 's/git+https\:\/\/git\.kernel\.org\/pub\/scm\/linux\/kernel\/git\/torvalds\/linux\.git/git+https:\/\/kernel.source.codeaurora.cn\/pub\/scm\/linux\/kernel\/git\/torvalds\/linux.git/' PKGBUILD

此外, 还可以通过 yay--editmenu 参数交互式编辑:

yay -S --editmenu linux-mainline

(可选) 获取 PGP 密钥

查看 PKGBUILD 可以看到用户需要接受三个 PGP 密钥, 分别是:

...
validpgpkeys=(
'ABAF11C65A2970B130ABE3C479BE3E4300411886' # Linus Torvalds
'647F28654894E3BD457199BE38DBBDC86092693E' # Greg Kroah-Hartman
'A2FF3A36AAA56654109064AB19802F8B0D70FC30' # Jan Alexander Steffens (heftig)
)
...

但是安装过程中可能发现 yay 卡在获取密钥的部分. 对于后两个密钥, 可以通过:[1]

gpg --keyserver hkp://keys.openpgp.org --recv-keys 647F28654894E3BD457199BE38DBBDC86092693E
gpg --keyserver hkp://keys.openpgp.org --recv-keys A2FF3A36AAA56654109064AB19802F8B0D70FC30

获取.

这个选项可以持久化:[2]

yay -Y --gpgflags "--keyserver hkp://keys.openpgp.org" --save

不过对于第一个密钥, 可能需要其他的方法. 首先保证存在 gpg2 (对应包为 core 仓库的 gnupg), 再:

gpg2 --auto-key-locate cert,pka,dane,wkd,keyserver --locate-keys [email protected]

(可选) 多线程编译安装

需要手动传入 make 命令的编译 flags:

MAKEFLAGS="-j16" yay -S linux-mainline # 16 线程

多线程编译仍然可能需要较长时间 (笔者测试需要 30 分钟左右, 因机器配置而异). 请不要断电.

更新 Boot loader 配置

以 GRUB 为例:

sudo grub-mkconfig -o /boot/grub/grub.cfg

重启

这是非常重要的 - 否则折腾半天系统服务没法加载的时候会很痛苦.

参考


  1. Hang at gpg import step · Issue #1022 · Jguer/yay · GitHub ↩︎

  2. Hang at gpg import step · Issue #1022 · Jguer/yay · GitHub ↩︎