英语

编译内核的最低要求

简介

本文档旨在提供运行当前内核版本所需的最低软件级别的列表。

本文档最初基于我的 2.0.x 内核的“Changes”文件,因此与该文件一样,要感谢以下人员(Jared Mauch、Axel Boldt、Alessandro Sigala 以及遍布网络的无数其他用户)。

当前最低要求

在认为您遇到了错误之前,请**至少**升级到这些软件版本!如果您不确定当前运行的版本,建议的命令应该会告诉您。

再次说明,请记住,此列表假设您已经在功能上运行 Linux 内核。此外,并非所有工具在所有系统上都是必需的;显然,例如,如果您没有任何 PC 卡硬件,您可能无需关心 pcmciautils。

程序

最低版本

检查版本的命令

GNU C

5.1

gcc --version

Clang/LLVM(可选)

13.0.1

clang --version

Rust(可选)

1.78.0

rustc --version

bindgen(可选)

0.65.1

bindgen --version

GNU make

4.0

make --version

bash

4.2

bash --version

binutils

2.25

ld -v

flex

2.5.35

flex --version

bison

2.0

bison --version

pahole

1.16

pahole --version

util-linux

2.10o

mount --version

kmod

13

depmod -V

e2fsprogs

1.41.4

e2fsck -V

jfsutils

1.1.3

fsck.jfs -V

reiserfsprogs

3.6.3

reiserfsck -V

xfsprogs

2.6.0

xfs_db -V

squashfs-tools

4.0

mksquashfs -version

btrfs-progs

0.18

btrfs --version

pcmciautils

004

pccardctl -V

quota-tools

3.09

quota -V

PPP

2.4.0

pppd --version

nfs-utils

1.0.5

showmount --version

procps

3.2.0

ps --version

udev

081

udevd --version

grub

0.93

grub --version || grub-install --version

mcelog

0.6

mcelog --version

iptables

1.4.2

iptables -V

openssl & libcrypto

1.0.0

openssl version

bc

1.06.95

bc --version

Sphinx[1]

2.4.4

sphinx-build --version

cpio

任何

cpio --version

GNU tar

1.28

tar --version

gtags(可选)

6.6.5

gtags --version

mkimage(可选)

2017.01

mkimage --version

Python(可选)

3.5.x

python3 --version

GNU AWK(可选)

5.1.0

gawk --version

内核编译

GCC

gcc 版本要求可能因计算机中 CPU 的类型而异。

Clang/LLVM(可选)

(根据 releases.llvm.org)支持使用最新的 Clang 和 LLVM 工具正式版本来构建内核。不保证旧版本能够正常工作,我们可能会从内核中删除用于支持旧版本的工作区。请参阅关于使用 Clang/LLVM 构建 Linux的其他文档。

Rust(可选)

需要最新版本的 Rust 编译器。

请参阅 快速入门,了解如何满足 Rust 支持的构建要求。特别是,Makefile 目标 rustavailable 可用于检查为什么可能无法检测到 Rust 工具链。

bindgen(可选)

bindgen 用于生成 Rust 到内核 C 端的绑定。它依赖于 libclang

Make

您需要 GNU make 4.0 或更高版本才能构建内核。

Bash

一些 bash 脚本用于内核构建。需要 Bash 4.2 或更高版本。

Binutils

需要 Binutils 2.25 或更高版本才能构建内核。

pkg-config

自 4.18 起,构建系统需要 pkg-config 来检查已安装的 kconfig 工具并确定“make {g,x}config”中使用的标志设置。以前 pkg-config 已被使用,但未经过验证或记录。

Flex

自 Linux 4.16 起,构建系统在构建期间生成词法分析器。这需要 flex 2.5.35 或更高版本。

Bison

自 Linux 4.16 起,构建系统在构建期间生成解析器。这需要 bison 2.0 或更高版本。

pahole

自 Linux 5.2 起,如果选择了 CONFIG_DEBUG_INFO_BTF,构建系统会从 vmlinux 中的 DWARF 生成 BTF(BPF 类型格式),稍后也会从内核模块中生成。这需要 pahole v1.16 或更高版本。

