如何编译自己的Linux内核

在安装Gentoo的同时,为什么要这样做。在向您介绍这些步骤之前,下面简要概述一些重要概念。

什么是内核?

简而言之,它是操作系统的重要组成部分,如果没有的话最重要的操作系统负责通过允许程序访问您的硬件来让您的程序运行。但是,实际上是所有这些工作都由内核完成。

Linux内核的特殊之处在于,它可以根据您拥有的硬件进行定制。将此与Windows NT内核(在每台计算机上通常相同)进行对比。为此,内核必须经历一个称为编译的过程。

有关更多信息,请查看我们对Linux内核的介绍。

什么是编译?

不同的编译器用于转换不同的编程语言。例如, GCC 是将C代码转换为机器代码(以及其他代码)的编译器。但这还不是他们所做的全部–编译器还可以优化特定机器的翻译代码。除此之外,他们还可以同时删除程序中不需要的功能。

通常,许多软件已经完成了此过程。取而代之的是,人们下载转换后的 binary 指令,这些指令可以直接使用。例如,您当前正在运行的网络浏览器已被编译。这是因为编译某些内容可能会有些复杂且耗时。

简而言之,编译内核意味着将其代码转换为可以在计算机上实际运行的东西

获取内核源

没有燃料就无法生火。同样,如果您首先没有代码,则无法编译程序。对于大多数Linux操作系统,该方法通常是相同的,只有少数例外。他们中的许多人提供了自己的自定义内核源。如果可以,您应该尝试并使用它。例如,如果您使用的是基于Debian的操作系统(例如Ubuntu),则应使用以下命令安装源:

sudo apt-get updatesudo apt-get install linux-source

您还可以安装此版本的其他版本包(例如 linux-source-4.8.0 )。您将在 / usr / src / 目录中找到已安装的文件,因此请导航至该目录并查看其内容:

cd /usr/src/ls

您将看到一个以<结尾的文件strong> .tar.bz2 。这就是您将要使用的来源。使用以下命令将其解压缩:

sudo tar xjvf linux-source-4.4.0.tar.bz2

当然,请确保使用正确的名称替换文件。该文件将很大,因此该过程将花费一些时间!

如果愿意,您可以从Linux Kernel官方网站上获取源文件。仅当您的Linux操作系统不提供它们时,我才建议这样做。选择所需的版本并下载。如果您遵循此路线,则应将其下载到一个空文件夹中。这样,如果您将来希望编译更多的内核,则将有一个不错的文件夹以使它们井井有条。

已完成此操作,请使用以下命令提取文件:

tar xJvf linux-4.9.11.tar.xz

确保您使用的文件名与您下载的版本相匹配!

自定义内核

这是您可以选择内核中哪些部分的步骤想要摆脱。例如,内核附带了许多用于各种设备的不同驱动程序。如果不需要该支持,则将其删除会带来一些速度上的好处,同时内核也会更小。

在继续之前,您必须安装一些程序,这些程序可以让您自定义和编译它。

在基于Debian的系统上,您需要 build-essential 软件包,以及以下软件包:

sudo apt-get install build-essential gcc libncurses5-dev libssl-dev

The libncurses5-dev package will make it easier to configure the kernel, so make sure to install it. Other Linux operating systems will have a similar program, but this may be under a different name. For example, if you’re using Fedora , it’s called ncurses.

如果尚未安装,则还需要 GNU编译器集合(GCC)。这是负责将原始源代码转换为计算机可理解的内容的工具。也就是说,编译。

已经安装了这些程序,打开终端,以便您位于内部提取的Linux源文件夹。例如,如果您使用 linux-source 方法,则可以执行以下操作:

cd /usr/src/linux-source-4.4.0

在编译内核之前,您需要告诉GCC如何完成它。您可以使用名为 make 的命令行工具执行此操作。键入以下命令:

sudo make localmodconfig

这将创建一个名为 .config 的文件,该文件告诉GCC从内核源代码编译什么。 make localmodconfig 命令检测当前正在运行的内核组件,并将其标记为要编译。如果内核位于您拥有的文件夹中,则不需要sudo 即可正常工作。

您可能会遇到类似以下消息的消息。只需按 Enter 键即可跳过它们-它们通常只是内核的新功能。

但是,localmodconfig并不完美!如果您当前未使用计算机的某些部件,则可能无法检测到它支持的所有功能。因此,您需要手动启用它们。 或者,您可以完全跳过这一步,而使用下一个命令。这将使用与当前使用的选项相同的选项来编译新内核。

如果希望这样做,但是在之前使用了localmodconifg命令,请执行以下操作:

sudo make clean

这将为您提供一个干净的版本。如果您之前已经使用这些源编译了内核,那么也应该使用此命令。

在内核源文件夹中,有一个名为 .config 的文件。这就是GCC将用来选择要编译的内容的东西。您可以使用一些终端工具来代替手动编辑(不推荐),而不是手动编辑。这将使选择编译选项变得更加容易。

已完成此操作,请进一步对其进行微调:

sudo make nconfig

您会看到一个弹出的彩色菜单。这是内核配置菜单。要浏览,请使用箭头键。您可以按向右箭头键以展开条目,并在其旁边带有->符号。通过按向左箭头键浏览这些子菜单。

您可以切换具有<>的菜单项按下空格键即可在它们旁边显示[] 。这将循环显示不同的菜单选项。如果在其中看到 * M ,将编译该特定内核组件。它们之间的唯一区别是 M 选项将在需要时加载。例如,如果您要编译一个不经常使用的驱动程序,这将很有用。

如果您想进一步了解特定开关的功能,请按 F2 >在它上面。您会看到有关正在编译的内容的有用说明。

完成后,请按 F9 按钮保存并退出。

编译和安装内核

现在,您已经创建了一个自定义的make文件,您将需要编译内核。键入以下命令:

sudo make -j$(nproc --all)

如果您是从网上下载内核源代码的,则不需要sudo 。该命令的第二部分通过利用您所有的CPU内核来帮助加快内核编译时间。如果您想将计算机用于其他任务而不会打h,则可以摆脱这种情况,或将数字更改为其他名称(例如 -j2 )。 但是,这也会使编译速度变慢!

此过程可能而且将花费很长时间。您选择的编译次数越少,它就会越短。即使如此,您可能仍需要耐心等待。

然后,键入以下命令以完成内核的其余部分的编译:

sudo make modules_install

要实际使用此内核,您需要将需要输入以下命令:

sudo make install

这将自动将内核复制到您的 / boot 文件夹并生成适当的文件以使其正常工作。

使用GRUB切换内核

如果在安装新内核后重新启动,则您的系统可能无法工作!这通常是由于内核编译不正确(也就是说,对计算机的支持不够好)引起的。例如,我自己的笔记本电脑。万一发生这种情况,我建议编辑GRUB,以便可以切换回较早的内核。为此,请使用以下命令:

sudo nano /etc/default/grub

GRUB_HIDDEN_TIMEOUT GRUB_HIDDEN_TIMEOUT_QUIET 行的前面放置#号。然后,通过运行以下命令保存这些更改:

sudo grub-mkconfig -o /boot/grub/grub.cfg

现在,如果重新启动计算机,则在新内核无法正常工作的情况下,您可以切换到旧内核。只需转到高级选项菜单项,然后选择要引导的内核。如果一切顺利,那么恭喜!您将使用自己编译的内核。

您是否有兴趣编译更多内核?其他程序?您觉得它值得吗?

图片来源:chombosan / Shutterstock

标签: Linux