编译自己的 linux 内核有什么好处?

jjc*_*son 110 linux compiling kernel

自己编译 Linux 内核有什么好处?您可以通过将其定制为您的硬件来提高效率吗?

gab*_*be. 79

在我看来,编译自己的 linux 内核真正获得的唯一好处是:

您将学习如何编译自己的 linux 内核。

这不是您需要为更高的速度/内存/xxx做的事情。如果那是您觉得自己处于发展阶段,那么这是一件很有价值的事情。如果您想更深入地了解整个“开源”事物的含义,内核的不同部分是如何以及是什么,那么您应该试一试。如果您只是想将启动时间加快 3 秒,那么...有什么意义...去买一个 ssd。如果你很好奇,如果你想学习,那么编译你自己的内核是一个好主意,你可能会从中得到很多。

话虽如此,有一些特定的原因何时适合编译您自己的内核(正如一些人在其他答案中指出的那样)。通常,这些是由于您对特定结果的特定需求而产生的,例如:

  • 我需要让系统在资源有限的硬件上启动/运行
  • 我需要测试补丁并向开发人员提供反馈
  • 我需要禁用导致冲突的东西
  • 我需要开发linux内核
  • 我需要启用对我不受支持的硬件的支持
  • 我需要提高 x 的性能,因为我达到了系统的当前限制(而且我知道我在做什么)

问题在于,当一切都已经按照应有的方式工作时,编译自己的内核有一些内在的好处,而我认为没有。尽管您可以花费无数时间禁用不需要的东西并调整可调整的东西,但事实是 linux 内核已经针对大多数用户情况(通过您的发行版)进行了很好的调整。

  • 我认为,如果您只想为了学习体验而构建自己的内核,则可以使用基于源代码的 Linux 发行版(如 Gentoo 或 Linux From Scratch)来完成。Gentoo 第 2 阶段安装文档是了解从内核构建 Linux 意味着什么的极好指南。 (26认同)
  • @rozcietrzewiacz 知识具有最大的价值。编译内核可以帮助您扩展知识。如果你不相信这一点,那么这就是 - 知识就是力量,人们花很多钱来获得力量,而金钱在当今世界具有价值,因此通过传递性......:P (2认同)

mig*_*aza 37

大多数用户不需要编译自己的内核,他们的发行版已经为他们完成了这项工作。通常,发行版将包含一组补丁,以与发行版工作方式的某些部分、设备驱动程序的向后移植以及来自较新但未发布的内核版本或他们为用户开创的功能的修复程序集成。

当你编译你自己的内核时,你有几个选择,你可以编译一个官方的 Linus Torvalds 内核,这不会包括你的发行版添加的任何补丁或定制(可能是好的或坏的),或者你可以使用您的发行版重建工具来构建您自己的内核。

您可能想要重建内核的原因包括:

  • 修补错误或向生产系统添加特定功能,您不能真正冒险升级整个内核以进行一两个修复。
  • 试用特定的设备驱动程序或新功能
  • 要扩展内核,请对其进行处理
  • 测试一些“Alpha”模块或功能。

许多开发人员使用它来为嵌入式系统或机顶盒创建内核的自定义版本,在这些系统中他们需要特殊的设备驱动程序,或者他们想要删除他们不需要的功能。

  • +1。现在的孩子们,他们甚至不知道“make menuconfig”是什么意思,而且从来不必修补他们的内核网络代码以防止被脚本小子利用。幸运的是,那些日子已经一去不复返了。 (10认同)
  • 您应该添加`bisect`ing 以查找引入错误的位置... (2认同)

Mic*_*zek 30

自己编译内核允许你只包含与你的计算机相关的部分,这使得它更小并且可能更快,尤其是在启动时。通用内核需要包含对尽可能多的硬件的支持;在启动时,它们会检测哪些硬件连接到您的计算机并加载适当的模块,但是完成所有这些需要时间并且它们需要加载动态模块,而不是将代码直接烘焙到内核中。当你的计算机只有一个 CPU 时,没有理由让你的内核支持 400 个不同的 CPU,或者如果你没有一个支持蓝牙鼠标,这都是浪费空间,你可以释放

  • 我同意你的大部分答案,但我对“相当快”的一些确凿事实感到好奇。我不想给新用户留下这样的印象:使用手工构建的内核,他们的桌面通常会运行得更快(根据我对 Gentoo 的经验,这根本不是真的)。你能量化启动速度的提升吗? (15认同)
  • @Sandy 同意,因为看起来我是那些 n00bs 中的一员 :)。固定的 (3认同)
  • 这个答案在 15 年前是正确的,但现在已经不相关了。大多数驱动程序无论如何都是以模块形式出现的,因此它们只占用磁盘空间,而不占用内存空间。(或者某些发行版仍然没有 initrd 吗?没有 initrd 内核确实需要包含它可能需要启动的所有驱动程序。)至于启动时间,可以禁用花费超过一毫秒尝试检测不存在的硬件的少数驱动程序带有内核启动选项。 (2认同)
  • 我认为“相当”更快实际上是有道理的,因为我们正在谈论启动时间。库存发行版内核很容易多花 5 到 10 秒的时间来启动我为了不寻找我不打算使用的任何硬件而剥离的内核。运行时速度可能可以忽略不计,我实际上无法可靠地测量。 (2认同)