它可以在“dwarves”或“pahole”发行包中找到,也可以从 https://fedorapeople.org/~acme/dwarves/ 中找到。

Perl

您需要 perl 5 和以下模块:Getopt::LongGetopt::StdFile::BasenameFile::Find 来构建内核。

BC

您需要 bc 来构建 3.10 及更高版本的内核

OpenSSL

模块签名和外部证书处理使用 OpenSSL 程序和加密库来执行密钥创建和签名生成。

如果启用了模块签名,则您需要 openssl 来构建 3.7 及更高版本的内核。您还需要 openssl 开发包来构建 4.3 及更高版本的内核。

Tar

如果您想通过 sysfs 启用对内核标头的访问 (CONFIG_IKHEADERS),则需要 GNU tar。

gtags / GNU GLOBAL(可选)

内核构建需要 GNU GLOBAL 6.6.5 或更高版本才能通过 make gtags 生成标签文件。这是因为它使用了 gtags -C (--directory) 标志。

mkimage

此工具在构建扁平映像树 (FIT) 时使用,通常在 ARM 平台上使用。该工具可通过 u-boot-tools 包获得,也可以从 U-Boot 源代码构建。请参阅 https://docs.u-boot.org/en/latest/build/tools.html#building-tools-for-linux 上的说明

GNU AWK

如果您希望内核构建为内置模块生成地址范围数据 (CONFIG_BUILTIN_MODULE_RANGES),则需要 GNU AWK。

系统实用程序

架构更改

