翻译自:https://itsfoss.com/compile-linux-kernel/
作者:Pratham Patel
一份手工爱好者的指南,教你如何亲身体验自己动手编译最新版 Linux 内核的过程。
你可能有兴趣自己动手编译 Linux 内核,原因有很多,比如但不限于以下几点:
尝试比你的 Linux 发行版提供的更新的内核 使用不同的配置选项和/或驱动程序构建内核 出于学习的好奇心 :)
本指南将向你展示如何自己动手编译 Linux 内核,包括你应该运行哪些命令、为什么要运行这些命令以及它们的作用。这是一个较长的过程,所以请做好准备!
像 Ubuntu 这样的发行版提供了更简便的方式来安装主线 Linux 内核。但是本教程是关于从源代码手动操作的。你需要投入时间、耐心和良好的 Linux 命令行经验才能完成这个教程。这更多的是关于亲身体验。然而,我建议你在虚拟机或备用系统上尝试这一冒险,而不是在你的主要系统上进行。
1.先决条件
构建任何东西(在此上下文中特指软件)有两个先决条件:
1)源代码
2)构建依赖
因此,作为先决条件,我们将下载 Linux 内核的源代码压缩包,并安装一些依赖项,以便我们可以构建 Linux 内核。
# 关于 Linux 版本的简介
在任意时刻,通常存在四个版本的 Linux 内核。
按照开发流程,Linux 的这些“版本”依次为:
1)linux-next 树:任何要合并到 Linux 代码库中的代码首先会合并到l inux-next 树中。这是 Linux 内核最新但也是最“不稳定”的状态。大多数 Linux 内核开发人员和测试人员会使用这个版本来优化代码质量,以便Linus稍后从中提取。请小心操作!
2)候选版本/主线版本:LINUS 从 linux-next 树中提取并创建一个初始版本。该版本的测试版被称为候选版本(Release Candidate,简称RC)。一旦发布了 RC 版本,Linus 只接受与错误修复和性能回归相关的补丁。Linus 会每周发布一个 RC 内核,直到他对代码感到满意(并收到用户的反馈)为止。RC 版本后面会跟一个数字作为后缀,以指示其版本号。
3)稳定版本:一旦 Linus 认为最后一个 RC 版本足够稳定,他就会发布最终的“公开”版本。稳定版本会再维护几周。这是像 Arch Linux和 Fedora Linux 这样的前沿 Linux 发行版所使用的版本。我建议您在尝试 linux-next 或任何 RC 版本之前先试试这个版本。
4)长期支持(LTS)版本:给定年份的最后一个稳定版本会再维护几年。这通常是一个较旧的版本,但会积极维护,包括安全修复。Debian 的稳定版本会使用 Linux 内核的 LTS 版本。
为了本文的目的,我将使用可用的最新稳定版本。在撰写本文时,该版本为 v6.5.5 。
2.准备系统
由于Linux内核是用 C 编程语言编写的,因此您至少需要一个 C 编译器来编译 Linux 内核。您的计算机上可能存在也可能不存在其他此类依赖项。现在是时候安装它们了。
本指南将重点介绍使用 GNU C 编译器(GCC)编译Linux内核。但也许在未来的文章中(深入探讨Rust支持),我将介绍使用 LLVM 的 Clang 编译器作为 GCC 的替代品。
Arch Linux及其衍生版本用户的安装命令:
sudo pacman -S base-devel bc coreutils cpio gettext initramfs kmod libelf ncurses pahole perl python rsync tar xz
Debian 及其衍生版本用户的安装命令:
sudo apt install bc binutils bison dwarves flex gcc git gnupg2 gzip libelf-dev libncurses5-dev libssl-dev make openssl pahole perl-base rsync tar xz-utils
Fedora 及其衍生版本用户的安装命令:
sudo dnf install binutils ncurses-devel \
/usr/include/{libelf.h,openssl/pkcs7.h} \
/usr/bin/{bc,bison,flex,gcc,git,gpg2,gzip,make,openssl,pahole,perl,rsync,tar,xz,zstd}
# 获取Linux内核的源代码
前往 kernel.org,在页面上找到第一个稳定版本。你不会错过的,因为它是最大的黄色框子。
你可以通过点击大黄色框来下载tar包。在下载的同时,也下载匹配的 PGP 签名文件。在我们稍后验证 tar 包时,它会非常有用。该文件具有 .tar.sign 扩展名。
1)验证 tar 包的真实性
你如何知道你刚刚下载的tar包是否已损坏?从个人层面来说,损坏的tar包只会浪费你宝贵的调试时间,但如果这是为某个组织所做的,你可能会让攻击者的工作变得更轻松(到那时,你可能会有更大的问题要担心,但让我们不要给每个人造成创伤后应激障碍!)。
为了验证我们tar包的完整性,我们需要tar包本身。目前,它使用XZ压缩算法进行压缩。因此,我将使用unxz实用程序(仅仅是xz --decompress的别名)来解压.tar.xz归档文件。
unxz --keep linux-*.tar.xz
解压后,我们将获取Linus Torvalds和Greg KH使用的公共GPG密钥。这些密钥用于对tar包进行签名。
gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org
你应该会得到与我在我的机器上得到的类似的输出:
$ gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org
gpg: /home/pratham/.gnupg/trustdb.gpg: trustdb created
gpg: key 38DBBDC86092693E: public key "Greg Kroah-Hartman <gregkh@kernel.org>" imported
gpg: Total number processed: 1
gpg: imported: 1
gpg: key 79BE3E4300411886: public key "Linus Torvalds <torvalds@kernel.org>" imported
gpg: Total number processed: 1
gpg: imported: 1
pub rsa4096 2011-09-23 [SC]
647F28654894E3BD457199BE38DBBDC86092693E
uid [ unknown] Greg Kroah-Hartman <gregkh@kernel.org>
sub rsa4096 2011-09-23 [E]
pub rsa2048 2011-09-20 [SC]
ABAF11C65A2970B130ABE3C479BE3E4300411886
uid [ unknown] Linus Torvalds <torvalds@kernel.org>
sub rsa2048 2011-09-20 [E]
一旦导入了Greg和Linus的密钥,就可以使用--verify标志来验证tar包的完整性,如下所示:
gpg2 --verify linux-*.tar.sign
如果验证成功,你应该会得到类似于以下的输出:
$ gpg2 --verify linux-*.tar.sign
gpg: assuming signed data in 'linux-6.5.5.tar'
gpg: Signature made Saturday 23 September 2023 02:46:13 PM IST
gpg: using RSA key 647F28654894E3BD457199BE38DBBDC86092693E
gpg: Good signature from "Greg Kroah-Hartman <gregkh@kernel.org>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 647F 2865 4894 E3BD 4571 99BE 38DB BDC8 6092 693E
除非看到消息说“gpg: Good signature!”,否则请不要继续!
你可以安全地忽略警告:“*WARNING: This key is not certified with a trusted signature! There is no indication that the signature belongs to the owner.*”(警告:此密钥没有使用受信任的签名进行认证!没有迹象表明签名属于所有者。)
我们从Linus和Greg的电子邮件中获取了密钥,因此无需担心此警告。
2)解压tar包
如果你已经看到这里,那就意味着你的tar包的完整性检查已经成功完成。那么,现在是时候从中提取Linux内核的源代码了。
这个很简单,只需对 tar 包执行 tar -xf
操作,如下所示:
tar -xf linux-*.tar
-x
选项用于指定提取操作,并且使用-f
选项告诉 tar 要处理的 tar 包文件名。
3.配置Linux内核
Linux
内核的构建过程会查找一个 .config
文件。顾名思义,这是一个配置文件,它指定了Linux
内核的每一个可能的配置选项。这是必需的。
有两种方法可以为 Linux
内核获取这个.config
文件:
以你的Linux发行版的配置为基础(推荐) 使用默认的通用配置
还有第三种方法,你可以从头开始,手动配置每一个选项,但请注意,有12,000多个选项。这并不推荐,因为手动配置所有内容需要花费大量时间,并且还需要足够的知识来知道应该启用和禁用哪些选项。
3.1使用发行版提供的配置
使用你的 Linux 发行版提供的配置是一个安全的选择。如果你只是想尝试比你的发行版提供的更新的内核,那么这种方法是推荐的。
Linux发行版为Linux内核提供的配置文件将位于以下两个位置之一:
大多数 Linux 发行版(如 Debian 和 Fedora 及其衍生版)会将其存储为 /boot/config-$(uname -r)
。一些 Linux 发行版(如 Arch Linux)将其集成在 Linux 内核本身中。因此,它将在 /proc/config.gz
中可用。
如果两个位置都有,那么建议优先使用/proc/config.gz
,因为它位于只读文件系统上,因此不会被篡改。
进入包含已解压tar包的目录:
cd linux-*/
然后,复制Linux发行版的配置文件:
## Debian and Fedora's derivatives:
$ cp /boot/config-"$(uname -r)" .config
## Arch Linux and its derivatives:
$ zcat /proc/config.gz > .config
3.1.1更新配置
一旦完成上述步骤,就到了“更新”配置文件的时候了。发行版提供的配置文件很可能比你正在构建的Linux内核版本要旧。
这同样适用于像Arch Linux和Fedora这样的前沿Linux发行版。它们不会因为新版本可用就立即发布更新。它们会进行一些质量保证(QA)工作,这肯定会花费一些时间。因此,即使是你发行版提供的最新内核,与你在kernel.org上获得的相比,也会落后几个次要版本。
为了更新现有的.config
文件,可以使用make
命令与olddefconfig
目标。具体来说,这是旧的默认配置。
这将采用“旧的配置文件”(当前保存为.config
,是你发行版配置的直接副本),并检查自那时以来Linux
代码库中是否添加了任何新的配置选项。如果发现任何新的、未配置的选项,将使用该选项的默认配置值,并更新.config
文件。
原始的.config
文件会被重命名为.config.old
作为备份,而新的更改会写入.config
文件。
make olddefconfig
输出结果如下:
$ file .config
.config: Linux make config build file, ASCII text
$ make olddefconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
HOSTCC scripts/kconfig/confdata.o
HOSTCC scripts/kconfig/expr.o
LEX scripts/kconfig/lexer.lex.c
YACC scripts/kconfig/parser.tab.[ch]
HOSTCC scripts/kconfig/lexer.lex.o
HOSTCC scripts/kconfig/menu.o
HOSTCC scripts/kconfig/parser.tab.o
HOSTCC scripts/kconfig/preprocess.o
HOSTCC scripts/kconfig/symbol.o
HOSTCC scripts/kconfig/util.o
HOSTLD scripts/kconfig/conf
.config:8593:warning: symbol value 'm' invalid for USB_FOTG210_HCD
.config:8859:warning: symbol value 'm' invalid for USB_FOTG210_UDC
#
# configuration written to .config
#
3.1.2对于Debian及其衍生版本的用户
Debian
及其衍生版本使用证书对内核模块进行签名。默认情况下,你的计算机上没有这个证书。
我建议禁用启用模块签名的选项。可以通过以下命令来实现:
./scripts/config --file .config --disable MODULE_SIG
如果不这样做,在后续构建Linux内核时将会失败。
3.2使用自定义配置
如果你学习构建 Linux 内核的目的是为了学习内核开发,那么这是你应该遵循的方法。
无法保证偏离你的 Linux 发行版的配置会在你的物理硬件上“正常”工作。问题可能从特定的硬件无法工作,到 Linux 内核根本无法启动。
因此,它仅推荐在虚拟机内部使用。
你可以查看 make help 的输出以查看所有可用选项,但我们将重点关注三个 make 目标:
defconfig:默认配置。 allmodconfig:基于当前系统状态,在可能的情况下将项目构建为可加载模块(而不是内置)。 tinyconfig:一个微小的 Linux 内核。
由于tinyconfig
目标只会构建少数几个项目,因此构建时间自然更快。我个人使用它的原因如下:
1)检查代码/工具链中所做的任何更改是否正确,以及代码是否编译通过。
2)在虚拟机中仅测试少数几个选定功能。
在为
ARM
或RISC-V
机器构建Linux
内核时,你很可能需要DTB
(设备树二进制文件)。tinyconfig
目标不会启用构建DTB
的选项,因此你的内核很可能无法启动。不过,你可以使用
QEMU
来启动Linux
内核而无需任何DTB
。
你应该使用 defconfig 目标,除非你确切知道自己在做什么。以下是在我的计算机上的样子:
$ make defconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
HOSTCC scripts/kconfig/confdata.o
HOSTCC scripts/kconfig/expr.o
LEX scripts/kconfig/lexer.lex.c
YACC scripts/kconfig/parser.tab.[ch]
HOSTCC scripts/kconfig/lexer.lex.o
HOSTCC scripts/kconfig/menu.o
HOSTCC scripts/kconfig/parser.tab.o
HOSTCC scripts/kconfig/preprocess.o
HOSTCC scripts/kconfig/symbol.o
HOSTCC scripts/kconfig/util.o
HOSTLD scripts/kconfig/conf
*** Default configuration is based on 'defconfig'
#
# configuration written to .config
#
3.3修改配置
使用某种方法创建了一个.config
文件。要么使用了Linux
发行版提供的文件并进行了更新,要么使用defconfig
目标创建了一个。
无论哪种方式,都在寻找如何修改它。最可靠的方法是通过menuconfig
或nconfig
目标。
这两个目标做同样的事情,但为你提供了不同的界面。这是它们之间唯一的区别。我更喜欢使用menuconfig
目标,但最近我倾向于使用nconfig
,因为它在搜索选项时更加直观。
首先,使用menuconfig
目标运行make
命令:
$ make menuconfig
HOSTCC scripts/kconfig/mconf.o
HOSTCC scripts/kconfig/lxdialog/checklist.o
HOSTCC scripts/kconfig/lxdialog/inputbox.o
HOSTCC scripts/kconfig/lxdialog/menubox.o
HOSTCC scripts/kconfig/lxdialog/textbox.o
HOSTCC scripts/kconfig/lxdialog/util.o
HOSTCC scripts/kconfig/lxdialog/yesno.o
HOSTLD scripts/kconfig/mconf
现在,在这里,根据类型修改配置选项以切换它们。
有两种可切换的选项类型:
布尔状态选项:只能关闭([ ])或打开([])的选项。 三态选项:可以关闭 (< >)
,或作为内置(<*>)
,或作为可加载模块构建(<M>)
的选项。
要了解有关某个选项的更多信息,请使用上下箭头键导航到该选项,然后按<TAB>
键,直到选中底部的<帮助>
选项。然后,按<Enter>
键进行选择。将显示有关该配置选项项的帮助菜单。
修改选项时请小心。
一旦你根据自己的意愿配置好它,请按<TAB>
键,直到选中底部的<保存>
选项。然后,按<Enter>
键进行选择。再次按<Enter>
键(不更改文件名)以将更新的配置保存到.config
文件中。
4.构建Linux内核
构建Linux
内核很简单。但在那之前,让我们为我们的自定义内核构建打上标签。我将使用字符串-pratham
作为标签,并利用LOCALVERSION
变量来实现这一点。这可以通过以下命令进行配置:
./scripts/config --file .config --set-str LOCALVERSION "-pratham"
这样做的作用是,在.config
文件中将CONFIG_LOCALVERSION
配置选项设置为最后指定的字符串,在我的情况下是-pratham
。
LOCALVERSION
选项用于设置一个“本地”版本,该版本将附加到通常的x.y.z版本控制方案中,并在你运行uname -r
命令时报告。
由于我构建的内核版本是6.5.5
,并且LOCALVERSION
字符串设置为-pratham
,因此对我来说,它将是6.5.5-pratham
。这样做是为了确保我构建的自定义内核不会与发行版提供的内核发生冲突。
现在,让我们构建内核本身。以下是执行此操作的命令:
make -j$(nproc) 2>&1 | tee log
这对于99%的用户来说已经足够了。
-j
选项用于指定应该创建多少个并行编译作业。nproc
命令返回一个数字,表示可用的处理单元数量(这包括线程)。因此,-j$(nproc)
的意思是“使用与我有多少个CPU线程一样多的并行编译作业”。
2>&1
会将标准输出(STDOUT
)和标准错误(STDERR
)重定向到同一个文件描述符,并将其通过管道传递给tee
命令,tee
命令会将输出存储在一个名为log
的文件中,并将相同的文本打印到控制台。这样,如果你遇到构建错误并希望回头查看日志以检查哪里出了问题,就可以简单地执行grep Error log
。
# 自定义“make”目标
你可以使用make
命令的一些自定义目标,在Linux
内核的源代码目录中执行各种操作。这些主要是为开发者提供参考。如果你的唯一目的是安装一个比你的发行版提供的更新的Linux内核,那么你可以跳过这一部分。
4.1构建目标
作为开发者,有时你可能只想构建Linux
内核本身,或者只构建模块,或者只构建设备树二进制文件(DTBs
)。在这种情况下,你可以指定一个构建目标,make
将只构建指定的部分,而不会构建其他任何内容。
构建目标如下:
vmlinux:裸的Linux内核 modules:可加载的模块 dtbs:设备树二进制文件(主要用于ARM和RISC-V架构) all:构建所有内容[即标记有星号 *
(来自make help
的输出)的内容]
一般来说,你不需要指定构建目标,因为它们应该会自动构建。这些是为那些只想在一个构建目标中测试某些内容,而不是在其他构建目标中测试的情况准备的。
根据你计算机的架构,构建的Linux
内核映像(存储在/boot
中)的名称将有所不同。
对于x86_64
架构,Linux
内核的[默认]映像名称是bzImage
。因此,如果你只想为了启动而构建Linux
内核,你可以将bzImage
指定为目标,如下所示:
## For x86_64
$ make bzImage
那么,在我的架构上,我如何找到要调用的make的目标名称呢?
有两种方法。你可以执行make help
并查找Architecture specific targets
下的第一个选项,该选项前面有一个星号*
。
或者,如果你想自动化这个过程,你可以使用image_name
目标来获取映像的完整(相对)路径。可选地,添加-s
标志以使输出更加有用。
以下是我拥有的三台计算机的输出,一台是x86_64
,另一台是AArch64
,第三台是riscv
:
## x86_64
$ make -s image_name
arch/x86/boot/bzImage
## AArch64
$ make -s image_name
arch/arm64/boot/Image.gz
## RISC-V
$ make -s image_name
arch/riscv/boot/Image.gz
现在,为了仅构建Linux
内核映像,你可以这样做:
make $(make -s image_name | awk -F '/' '{print $4}')
4.2清理目标
如果想要清理构建生成的文件,你可以使用以下任一目标来达到你的目的:
clean:删除除.config文件之外的所有内容 mrproper:执行make clean所做的所有操作,但也会删除.config文件 distclean:执行make mrproper所做的所有操作,但也会删除任何补丁文件
5.安装
一旦 Linux 内核编译完成,就该安装一些东西了。我们至少会构建两种不同的东西,如果你使用的是ARM或RISC-V架构,那么就是三种。
虽然我会告知你不同的安装方法,特别是关于更改默认安装路径的方法,但除非你知道自己在做什么,否则不建议这样做!
5.1安装内核模块
Linux
内核中有一些部分在启动过程中是不必要的。这些部分被构建为可加载模块(即在需要时加载和卸载)。
因此,让我们来安装这些模块。这可以通过modules_install
目标来实现。由于模块将被安装在/lib/modules/<kernel_release>-<localversion>
目录中,而该目录属于root
用户而非你的用户,因此使用sudo
是必要的。
这不仅会安装内核模块,还会对它们进行签名。因此,这需要一些时间。好消息是,你可以使用之前讨论过的-j$(nproc)
选项来并行处理这个过程;)
sudo make modules_install -j$(nproc)
给开发者的注意:你可以使用INSTALL_MOD_PATH
变量来指定Linux
模块存储的不同路径(而不是/lib/modules/<kernel_release>-<localversion>
),如下所示:
sudo make modules_install INSTALL_MOD_PATH=<path>
给开发者的另一个注意:你可以使用INSTALL_MOD_STRIP
变量来指定模块是否应该被去除调试符号。如果未定义,则不会去除调试符号。当设置为1
时,将使用--strip-debug
选项来去除调试符号,该选项随后被传递给strip
实用程序(如果使用Clang
,则为llvm-strip
)。
5.2[可选] 安装Linux内核头文件
如果你打算使用这个内核与树外模块(如ZFS
或Nvidia DKMS
)一起使用,或者尝试编写自己的模块,那么你很可能需要Linux
内核提供的头文件。
可以使用headers_install
目标来安装Linux
内核头文件,如下所示:
sudo make headers_install
使用sudo
是必要的,因为头文件被安装在/usr
目录中。子目录include/linux
也在/usr
内部创建,并且头文件被安装在/usr/include/linux
内部。
给开发者的注意:安装Linux
内核头文件的路径可以通过使用INSTALL_HDR_PATH
变量来覆盖。
5.3安装DTBs(仅适用于ARM和RISC-V)
如果你使用的是x86_64
,你可以跳过这一步!
如果你为ARM
或RISC-V
构建了内核,那么运行make
时很可能也构建了设备树二进制文件。你可以通过在以下位置检查.dtb
文件来确认这一点:arch/<machine_architecture>/boot/dts
.
我有一个检查这个的方法:
## For AArch32
$ find arch/arm/boot/dts -name "*.dtb" -type f | head -n 1 > /dev/null && echo "DTBs for ARM32 were built"
## For AArch64
$ find arch/arm64/boot/dts -name "*.dtb" -type f | head -n 1 > /dev/null && echo "DTBs for ARM64 were built"
## For RISC-V
$ find arch/riscv/boot/dts -name "*.dtb" -type f | head -n 1 > /dev/null && echo "DTBs for RISC-V were built"
如果你收到一条消息说“为<架构>构建了DTBs
”,那么继续安装DTBs
。这是通过dtbs_install
目标完成的。
由于这将安装在/boot/dtb-<kernel_release>-<localversion>
中,该目录归root
所有,因此必须使用sudo
。
sudo make dtbs_install
给开发者的注意:就像安装模块一样,你可以使用INSTALL_DTBS_PATH
变量指定设备树二进制文件安装的自定义路径。
5.4安装Linux内核
最后,我们要安装Linux
内核本身!这通过install
目标来完成,如下所示:
sudo make install
这里必须使用sudo,因为Linux内核安装在/boot目录中,而你的普通用户没有权限写入该目录。
一般来说,install
目标也会更新引导加载程序,但如果失败了,那就意味着你可能有一个不支持的引导加载程序。如果你没有使用GRUB
作为你的引导加载程序,请阅读你的引导加载程序的手册。
给开发者的注意:这次并不意外;INSTALL_PATH
变量用于指定Linux
内核的安装位置,而不是默认路径(即/boot)。
5.5对Arch Linux 用户
如果你尝试运行make install
命令,你可能会注意到出现了一个错误,如下所示:
$ sudo make install
INSTALL /boot
Cannot find LILO.
要在Arch Linux
上实际安装Linux
内核,我们需要手动复制Linux
内核映像。不用担心,如果你使用的是Arch Linux
,你可能已经习惯了手动操作。
这可以通过以下命令完成:
sudo install -Dm644 "$(make -s image_name)" /boot/vmlinuz-<kernel_release>-<localversion>
因为我编译的是6.5.5内核,所以我将运行以下命令,请根据你的需要进行调整:
sudo install -Dm644 "$(make -s image_name)" /boot/vmlinuz-6.5.5-pratham
这不是必需的,但你也应该复制一个名为System.map
的文件,并且当你做这件事时,也复制.config
文件。
sudo cp -vf System.map /boot/System.map-<kernel_release>-<localversion>
sudo cp -vf .config /boot/config-<kernel_release>-<localversion>
# 生成初始ramdisk
在安装Arch Linux
时,您可能已经遇到过一个名为mkinitcpio
的实用程序。我们将使用它来创建初始ramdisk
。
为此,我们首先需要预设。通过将以下内容添加到/etc/mkinitcpio.d/linux-<localversion>.preset
文件中来做到这一点。根据需要替换<kernel_release>
和<localversion>
。
ALL_config="/etc/mkinitcpio.conf"
ALL_kver="/boot/vmlinuz-<kernel_release>-<localversion>"
PRESETS=('default' 'fallback')
default_image="/boot/initramfs-<kernel_release>-<localversion>.img"
fallback_options="-S autodetect"
完成上述操作后,运行以下命令来生成初始ramdisk:
sudo mkinitcpio -p linux-<localversion>
以下是我电脑的输出结果,你的应该也类似!
$ sudo mkinitcpio -p linux-pratham
==> Building image from preset: /etc/mkinitcpio.d/linux-pratham.preset: 'default'
==> Using configuration file: '/etc/mkinitcpio.conf'
-> -k /boot/vmlinuz-6.5.5-pratham -c /etc/mkinitcpio.conf -g /boot/initramfs-6.5.5-pratham.img
==> Starting build: '6.5.5-pratham'
-> Running build hook: [base]
-> Running build hook: [udev]
-> Running build hook: [autodetect]
-> Running build hook: [modconf]
-> Running build hook: [kms]
-> Running build hook: [keyboard]
==> WARNING: Possibly missing firmware for module: 'xhci_pci'
-> Running build hook: [keymap]
-> Running build hook: [consolefont]
==> WARNING: consolefont: no font found in configuration
-> Running build hook: [block]
-> Running build hook: [filesystems]
-> Running build hook: [fsck]
==> Generating module dependencies
==> Creating zstd-compressed initcpio image: '/boot/initramfs-6.5.5-pratham.img'
==> Image generation successful
==> Building image from preset: /etc/mkinitcpio.d/linux-pratham.preset: 'fallback'
==> Using configuration file: '/etc/mkinitcpio.conf'
==> WARNING: No image or UKI specified. Skipping image 'fallback'
初始ramdisk
已生成。现在是时候更新引导加载程序了!
# 更新GRUB
一旦所有必要的文件都在它们通常的目的地中,现在就可以更新GRUB
了。
使用以下命令更新GRUB
引导加载程序:
sudo grub-mkconfig -o /boot/grub/grub.cfg
如果你使用的是不同的引导加载程序,请参考Arch Wiki中的文档。
更新GRUB
不会将较新的内核设置为默认。请在启动过程中从启动菜单中选择它。
你可以通过进入Arch Linux
的高级选项”菜单项,然后选择显示Arch Linux
,带Linux <kernel_release>-<localversion>”
的菜单项来选择较新版本的Linux
内核。
6.重启
这样,已经完成了获取 Linux 内核源代码、配置它、构建它以及安装它的所有步骤。现在是时候通过重启并进入新构建和安装的 Linux 内核来享受你的辛勤劳动成果了。
请确保从引导加载器中选择正确的 Linux 内核版本。一旦启动,运行 uname -r
命令来验证你确实是使用预期的 Linux 内核启动的。
下面是来自我的电脑的输出结果:
$ uname -r
6.5.5-pratham
7.卸载
你应该在删除当前内核版本之前先切换到一个较旧的内核版本。
要么是你的 Linux 发行版自带了你手动编译的 Linux 内核版本,要么是你自己编译了另一个更新的内核,并注意到应该卸载旧的内核以腾出空间给新的内核。
现在,你可能在想如何撤销这个操作。虽然没有 make uninstall
这样的命令可以直接运行,但这并不意味着一切都无望了!
我们知道所有的文件都安装在哪里,这使得卸载变得更加容易。
## Remove kernel modules
$ rm -rf /lib/modules/<kernel_release>-<localversion>
## Remove device-tree binaries
$ rm -rf /boot/dtb-<kernel_release>-<localversion>
## Remove the Linux kernel itself
$ rm -vf /boot/{config,System,vmlinuz}-<kernel_release>-<localversion>
8.结论
确实是一场冒险,但终于结束了。我们回顾了手动编译 Linux 内核所需的整个过程,包括安装依赖项、获取源代码、验证它、提取它、配置 Linux 内核、构建 Linux 内核,然后安装它。
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://hqyman.cn/post/7685.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~