自行编译 Linux 内核指南自行编译 Linux 内核指南自行编译 Linux 内核指南自行编译 Linux 内核指南
  • 业务
  • 目标
  • 支持
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容

自行编译 Linux 内核指南

发表 admin at 2025年2月28日
类别
  • 未分类
标签

亲自体验编译最新 Linux 内核的修补匠指南。

由于多种原因,您可能对自己编译 Linux 内核感兴趣。它可能是但不限于以下之一:

  • 尝试比您的 Linux 发行版提供的内核更新的内核

  • 使用一组不同的配置选项和/或驱动程序构建内核

  • 学习者的好奇心:)

本指南将向您展示如何使用应运行的命令自行编译 Linux 内核、为何运行这些命令并解释其作用。这是一篇很长的文章,所以请做好准备!

?
像 Ubuntu 这样的发行版有更简单的方法来安装主线 Linux 内核。但本教程是关于从源代码手动执行操作的。 学习本教程需要时间、耐心和良好的 Linux 命令行经验。这更多的是关于亲身体验事物。但是,我建议在虚拟机或备用系统上尝试此冒险,而不是在主系统上进行。

先决条件

构建任何东西(在软件方面)有两个先决条件。

  1. 源代码

  2. 构建依赖关系

因此,作为先决条件,我们将下载 Linux 内核的源代码作为 tarball 并安装一些依赖项,以便我们构建 Linux 内核。

Linux 版本入门

在特定时刻,Freax Linux 内核有 4 个“版本”。

这些 Linux“版本”按照开发流程的顺序是:

  1. linux-next 树:任何要合并到 Linux 代码库中的代码都会首先合并到 linux-next 树中。这是 Linux 内核的最新但也是“最不稳定”的状态。大多数 Linux 内核开发人员和测试人员都使用它来提炼代码质量,供 Linus 稍后使用。 小心行事!

  2. RC/Mainline 版本: Linus 从 linux-next 树中提取并创建一个初始版本。此版本的 Beta 版本称为 RC 版本(候选版本)。一旦 RC 发布,Linus 只接受错误修复和性能回归相关的补丁。 Linus 每周都会发布一个 RC 内核,直到他对代码感到满意(以及用户的反馈)。添加 -rc 后缀,后跟数字以指示 RC 发行版本。

  3. 稳定版本: 一旦 Linus 认为最后一个 RC 稳定,他就会发布最终的“公开”版本。稳定版本会再维持几周。这就是 Arch Linux 和 Fedora Linux 等前沿 Linux 发行版所使用的。 我建议您在 linux-next 或任何 RC 版本之前先尝试此操作。

  4. LTS 版本:给定年份的最后一个稳定版本会再保留几年。这通常是较旧的版本,但通过安全修复程序进行积极维护。 Debian 的稳定版本使用 Linux 内核的 LTS 版本。

您可以在官方文档中阅读更多相关信息。

出于本文的目的,我将使用可用的最新稳定版本。在撰写本文时,版本为 v6.5.5。

准备好系统

由于Linux内核是用C编程语言编写的,因此至少需要一个C编译器来编译Linux内核。您的计算机上可能存在也可能不存在其他此类依赖项。是时候安装它们了。

?
本指南将重点介绍使用 GNU C 编译器 (GCC) 编译 Linux 内核。但是也许在以后的文章中(深入研究Rust支持) ,我将介绍使用 LLVM 的 Clang 编译器作为 GCC 的替代品。

不,MSVC 不算在内。也就是说,我确实希望 Microsoft 员工为此发送补丁集。我做了什么?

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 并在页面上找到第一个稳定版本。你不能错过它,因为它是最大的黄色盒子;)

您可以通过单击黄色大框来下载 tarball。当您这样做时,也下载匹配的 PGP 签名文件。当我们稍后验证 tarball 时,这会很方便。它的扩展名为 .tar.sign。

验证 tarball 的真实性

您如何知道刚刚下载的 tarball 是否已损坏?在个人层面上,损坏的 tarball 只会浪费你宝贵的修补时间,但如果这是为一个组织完成的,你可能会让攻击者的事情变得更容易(此时你有更大的问题需要担心,但我们不要给给大家带来创伤后应激障碍!)。

为了验证 tarball 的完整性,我们需要 tarball。目前,它使用XZ压缩算法进行压缩。因此,我将使用 unxz 实用程序(只是 xz --decompress 的别名)来解压缩 .tar.xz 存档文件。