Eri*_*ric 24

我不敢相信这里接受的答案开始说“这不是你需要做的事情来提高速度/内存/xxx无论如何。”

这是完全错误的。我经常自定义构建我的内核,以删除不需要的代码以及包含主要与硬件相关的性能增强代码。例如,我运行一些较旧的硬件,并且可以通过在一些内置此功能的较旧 MoBo 上启用很少启用的内核驱动程序(例如 HPT36x 芯片组支持)来获得一些性能提升。

另一个例子,Slackware 下的 BIG SMP 是默认的,例如,在戴尔 2800 上,将消耗相当大的空间来运行 GFSD(不是作为内核模块)之类的东西,顺便说一下,它会消耗 CPU不需要。同样,对于 NFSD 和其他包罗万象的一切,如果您只是想在机器上安装 Linux 并运行,这很好,但如果您确实关心“速度/内存/xxx 随便什么”,那么这些事情很重要并且可以工作.

我所有的生产盒都是定制的内核。如果我使用的是通用硬件,例如戴尔系列(2800、2850、2900 等)硬件,只需将内核的 .config 文件复制到每个框并编译内核并安装即可。

  • 我认为公认答案的要点是,对于大多数硬件而言,通过编译自己的内核获得的性能不值得花时间学习如何去做(并了解选项的含义)。这可能是经验性的:在这方面找到一些数字会很棒。 (3认同)
  • 好吧,我的回答被接受了,这不是我的错。虽然在某些情况下编译内核将帮助您“获得一些性能”或在低功耗机器上启动并运行,但我假设最初的问题是由没有特定问题的人提出的需要提前,并且只是在一般意义上很好奇编译内核的好处是什么。我认为只有考虑到特定要求的人才能从内核调整中受益。由于我的答案被接受,我将对其进行改进以解决自定义内核的更多高级用户原因 (2认同)

Law*_*ceC 14

以下是编译您自己的内核对您有益的一些情况:

  • 禁用模块加载的内核更安全。这将要求您选择您知道需要的模块并将它们作为内核的一部分包含在内,而不是将它们编译为模块。

  • 禁用对 /dev/kmem 的支持,或使用适当的编译器选项削弱它对安全来说是一件好事。我认为大多数发行版现在默认这样做。

  • 如果可能,我不想使用 initrd。将您的内核定制为它启动的硬件可以消除 initrd。

  • 有时,更高的内核版本会提供您需要的功能,但今天这种情况非常罕见。我记得当我第一次开始使用 Debian 时,它使用的是 2.4 内核,但我需要 2.6 内核来支持 udev。

  • 禁用不需要的网络协议/选项可以加快 TCP/IP 性能。

  • 禁用不需要的选项会降低内核的内存占用,这在低 RAM 环境中很重要。当您使用 256MB RAM 系统作为路由器时,这会有所帮助。

  • 我发现 /dev 中的所有“tty”设备在我通常只通过串行或 ssh 登录的系统上都很烦人。


gvk*_*vkv 7

我第二个 gabe. 的回答(我的评论太长了,所以我发帖作为答案)。

除非你有一个高度专业化的目的(例如嵌入式机器、严格的安全分析),我认为编译你自己的内核除了看看它是如何完成的之外没有任何实际好处。通过有条不紊地查看选项,了解它们如何相互交互以构建系统是了解系统工作方式的好方法。当您尝试删除似乎对您要完成的任务没有任何用途的组件时,您会发现令人惊讶的结果。

但是请注意——为什么跳下兔子洞无疑是令人振奋的,它会比你想象的更多的夜晚和周末!


cam*_*amh 7

编译您自己的内核可以让您参与内核开发过程,无论是简单的事情,例如为现有驱动程序提供 PCI/USB 设备 ID 可能使新设备为您工作,还是深入参与内核的竞争内核开发。

它还允许您在硬件上测试开发内核,并在发现任何回归时提供反馈。如果您有一个不常见的硬件,这对您和其他人特别有帮助。如果您等待发行版内核,则问题报告中的修复程序可能需要一些时间才能过滤到新的发行版内核版本中。

我个人也喜欢编译我自己的内核以只支持我拥有的硬件。当您运行发行版内核并查看 的输出时lsmod(8),您会看到为您没有的硬件加载了许多模块。这会污染模块列表、/proc、/sys 和您的日志,这样当您搜索某些内容时,它可能会隐藏在噪音中;您也不能 100% 确定这些模块不会导致您尝试诊断的问题。