自行编译 Linux 内核指南
亲自体验编译最新 Linux 内核的修补匠指南。
由于多种原因,您可能对自己编译 Linux 内核感兴趣。它可能是但不限于以下之一:
尝试比您的 Linux 发行版提供的内核更新的内核
使用一组不同的配置选项和/或驱动程序构建内核
学习者的好奇心:)
本指南将向您展示如何使用应运行的命令自行编译 Linux 内核、为何运行这些命令并解释其作用。这是一篇很长的文章,所以请做好准备!
先决条件
构建任何东西(在软件方面)有两个先决条件。
源代码
构建依赖关系
因此,作为先决条件,我们将下载 Linux 内核的源代码作为 tarball 并安装一些依赖项,以便我们构建 Linux 内核。
Linux 版本入门
在特定时刻,Freax Linux 内核有 4 个“版本”。
这些 Linux“版本”按照开发流程的顺序是:
linux-next
树:任何要合并到 Linux 代码库中的代码都会首先合并到linux-next
树中。这是 Linux 内核的最新但也是“最不稳定”的状态。大多数 Linux 内核开发人员和测试人员都使用它来提炼代码质量,供 Linus 稍后使用。 小心行事!RC/Mainline 版本: Linus 从
linux-next
树中提取并创建一个初始版本。此版本的 Beta 版本称为 RC 版本(候选版本)。一旦 RC 发布,Linus 只接受错误修复和性能回归相关的补丁。 Linus 每周都会发布一个 RC 内核,直到他对代码感到满意(以及用户的反馈)。添加-rc
后缀,后跟数字以指示 RC 发行版本。稳定版本: 一旦 Linus 认为最后一个 RC 稳定,他就会发布最终的“公开”版本。稳定版本会再维持几周。这就是 Arch Linux 和 Fedora Linux 等前沿 Linux 发行版所使用的。 我建议您在
linux-next
或任何 RC 版本之前先尝试此操作。LTS 版本:给定年份的最后一个稳定版本会再保留几年。这通常是较旧的版本,但通过安全修复程序进行积极维护。 Debian 的稳定版本使用 Linux 内核的 LTS 版本。
您可以在官方文档中阅读更多相关信息。
出于本文的目的,我将使用可用的最新稳定版本。在撰写本文时,版本为 v6.5.5。
准备好系统
由于Linux内核是用C编程语言编写的,因此至少需要一个C编译器来编译Linux内核。您的计算机上可能存在也可能不存在其他此类依赖项。是时候安装它们了。
不,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
文件:
使用您的 Linux 发行版的配置作为基础(推荐)
使用默认的通用配置
使用发行版提供的配置
使用 Linux 发行版提供的配置是一个安全的选择。如果您遵循本指南只是为了尝试除您的发行版提供的新内核之外的新内核,那么这是推荐的方法。
Linux 发行版的 Linux 内核配置文件将位于以下两个位置之一:
大多数 Linux 发行版(例如 Debian 和 Fedora)及其衍生版本会将其存储为
/boot/config-$ (uname -r)
。一些 Linux 发行版(例如 Arch Linux)已将其集成到 Linux 内核中。因此,它将在
/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 内核更旧。
要更新现有 .config
文件,可将 make
命令与目标 olddefconfig
结合使用。分解后,这是old
def
ault config
uration。
这将采用“旧配置文件”(当前保存为 .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 内核,那么可以遵循以下方法。
因此,建议仅在虚拟机内使用。
您可以查看 make help
的输出来查看所有可用选项,但我们将重点关注三个 make
目标:
defconfig
:默认配置。allmodconfig
:根据当前系统状态,尽可能将项目构建为可加载模块(而不是内置模块)。tinyconfig
:一个微型 Linux 内核。
由于tinyconfig
目标只会构建几个项目,因此构建时间自然会更快。我个人使用它的原因如下:
检查我在代码/工具链中所做的任何更改是否正确以及代码是否可以编译。
仅测试虚拟机内的一些选定功能。
不过,您可以使用 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/
中的 .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"
如果您收到一条消息“已构建
使用 sudo
是必要的,因为它将安装在 /boot/dtb-
中,其所有者为 <代码>根。
sudo make dtbs_install
开发人员注意事项:就像安装模块一样,您可以使用 INSTALL_DTBS_PATH
变量指定安装设备树二进制文件的自定义路径。
安装Linux内核
最后,我们正在安装 Linux 内核本身!这是通过 install
目标完成的,如下所示:
sudo make install
这里需要使用 sudo
,因为 Linux 内核安装在 /boot
中,普通用户无权写入。
开发者注意事项: 这次并不奇怪; 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-
文件中来执行此操作。根据需要替换
和 <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
更新 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 内核,然后安装它。
如果您喜欢这个详细的分步指南,请发表评论并告诉我。如果您遇到任何问题,请发表评论并告诉我!