unxz --keep linux-*.tar.xz

提取后,我们将获取 Linus Torvalds 和 Greg KH 使用的 GPG 公钥。这些密钥用于对 tarball 进行签名。

gpg2 --locate-keys [email  [email 

您应该得到与我在机器上得到的输出类似的输出:

$ gpg2 --locate-keys [email  [email 
gpg: /home/pratham/.gnupg/trustdb.gpg: trustdb created
gpg: key 38DBBDC86092693E: public key "Greg Kroah-Hartman <[email >" imported
gpg: Total number processed: 1
gpg:               imported: 1
gpg: key 79BE3E4300411886: public key "Linus Torvalds <[email >" imported
gpg: Total number processed: 1
gpg:               imported: 1
pub   rsa4096 2011-09-23 [SC]
      647F28654894E3BD457199BE38DBBDC86092693E
uid           [ unknown] Greg Kroah-Hartman <[email >
sub   rsa4096 2011-09-23 [E]

pub   rsa2048 2011-09-20 [SC]
      ABAF11C65A2970B130ABE3C479BE3E4300411886
uid           [ unknown] Linus Torvalds <[email >
sub   rsa2048 2011-09-20 [E]

导入 Greg 和 Linus 的密钥后,可以使用 --verify 标志验证 tarball 的完整性;像这样:

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 <[email >" [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:良好签名!,否则请不要继续操作!

?
您可以安全地忽略以下警告:警告:此密钥未经可信签名认证!没有迹象表明该签名属于所有者。

我们从 Linus 和 Greg 的电子邮件中获取了密钥,无需担心此警告。

提取 tarball

如果您在这里,则意味着您的 tarball 的完整性检查已成功完成。现在,是时候从中提取 Linux 内核的源代码了。

这非常简单,只需在 tarball 上执行 tar -xf 即可,如下所示:

tar -xf linux-*.tar

-x 选项用于指定提取,并且 tar 使用 -f 选项获知 tarball 文件名。

提取需要几分钟,调整并坐直:)

配置Linux内核

Linux 内核的构建过程会查找 .config 文件。顾名思义,它是一个配置文件,指定 Linux 内核的每个可能的配置选项。有必要拥有一个。

有两种方法可以获取 Linux 内核的 .config 文件:

  1. 使用您的 Linux 发行版的配置作为基础(推荐)

  2. 使用默认的通用配置

?
还有第三种方法,您可以从头开始手动配置每个选项,但请注意,有 12,000 多个选项。不建议这样做,因为手动配置所有内容需要花费大量时间,并且需要足够的专业知识来了解启用和禁用哪些内容。

使用发行版提供的配置

使用 Linux 发行版提供的配置是一个安全的选择。如果您遵循本指南只是为了尝试除您的发行版提供的新内核之外的新内核,那么这是推荐的方法。

Linux 发行版的 Linux 内核配置文件将位于以下两个位置之一:

  • 大多数 Linux 发行版(例如 Debian 和 Fedora)及其衍生版本会将其存储为 /boot/config-$ (uname -r)。

  • 一些 Linux 发行版(例如 Arch Linux)已将其集成到 Linux 内核中。因此,它将在 /proc/config.gz 中提供。

?
如果您有两个目标可用,请优先使用 /proc/config.gz,因为它位于只读文件系统上,因此不会被篡改。

输入包含解压缩的 tarball 的目录。

cd linux-*/

然后,复制 Linux 发行版的配置文件:

## Debian and Fedora's derivatives:
$ cp /boot/config-"$(uname -r)" .config

## Arch Linux and its derivatives:
$ zcat /proc/config.gz > .config

更新配置

完成后,就可以“更新”配置文件了。您会看到,您的发行版提供的配置很可能比您正在构建的 Linux 内核更旧。

?
这也适用于像 Arch Linux 和 Fedora 这样的前沿 Linux 发行版。 他们都不会仅仅因为有更新而发布更新。有新版本可用。他们会进行一些质量检查,这肯定需要时间。因此,与您从 kernel.org 获得的内核相比,即使您的发行版提供的最新内核也会落后几个小版本。

要更新现有 .config 文件,可将 make 命令与目标 olddefconfig 结合使用。分解后,这是old default configuration。

这将采用“旧配置文件”(当前保存为 .config 作为发行版配置的文本副本)并检查此后添加到 Linux 代码库中的任何新配置选项。如果发现任何新的、未配置的选项,则使用该选项的默认配置值并更新 .config 文件。

当备份和新更改写入 .config 时,原始 .config 文件被重命名为 .config.old。

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
#

对于 Debian 及其衍生产品的用户

Debian 及其衍生版本使用证书来签署内核模块。默认情况下,您的计算机上不存在此证书。

我建议禁用启用模块签名的选项。可以通过以下命令来实现:

./scripts/config --file .config --disable MODULE_SIG

如果不这样做将导致稍后在构建 Linux 内核时出现构建失败。您已收到警告。

使用自定义配置

如果您为了学习内核开发而学习构建 Linux 内核,那么可以遵循以下方法。

?
无法保证偏离您的 Linux 发行版的配置能够在您的 上“正常”工作物理硬件。 问题可能包括特定硬件无法工作、Linux 内核根本无法启动等。

因此,建议仅在虚拟机内使用。

您可以查看 make help 的输出来查看所有可用选项,但我们将重点关注三个 make 目标:

  • defconfig:默认配置。

  • allmodconfig:根据当前系统状态,尽可能将项目构建为可加载模块(而不是内置模块)。

  • tinyconfig:一个微型 Linux 内核。

由于tinyconfig目标只会构建几个项目,因此构建时间自然会更快。我个人使用它的原因如下:

  1. 检查我在代码/工具链中所做的任何更改是否正确以及代码是否可以编译。

  2. 仅测试虚拟机内的一些选定功能。

?
当为 ARM 或 RISC-V 机器构建 Linux 内核时,您很可能需要 DTB(设备树二进制文件)。 tinyconfig 目标不会启用构建 DTB 的选项,并且您的内核很可能会从启动失败。

不过,您可以使用 QEMU无需任何 DTB 即可启动 Linux 内核。但本文不会重点讨论这一点。也许你应该发表评论并让我知道稍后会介绍它;)

除非您确切知道自己在做什么,否则应该使用 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
#

修改配置

您使用某种方法创建了一个 .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>)。

要了解有关选项的更多信息,请使用向上/向下箭头键导航到该选项,然后按 键,直到底部的 < Help > 选项出现已选择。然后,按键将其选中。将显示有关该配置选项项目的帮助菜单。

修改选项时请小心。

一旦您将其配置为您喜欢的内容,请按 键,直到选择底部的 < Save > 选项。然后,按键将其选中。再次按 键(不更改文件名)将更新的配置保存到 .config 文件中。

构建 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 和 STDIN 重定向到同一文件描述符,并通过管道传输到 tee 命令,该命令会将输出存储在名为 log 的文件中 并将相同的文本打印到控制台。这是为了防止您遇到构建错误并想回顾一下日志以检查出了什么问题。在这种情况下,您只需执行 grep Error log 即可。

定制“制作”目标

您可以将一些自定义目标与 make 命令一起使用,以在 Linux 内核的源目录中执行各种操作。这些仅供开发者参考。如果您的唯一目的是安装比您的发行版提供的内核更新的 Linux 内核,您可以跳过这一部分;)

建立目标

作为一名开发人员,有时您只想构建 Linux 内核,或者仅构建模块,或者仅构建 DTB。在这种情况下,您可以指定构建目标,并且 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 并在“架构特定目标”下查找前面有星号 * 的第一个选项。

或者,如果您想自动化它,您可以使用 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}')

清理目标

如果您想清理构建工件,可以使用以下任一目标来实现您想要的目标:

  • clean:删除除 .config 文件之外的几乎所有内容。

  • mrproper:make clean 所做的一切,但也删除 .config 文件。

  • distclean:make mrproper 所做的一切,但也删除所有补丁文件。

安装

Linux 内核编译完成后,就可以安装一些东西了。 “一些东西?”是的。我们至少构建 2 种不同的东西,如果您使用的是 ARM 或 RISC-V,则为 3 种。我将在我们继续进行时进行解释。

?
虽然我会告诉您不同的安装方法,尤其是更改默认安装路径,除非您知道自己是什么,否则不建议这样做做!请理解,如果您选择自定义路线,那么您就得靠自己了。这些默认值的存在是有原因的;)

安装内核模块

Linux 内核的某些部分在引导过程中不是必需的。这些部件被构建为可加载模块(即在必要时加载和卸载)。

那么,让我们安装这些模块。这可以通过 modules_install 目标来实现。 使用 sudo 是必要的,因为模块将安装在 /lib/modules/- 中,并且该目录是由 root 拥有,而不是您的用户。

这不仅会安装内核模块,还会对它们进行签名。所以这需要一些时间。好消息是,您可以使用前面讨论的 -j$ (nproc) 选项并行化此操作;)

