逐步下载、配置、编译和安装 Linux 内核

最后更新: 17/12/2025
作者: 艾萨克
  • 编译自己的内核可以优化性能、安全性和支持。 硬件 调整模块、文件系统和特定选项。
  • 标准流程包括安装依赖项、从 kernel.org 下载源代码、重用当前配置以及使用 make menuconfig 或 xconfig 进行配置。
  • 为了确保系统正常运行,必须编译并安装内核和模块,正确生成 initramfs,并将新内核集成到 GRUB 中。 引导 清洗。
  • 维护旧内核并知道如何回滚或删除有问题的内核,是安全地在任何发行版上进行实验的关键。

Linux内核下载、编译和安装指南

编译内核 Linux 这是区分好奇用户和真正想要购买的用户之间的一项任务。 深入了解操作系统虽然日常使用 GNU/Linux 并不需要这样做,但它是更好地了解机器工作原理、充分利用硬件以及根据自己的喜好微调系统的绝佳方法。

本指南将一步一步地向您展示如何操作。 从头开始下载、配置、编译和安装 Linux 内核。 我们将介绍基于 Debian 的发行版(Debian、Ubuntu、Mint 及其衍生版本),以及适用于其他发行版系列(例如 Fedora 或 CentOS)的通用概念。我们还将探讨为什么要进行此操作、需要哪些工具、如何重用当前的内核配置、如何针对 Docker 或特定硬件调整选项,以及出现问题时如何回滚。

为什么你可能会对编译自己的内核感兴趣

在动手之前,务必先明确自己想要什么: 编译内核并非总是必要的。但这样做有几个令人信服的理由。

  • 性能和效率删除您从不使用的驱动程序和功能可以加快系统启动速度,减少内存使用量,并降低某些工作负载下的延迟。
  • 安全禁用不需要的功能或模块可以减少攻击面。在许多情况下,更精简的内核意味着更安全的内核。
  • 支持特定硬件有时你的发行版可能尚未包含所需的驱动程序,或者该驱动程序已被禁用;通过编译自己的内核,你可以解决这个问题。 激活硬件支持 (网卡、RAID、设备) 存储 不常见等等)。
  • 特殊功能您可以尝试使用新的任务调度程序、虚拟化特定功能、Docker、容器、BPF、io_uring 或任何其他默认情况下未启用的高级功能。
  • 学习与实验编译内核是一种非常直接的方法。 了解 GNU/Linux 系统的内部组织结构硬件如何初始化以及模块如何集成。

然而,对于只想打开电脑、浏览网页,而不太需要其他操作的家庭用户来说, 手动编译内核就像用大炮打苍蝇一样。这是一个漫长而精细的过程,在此过程中吃些东西也是正常的。 内核恐慌 在进行微调之前,如果你喜欢折腾,那就去做吧;否则,最好还是使用发行版的官方软件包。

Linux内核究竟是什么?

Linux内核是该系统的核心组件: 位于硬件和其余程序之间的软件它负责管理内存、进程、文件系统、输入/输出设备、网络、安全等等。

Linux 始于 1991 年 Linus Torvalds 的个人项目 创建一个自由内核。自那时起,它发展迅猛:如今,它拥有数千万行代码,由数千名开发者根据该许可证维护。 GPLv2我们通常称之为“Linux”的系统实际上是以下几种技术的组合: Linux 内核 + GNU 工具及其他组件 谁负责分发。