DevFS 已被弃用,转而使用 udev (https://linuxkernel.org.cn/pub/linux/utils/kernel/hotplug/)

现在已支持 32 位 UID。尽情享受吧!

用于函数的 Linux 文档正在过渡到通过源代码中定义附近的特殊格式注释进行内联文档。这些注释可以与 Documentation/ 目录中的 ReST 文件组合,以生成丰富的文档,然后可以将其转换为 PostScript、HTML、LaTex、ePUB 和 PDF 文件。为了将 ReST 格式转换为您选择的格式,您需要 Sphinx。

Util-linux

新版本的 util-linux 提供了对更大磁盘的 fdisk 支持,支持新的挂载选项,识别更多支持的分区类型以及类似的优点。您可能需要升级。

Ksymoops

如果发生无法想象的事情并且您的内核出现 oops,您可能需要 ksymoops 工具来解码它,但在大多数情况下您不需要。通常最好使用 CONFIG_KALLSYMS 构建内核,以便它生成可读的转储,可以直接使用(这也会产生比 ksymoops 更好的输出)。如果由于某种原因您的内核不是使用 CONFIG_KALLSYMS 构建的,并且您无法使用该选项重建和重现 Oops,那么您仍然可以使用 ksymoops 解码该 Oops。

Mkinitrd

/lib/modules 文件树布局的这些更改也需要升级 mkinitrd。

E2fsprogs

e2fsprogs 的最新版本修复了 fsck 和 debugfs 中的多个错误。显然,升级是一个好主意。

JFSutils

jfsutils 软件包包含文件系统的实用程序。以下实用程序可用:

  • fsck.jfs - 启动事务日志的重放,并检查和修复 JFS 格式的分区。

  • mkfs.jfs - 创建 JFS 格式的分区。

  • 此软件包中还提供其他文件系统实用程序。

Reiserfsprogs

reiserfsprogs 软件包应用于 reiserfs-3.6.x (Linux 内核 2.4.x)。它是一个组合包,包含 mkreiserfsresize_reiserfsdebugreiserfsreiserfsck 的工作版本。这些实用程序可在 i386 和 alpha 平台上运行。

Xfsprogs

xfsprogs 的最新版本包含 mkfs.xfsxfs_dbxfs_repair 实用程序,以及其他用于 XFS 文件系统的实用程序。它与体系结构无关,从 2.0.0 开始的任何版本都应该可以与此版本的 XFS 内核代码(建议使用 2.6.0 或更高版本,因为有一些重大改进)正确运行。

PCMCIAutils

PCMCIAutils 取代了 pcmcia-cs。如果内核是模块化的并且使用了热插拔子系统,它会在系统启动时正确设置 PCMCIA 插槽,并为 16 位 PCMCIA 设备加载相应的模块。

Quota-tools

如果要使用较新的版本 2 配额格式,则需要支持 32 位 uid 和 gid。Quota-tools 版本 3.07 及更高版本具有此支持。请使用上面表格中推荐的版本或更新的版本。

Intel IA32 微代码

已添加一个驱动程序,允许更新 Intel IA32 微代码,可以作为普通的(misc)字符设备访问。如果您不使用 udev,则可能需要在您可以使用它之前以 root 身份执行以下操作:

mkdir /dev/cpu
mknod /dev/cpu/microcode c 10 184
chmod 0644 /dev/cpu/microcode

以 root 身份执行操作。您可能还需要获取用户空间的 microcode_ctl 实用程序来配合使用。

udev

udev 是一个用户空间应用程序,用于动态地用仅包含实际存在的设备的条目填充 /devudev 取代了 devfs 的基本功能,同时允许为设备提供持久设备命名。

FUSE

需要 libfuse 2.4.0 或更高版本。最低要求是 2.3.0,但挂载选项 direct_iokernel_cache 将不起作用。

网络

常规更改

如果您有高级网络配置需求,则应考虑使用 ip-route2 中的网络工具。

数据包过滤器/NAT

数据包过滤和 NAT 代码使用与以前的 2.4.x 内核系列相同的工具 (iptables)。它仍然包含用于 2.2.x 风格的 ipchains 和 2.0.x 风格的 ipfwadm 的向后兼容模块。

PPP

PPP 驱动程序已重组以支持多链路并使其能够在不同的媒体层上运行。如果您使用 PPP,请将 pppd 升级到至少 2.4.0。

如果您不使用 udev,则必须拥有设备文件 /dev/ppp,该文件可以通过以下方式创建:

mknod /dev/ppp c 108 0

以 root 身份执行。

NFS-utils

在较旧(2.4 及更早版本)的内核中,nfs 服务器需要了解任何希望通过 NFS 访问文件的客户端。当客户端挂载文件系统时,此信息将由 mountd 提供给内核,或者在系统启动时由 exportfs 提供。exportfs 将从 /var/lib/nfs/rmtab 中获取有关活动客户端的信息。

这种方法非常脆弱,因为它依赖于 rmtab 的正确性,而这并不总是那么容易,尤其是在尝试实现故障转移时。即使系统运行良好,rmtab 也会遭受大量从未删除的旧条目的困扰。

在现代内核中,我们可以选择让内核在收到来自未知主机的请求时通知 mountd,并且 mountd 可以将适当的导出信息提供给内核。这消除了对 rmtab 的依赖,并且意味着内核只需要知道当前活动的客户端。

要启用此新功能,您需要:

mount -t nfsd nfsd /proc/fs/nfsd

在运行 exportfs 或 mountd 之前执行。建议在可能的情况下,使用防火墙保护所有 NFS 服务免受整个互联网的攻击。

mcelog

在 x86 内核上,当启用 CONFIG_X86_MCE 时,需要 mcelog 实用程序来处理和记录机器检查事件。机器检查事件是 CPU 报告的错误。强烈建议对其进行处理。

内核文档

Sphinx

有关 Sphinx 要求的详细信息,请参阅 Sphinx 安装,位于 Documentation/doc-guide/sphinx.rst 中。

rustdoc

rustdoc 用于生成 Rust 代码的文档。有关更多信息,请参阅 通用信息

获取更新的软件

内核编译

gcc

Clang/LLVM

Rust

bindgen

Make

Bash

Binutils

Flex

Bison

OpenSSL

系统实用程序

Util-linux

Kmod

Ksymoops

Mkinitrd

E2fsprogs

JFSutils

Reiserfsprogs

Xfsprogs

Pcmciautils

Quota-tools

Intel P6 微代码

udev

FUSE

mcelog

cpio

网络

PPP

NFS-utils

Iptables

Ip-route2

OProfile

内核文档

Sphinx