sudo make modules_install -j$(nproc)

开发人员注意事项:您可以使用 指定存储 Linux 模块的不同路径(而不是 /lib/modules/-) >INSTALL_MOD_PATH 变量如下所示:

sudo make modules_install INSTALL_MOD_PATH=<path>

开发人员的另一条注意事项:您可以使用 INSTALL_MOD_STRIP 变量来指定模块是否应去除调试符号。调试符号如果未定义则不会被删除。当设置为 1 时,它们会使用 --strip-debug 选项进行剥离,然后将其传递给 strip (或 llvm-strip(如果使用 Clang)实用程序。

[可选]安装Linux内核头文件

如果您打算将此内核与树外模块(例如 ZFS 或 Nvidia DKMS)一起使用,或者尝试编写自己的模块,那么您很可能需要 Linux 内核提供的头文件。

可以使用 headers_install 目标安装 Linux 内核头文件,如下所示:

sudo make headers_install

使用 sudo 是必要的,因为标头安装在 /usr 目录中。子目录 include/linux 也在 /usr 内创建,标头安装在 /usr/include/linux 内。

开发人员注意事项:可以使用 INSTALL_HDR_PATH 变量覆盖安装 Linux 内核头文件的路径。

安装DTB(仅适用于ARM和RISC-V)

如果您使用的是 x86_64,则可以跳过此步骤!

如果您是为 ARM 或 RISC-V 构建的,则运行 make 很可能也会构建设备树二进制文件。您可以通过检查 arch//boot/dts 中的 .dtb 文件来进行检查。

我有一个 hack 来检查这个:

## 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"

如果您收到一条消息“已构建 的 DTB”,请继续安装 DTB。这是通过 dtbs_install 目标完成的。

使用 sudo 是必要的,因为它将安装在 /boot/dtb-- 中,其所有者为 <代码>根。

sudo make dtbs_install

开发人员注意事项:就像安装模块一样,您可以使用 INSTALL_DTBS_PATH 变量指定安装设备树二进制文件的自定义路径。

安装Linux内核

最后,我们正在安装 Linux 内核本身!这是通过 install 目标完成的,如下所示:

sudo make install

这里需要使用 sudo,因为 Linux 内核安装在 /boot 中,普通用户无权写入。

?
一般来说,install目标也会更新引导加载程序,但如果失败,则意味着您可能有一个不受支持的引导加载程序。如果您不使用 GRUB 作为引导加载程序,请阅读引导加载程序的手册;)