编译自定义内核时,你所做的就是生成一个二进制文件(通常是 /boot/vmlinuz-version加上一组模块 /lib/modules/版本以及诸如以下文件: 系统地图中, 配置 使用所用的配置和初始启动映像(initrd 或 initramfs).

编译内核所需的基本工具

要从源代码编译 Linux 内核,您需要一个完整的开发环境。在 Debian、Ubuntu 和 Mint 系统上,这通常涉及安装…… build-essential 以及许多其他库和实用程序.

许多经典指南推荐如下套装(您可以根据自己的布局进行调整。):

  • Debian/Ubuntu 中的最小集合 对于一个相对较新的内核:sudo apt-get install build-essential libncurses-dev bison flex libssl-dev libelf-dev libudev-dev libpci-dev libiberty-dev dkms openssl bc autoconf
  • Debian 打包环境 构建内核 .deb 软件包:sudo apt install autoconf automake autotools-dev bison build-essential dh-make debhelper debmake devscripts dpkg fakeroot file gfortran git gnupg fp-compiler lintian patch pbuilder perl quilt xutils-dev

在 Fedora、CentOS 及其衍生版本中方法略有不同,但思路不变: 安装一套开发工具 以及用于配置界面(文本和图形)的库。例如,以下是一些常用的库。 comandos 风格:

su -c 'yum groupinstall "Development Tools"'
su -c 'yum install ncurses-devel qt-devel unifdef'

如果没有这些依赖项,编译很快就会失败,所以…… 在下载源代码之前,必须准备好运行环境。.

哪里可以下载 Linux 内核源代码

获取内核代码的官方途径是 kernel.org从那里您可以选择主线版本、稳定版本和长期支持 (LTS) 版本。每个版本都有自己的文件夹和一个链接。 压缩包 比较。

  修复冻结笔记本电脑的键盘快捷键

一些例子 下载 经常看到的 教程如下:

  • 近期测试使用的稳定内核版本为 6.6:
    wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz
  • 内核 6.0.11(v6.x 分支):
    wget https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.0.11.tar.xz
  • 内核 5.10.13(v5.x 分支):
    wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.13.tar.xz

您也可以从以下位置下载字体: 您的发行版存储库例如,在 Debian/Ubuntu 系统中,存在这样的软件包。 linux-源代码:

sudo apt-get install linux-source

这将留下一个类型为的文件 linux-source-xxxtar.bz2 en / usr / src你可以用类似于解压 kernel.org tarball 的方式来解压它。

准备源代码树和磁盘空间

下载内核压缩包后,需要将其解压到某个位置。 足够的空间和书写权限虽然 /usr/src 是一个经典的目录路径,但你并非必须使用它。例如,你可以创建一个类似这样的目录: ~/下载/我的内核.

请记住,解压缩后,源文件树可能位于…… 1,5 GB在编译过程中,内容很容易跳到……之上。 7 GB所以要留出足够的容错空间。

一些 典型的减压示例 是:

  • 使用 tar.xz:
    tar avxf linux-6.6.tar.xz
  • 使用 tar.bz2:
    tar jxvf linux-2.6.36.tar.bz2 -C /usr/src
  • 使用 tar.gz:
    tar zxvf linux-x.x.x.x.tar.gz -C /usr/src

解压缩后,您将得到一个类似这样的目录。 linux-6.6 o linux-5.10.13您可以创建一个名为“通用符号链接”的符号链接。 Linux的 为了避免路线选择过于复杂:

cd /usr/src
sudo ln -s linux-6.0.11 linux

并非必须将来源放在…… / usr / src虽然很多导游这样做是出于传统。 在用户文件夹中进行编译和安装,过程是一样的。前提是您有足够的空间和相应的许可证。

重用当前内核配置

即使对于经验丰富的人来说,从头开始逐个选项地配置内核也是一项永无止境的任务。通常的做法是 重用您已在使用的内核配置 作为一个起点。

为此,首先需要知道 你加载的是哪个内核? 马上:

uname -r

结果大概是这样的 6.1.0-13-amd64 o 4.19.0-6-amd64有了这些信息,您就可以从……复制当前配置。 /启动 到新解压缩源文件的目录:

cd linux-6.6
cp /boot/config-$(uname -r) .config

那个文件 的.config 这将是内核构建系统用作基础的内核版本。在较新版本中,运行配置工具时,只会要求您提供以下信息: 之前内核中不存在的选项这样可以节省大量时间。

如何根据实际硬件调整设置

除了重用当前的 .config 文件之外,您还可以使用内核树本身提供的工具对其进行更精细的调整。其中一个特别有用的工具是 使localmodconfig它会尝试生成一个适合你当前已加载模块的配置。

在源代码目录中,只需运行:

make localmodconfig

此命令检查活动模块并 它会禁用系统中许多未使用的功能。如果您要为特定机器配置内核,这非常理想。如果您打算为其他机器或服务器编译通用内核,则需要在编译后仔细检查,以确保没有遗漏编译系统上不存在的硬件。

内核配置模式:文本和图形环境

内核配置可以通过多种方式完成。所有这些方式最终都会生成或修改该文件。 的.config但不同模式下的体验截然不同:

  • 生成配置完全基于文本的问卷调查,逐题进行。如今,这种方式仅在非常特殊的情况下才被认为实用;它是 缓慢、乏味且容易出错.
  • 制作menuconfig基于文本的菜单界面(ncurses),在服务器端或没有图形界面时非常常见。您可以使用方向键、Tab 键和空格键进行导航。
  • 制作 xconfig基于 Qt 的图形界面,鼠标操作舒适。非常适合在桌面环境下工作。
  • 制作 gconfig:基于 GTK 的图形界面,专为 GNOME 类环境设计。

在实践中, 制作menuconfig 它几乎是所有指南中的明星,因为它几乎适用于任何情况。从你复制的 .config 文件开始,你只需要执行以下操作:

make menuconfig

您会看到一个主菜单,其中包含“处理器类型和功能”、“设备驱动程序”、“文件系统”、“网络支持”、“虚拟化”等类别。在每个类别下,您都可以: 激活、停用或标记为模块 不同的选项。通常情况下:

  • [*] 意思是“内置的”。
  • [管理] 它表示“它被编译为可加载模块”。
  • [] 它已被“停用”。

其思路是将启动系统所需的功能(例如根磁盘支持)集成到内核中,并使用模块来实现其他功能。 不太重要的功能或并非总是使用的功能这样主内核就会更轻量级。

每个菜单项通常都有一个选项 帮助 这部分会详细说明其功能,有时还会提供默认建议。如果您对某些具体设置不确定,最好使用建议值或之前配置中已启用的值。

实用设置:文件系统、虚拟化和 Docker

内核定制的一个重要部分是选择合适的内核。 哪些文件系统、容器机制和网络选项? 你会需要它的。例如,如果你计划使用分区。 NTFS 要进行写入操作,您需要激活相应的支持(通常位于“文件系统 → DOS/FAT/EXFAT/NT 文件系统”中)。

  从 BIOS 提取 Windows 10 许可证的完整指南

如果您计划使用虚拟化或容器技术,那么有很多选项需要仔细研究。例如,对于 Docker 和 Docker Swarm,就有许多…… 命名空间、cgroups 和网络的功能 必须处于激活状态:

  • cgroup 层级结构。
  • CONFIG_NAMESPACES, CONFIG_NET_NS, CONFIG_PID_NS, CONFIG_IPC_NS, CONFIG_UTS_NS.
  • CONFIG_CGROUPS 以及诸如以下子选项: CONFIG_CGROUP_CPUACCT, CONFIG_CGROUP_DEVICE, CONFIG_CGROUP_FREEZER, CONFIG_CGROUP_SCHED, CONFIG_CPUSETS, CONFIG_MEMCG.
  • 关键支持(CONFIG_KEYS).
  • 网络选项,例如 CONFIG_VETH, CONFIG_BRIDGE, CONFIG_BRIDGE_NETFILTER, CONFIG_NF_NAT_IPV4, CONFIG_IP_NF_FILTER, CONFIG_IP_NF_TARGET_MASQUERADE, CONFIG_NETFILTER_XT_MATCH_ADDRTYPE, CONFIG_NETFILTER_XT_MATCH_CONNTRACK, CONFIG_NETFILTER_XT_MATCH_IPVS, CONFIG_IP_NF_NAT, CONFIG_NF_NAT, CONFIG_NF_NAT_NEEDED.
  • POSIX 队列支持(CONFIG_POSIX_MQUEUE).
  • 选项如 CONFIG_IPVLAN 适用于 Docker 使用的特定网络配置。

其中大部分功能都可以毫无问题地编译成模块,但是 建议查阅 Docker 文档或使用测试脚本。还有一些实用工具,例如 检查配置脚本 它会分析内核的 .config 文件,并告诉你为了完全兼容容器,还需要哪些内容。

基本原理如下:

chmod +x check-config.sh
./check-config.sh .config

输出结果会显示哪些选项正常,哪些选项缺失,哪些选项配置错误。如果发现任何关键选项被禁用,可以再次运行命令。 制作menuconfig o 制作 xconfig更正后,保存并重复验证。

最新内核版本中的一些有趣改进

除了自定义之外,许多人还会编译新版本的内核。 充分利用性能提升和新功能 仍然需要一些时间才能将软件包送达您的分发包中。

例如,在 拉玛二世 已提及的改进措施包括:

  • EXT4性能显著提升在某些并发写入负载下,增幅高达 34%。
  • GPU 支持方面的改进 NVIDIA公司 使用免费驱动程序 风格为 NVK(Vulkan)驱动程序做好准备。
  • 的选项 配置方面 BIOS 直接从 HP 设备通过 Linux 系统.
  • 混合处理器集群调度设置 英特尔 (阿尔德湖、猛禽湖及之后)。
  • 优化直接异步 I/O io_uring在某些测试中,性能提升了约 37%。
  • 一款新的任务规划工具 EEVDF(最早符合条件的虚拟截止日期优先)这样可以改善进程间的 CPU 分配。

现代版本都“开箱即用”了所有这些功能,但您的发行版可能需要一些时间来打包或启用它们,这就是为什么许多人会求助于…… 手动编译较新的内核.

编译内核:make、模块和编译线程

配置完成后,就可以开始利用CPU了。这时就需要用到命令了。 使 经典内核编译。编译时间可能从几分钟到一小时以上不等,具体取决于硬件和要生成的模块数量。

从本质上讲, 基本流程 在 Debian/Ubuntu(或其他发行版)中,通常是:

  • 编译内核(主镜像):
    make -j$(nproc)
    或者,如果您希望它只使用一个核心:
    make
  • 编译并安装模块:
    sudo make modules_install

选择 -j$(nproc) 它会指示 make 使用与 CPU 核心数相同的并行进程数,这在现代机器上可以节省大量时间。如果在编译过程中出现错误,您需要在错误发生的地方进行检查;错误可能是由于以下原因造成的: 该内核版本中存在缺失依赖项、配置冲突或特定错误。.

一些更高级的配方会用到 Debian 工具。 使用make-kpkg 和包装 内核包 将内核打包成 .deb 文件。这样,您就可以像安装其他软件包一样安装和卸载自定义内核,例如:

fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers
cd /usr/src
sudo dpkg -i *.deb

在这种情况下,也经常会遇到与以下方面相关的错误: 内核证书许多指南通过在 .config 文件中添加类似这样的行来禁用受信任的密钥,从而解决特定问题:

sed -i '/CONFIG_SYSTEM_TRUSTED_KEYS/s/^/#/g' .config

安装新编译的内核并更新引导加载程序

如果您不使用 .deb 打包方式,而是使用标准的内核树工具进行“裸机”安装,那么 安装直接从源目录进行。编译后最常见的顺序是:

  • 安装模块 (如果您还没有这样做的话):
    sudo make modules_install
  • 安装内核:
    sudo make install

内核自身的脚本系统将复制二进制文件。 图像 脚本会生成到 /boot 目录,同时生成的还有 System.map 和配置文件。在 Debian/Ubuntu 系统中,脚本通常会在以下位置触发: /etc/kernel/postinst.d 产生 初始化文件 并自动更新引导管理器(GRUB)。

即便如此,明确执行一下也绝无坏处:

sudo update-initramfs -u
sudo update-grub
sudo update-grub2

有了这个 确保初始启动映像已正确重新生成。 对于新内核版本,GRUB 会在其菜单中考虑这一点。在其他发行版中,例如一些基于 Red Hat 的发行版,也可以使用它。 mkinitrd o 德拉库特 虽然不是 update-initramfs,但目标是一样的: 创建一个适用于新内核的 initrd/initramfs 镜像.

initrd/initramfs 的作用及潜在问题

initrd 或 initramfs 是一个 在启动过程的早期阶段加载到内存中的文件系统映像它包含挂载实际根文件系统所需的最低驱动程序(例如,支持 / 分区所在的 SATA 或 NVMe 控制器)。

  我可以做什么来阻止访问 Facebook?如何取消 Facebook 上的访问限制?

如果您的 initrd 生成不正确或缺少必要的模块,内核将能够启动,但无法挂载。 / 最终你会得到一个 内核恐慌 抱怨说他找不到 文件系统。这是关键内核选项被禁用或版本变更后 initramfs 初始化失败时常见的错误。

在 Debian/Ubuntu 系统中,如今的参考命令是 更新 initramfs:

sudo update-initramfs -c -k x.x.x

参数 -c 创建一张新图像,并且 -k 指示确切的内核版本。在较旧的发行版(或使用不同的工具)中,它曾被使用。 mkinitrd 语法类似:

cd /boot
mkinitrd -o initrd.img-2.6.36 2.6.36

总之,如果在安装自定义内核后看到与 /lib/modules 或挂载根目录相关的错误, 首先,检查 initramfs/initrd 和 GRUB 配置。 在接触其他任何东西之前。

验证新内核是否正常工作。

所有程序都安装完毕,启动管理器也已更新,现在可以重启系统进行测试了。启动过程中, 监控 GRUB 和内核启动信息 如果模块、文件系统或无法识别的设备出现错误。

进入系统后,您可以使用以下命令查看您正在使用的内核版本:

uname -a

输出结果应反映出 新编译版本接下来,就是测试您常用的服务:Web 服务器, 数据库, 码头工人, 虚拟机桌面程序等等。如果一切运行正常,您可以将该内核保留为主内核,并将旧版本作为备份。

如何回滚到之前的内核版本并卸载新内核

如果出了什么问题(这种情况可能会发生,尤其是在最初几次),重要的是…… 不要恐慌只要你的 GRUB 列出了其他可用的内核,你就可以轻松恢复系统。

的过程 典型 将是:

  1. 重新启动系统。
  2. 在 GRUB 菜单中,使用箭头键移动并进入类型选择部分。 “高级选项……”.
  3. 选择一个你确定运行良好的旧内核版本。
  4. 使用该内核启动,进入系统后,删除有问题的内核。

如果您手动安装了内核,而没有使用 .deb 软件包,则卸载通常涉及以下几个方面: 删除 /boot 和 /lib/modules 目录下的对应文件。例如,要删除 6.6.0 版本,您可以这样做:

cd /boot
sudo rm config-6.6.0 initrd.img-6.6.0 System.map-6.6.0 vmlinuz-6.6.0

然后,删除它的模块:

cd /lib/modules
sudo rm -rf 6.6.0

完成后,更新 GRUB,使其菜单中不再包含该内核,然后重启:

sudo update-grub
sudo update-grub2
sudo reboot

如果安装的是 .deb 格式的内核包,那就更干净了。 使用方法与其他包装一样。 使用 apt 或 dpkg 卸载它,可以更好地控制系统状态。

其他发行版的注意事项:Fedora、CentOS 等

虽然本指南主要针对 Debian/Ubuntu/Mint,但其基本逻辑也适用于基于 Red Hat 的发行版,例如 Fedora 或 CentOS。具体有哪些不同之处? 软件包管理工具、一些依赖项名称以及如何访问启动管理器.

例如,在 Fedora/CentOS 系统中,从 kernel.org 编译内核的基本工作流程可能是:

  • 安装开发工具:
    su -c 'yum groupinstall "Development Tools"'
    su -c 'yum install ncurses-devel qt-devel unifdef'
  • 下载稳定版本(例如经典示例中的 2.6.36):
    cd /tmp
    wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.36.tar.bz2
  • 解压缩并准备源代码树:
    mkdir /usr/src/linux
    tar -xjvf linux-2.6.36.tar.bz2 -C /usr/src/linux
    cd /usr/src/linux
  • 使用 menuconfig、xconfig 或 gconfig 配置内核。
  • 编译并安装:
    make
    make modules
    make modules_install
    make install

然后您需要进行审核和编辑 /boot/grub/grub.conf (或等效文件,具体取决于您使用的是 GRUB Legacy、GRUB2 等)为新内核及其对应的 initrd 添加条目,务必仔细检查路径。 根= 如果使用 LVM,则需要引用逻辑卷。

编译、配置和安装自定义 Linux 内核是一个漫长但极具启发性的过程:它迫使你理解启动所需的模块、哪些选项对你的服务(例如 Docker 或虚拟化)至关重要、initramfs 和 GRUB 如何集成到启动过程中,以及如何始终保留回退选项以便在出现问题时恢复到之前的内核版本。如果你花时间仔细阅读每个部分,巧妙地复用当前的内核配置,并养成逐步测试更改的习惯,最终就能拥有一个真正强大的系统。 更加优化,更适合您的硬件,并符合您的实际需求 比大多数分布的通用核函数所提供的要好。