开发者注意事项: 这次并不奇怪; INSTALL_PATH 变量用于指定 Linux 内核的安装位置,而不是 /boot 中的默认路径。

对于 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-.preset 文件中来执行此操作。根据需要替换 和 <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 的高级选项”菜单项来选择较新版本的 Linux 内核,然后选择“Arch Linux,带有 Linux -”的菜单项。

重启

恭喜!您已经完成了获取 Linux 内核源代码、配置它、构建它和安装它的所有步骤。现在是时候通过重新启动并启动到新构建+安装的 Linux 内核来收获您辛勤工作的好处了。

请务必从引导加载程序中选择正确的 Linux 内核版本。启动后,运行 uname -r 命令来验证您是否使用预期的 Linux 内核进行启动。

以下是我的计算机的输出:

$ uname -r
6.5.5-pratham

派对时间! ?

卸载

?
您应该先切换到较旧的内核,然后再删除当前的内核版本。

您的 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>

结论

真是一次冒险,不是吗?但最终,还是得出了结论。我们已经了解了手动编译 Linux 内核的整个过程。它涉及安装依赖项、获取源代码、验证它、提取它、配置 Linux 内核、构建 Linux 内核,然后安装它。

如果您喜欢这个详细的分步指南,请发表评论并告诉我。如果您遇到任何问题,请发表评论并告诉我!

©2015-2025 Norria support@alaica.com