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


101

我自己编译一个Linux内核可以看到什么好处?通过对硬件进行自定义可以提高效率吗?


关于什么是好处的简单问题很快变得模糊不清或脱离了上下文。问What are the pros and cons of compiling your own kernel? Cons =不容易,很多情况下没有附加值,那会更好。优点=安全性,性能,例如,如果您知道自己在做什么,则使用Linux使NAS设备运行某些硬件并具有联网和图形功能。
罗恩

Answers:


73

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

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

这不是你的东西需要更多的速度/内存/ XXX不管做。如果那是您在开发中所处的阶段,那是一件很有价值的事情。如果您想更深入地了解整个“开源”的内容,以及内核不同部分的功能和方式,那么就应该尝试一下。如果您只是想将启动时间缩短3秒,那么...有什么意义...去购买固态硬盘。如果您很好奇,如果您想学习,那么编译自己的内核是一个好主意,您可能会从中学到很多。

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

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

问题在于认为,当一切都已经按应有的方式工作时,编译自己的内核会有一些内在的好处,而我认为没有。尽管您可以花费无数小时来禁用不需要的功能并调整可调整的功能,但事实是,Linux内核已经针对大多数用户情况进行了很好的调整(根据您的分布)。


25
我认为,如果您只是想为学习体验构建自己的内核,则可以使用基于源的Linux发行版(如Gentoo或Linux From Scratch)来实现。Gentoo第2阶段安装文档是很好的指南,可以帮助您理解从内核开始构建Linux的含义。
桑迪

同意...这两个项目是针对这种类型的项目而构建的。
gabe。

当然,您知道自己的答案实际上与自己矛盾。如果编译内核的唯一好处是学习如何做,那么它将毫无用处-没有价值。但是过了一会儿,你说这是一件很有价值的事情……
rozcietrzewiacz 2011年

@rozcietrzewiacz知识是最大的价值。编译内核可以帮助您扩展知识。如果您不购买,那么这就是-知识就是力量,人们付出
高昂的

我同意,仅对所获得的知识值得。
1100110 2012年

35

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

编译自己的内核时,有两种选择,您可以编译一个正式的Linus Torvalds内核,其中不包括发行版中添加的任何补丁程序或自定义项(可能是好是坏),或者您可以使用发行版重建工具来构建自己的内核。

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

  • 修补错误或向生产系统添加特定功能,在这些系统中,您实际上没有冒险为一个或两个修补程序升级整个内核。
  • 试用特定的设备驱动程序或新功能
  • 要扩展内核,请对其进行处理
  • 测试某些“ Alpha”模块或功能。

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


8
+1。如今的孩子们,他们甚至不知道'make menuconfig'是什么意思,并且从来不必修补内核网络代码以防止被脚本孩子伪装。幸运的是,那些日子已经一去不复返了。
axel_c

2
您应该添加bisecting来发现引入错误的地方...
xenoterracide 2010年

1
令人惊讶的是,与OP的问题无关时,该评论如何获得投票。“大多数用户不。。。”现在来。OP的问题很明确,就是想知道收益。而不是您对“大多数用户”在这里和那里所做的事情的看法。
埃里克(Eric)2010年

30

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


15
我同意您的大部分回答,但我对“相当快”的一些确凿的事实感到好奇。我不想给新用户一个印象,即他们的桌面在使用手工构建的内核时通常可以更快地运行(根据我对Gentoo的经验,这根本不是事实)。您可以量化启动速度的收益吗?
桑迪

2
这个答案在15年前是正确的,但如今已经不相关了。无论如何,大多数驱动程序都包含在模块中,因此它们仅占用磁盘空间,而不占用内存。(或者某些发行版本是否仍然没有initrd?没有initrd,内核确实需要包括它可能需要引导的所有驱动程序。)至于引导时间,可以禁用花费超过一毫秒的时间来检测不存在的硬件的少数驱动程序。带有内核启动选项。
吉尔斯

1
@Michael如果这是未经验证的假设,我认为您的答案中的“可能更快”替换为“可能更快”可能是个好主意...只是要确保不误导n00b。:-)
桑迪

3
@Sandy Agreed,因为看起来我是这些n00bs之一:)。已修正
Michael Mrozek

2
我认为“相当快”的速度实际上与我们所说的引导时间有关。普通发行版内核的启动时间很短,即5到10秒,而我已经精简了这些内核,以寻找不打算使用的硬件。运行时速度可能微不足道,实际上我无法可靠地进行测量。
Caleb

24

我不敢相信这里接受的答案会开始说:“这不是您需要做的,以提高速度/存储/ xxx。”

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

另一个示例是Slackware下的BIG SMP是默认设置,例如,在Dell 2800上,它将消耗大量的内存来运行GFSD(而不是作为内核模块)之类的东西,并且,顺便说一句,我消耗了CPU ticks不需要 同样,对于NFSD和其他所有方面来说,请取悦所有心态,如果您只是想使Linux装在盒子上并运行,但是如果您确实关心“速度/内存/ xxx等等”,那么这些事情就可以正常工作了。

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


3
我认为,可以接受的答案的重点是,对于大多数硬件而言,通过编译自己的内核获得的性能并不值得花时间去学习如何做(以及了解选项的含义)。那可能是经验性的:找到一些数字会很棒。
安德烈斯·里奥里夫里奥

那么,最好不要在原始问题中陈述这一点,然后接受您指控的答案,这是不明智的。
埃里克(Eric)2012年

2
好吧,我的回答被接受并不是我的错。是的,虽然在某些情况下编译内核可以帮助您“获得一定的性能”或在低功耗的计算机上运行,​​但我假设原始问题是由没有特定知识的人提出的需要提前进行,并且在一般意义上只是好奇编译内核的好处是什么。我认为只有那些有特定要求的人才能从内核调整中受益。由于我的回答被接受,我会改进,以解决更多的电力用户原因自定义内核
加布。

14

在某些情况下,编译自己的内核将使您受益:

  • 禁用模块加载的内核更加安全。这将要求您选择所需的模块,并将其包含在内核中,而不是将其编译为模块。

  • 为安全起见,禁用对/ dev / kmem的支持,或使用适当的编译器选项削弱它是一件好事。我认为大多数发行版现在都默认执行此操作。

  • 我宁愿尽可能不使用initrd。将内核自定义为其启动的硬件,从而消除了initrd。

  • 有时更高的内核版本将具有您需要的功能,但是今天这种情况很少见。我记得当我刚开始使用Debian时,它使用的是2.4内核,但是我需要2.6内核来支持udev。

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

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

  • 我发现/ dev中所有“ tty”设备都使我很烦,因为我通常只通过串行或ssh登录。


都没错 但是,删除模块加载可能会导致启动时出现问题:当今的大多数(如果不是全部)发行版都只是假设需要加载模块。上一次我关闭模块时,这导致在Red Hat引导过程中弹出一连串的错误消息。

7

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

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

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


6

我第二个gabe的答案(我的评论过长,因此我将其发布为答案)。

除非您有高度专门的用途(例如,嵌入式计算机,严格的安全配置文件),否则除了查看其工作方式之外,编译您自己的内核没有任何实际好处。通过有条不紊地查看这些选项,看看它们之间如何相互作用以构建系统,这是了解系统工作方式的绝佳方法。当您尝试删除似乎对您要完成的任务没有任何用途的组件时,发现的结果令人惊讶。

但是要当心-为什么跳下兔子洞无疑是令人振奋的,它会比您认为的更多地吸引夜晚和周末!


3

在工作中,我们使用手动滚动的内核来应用树外补丁,例如vserver和unionfs。

在家里,我正在编译手动滚动的内核,以查找哪个提交引入了我遇到的错误。完成此操作后,我可能会坚持使用手动滚动的内核,直到在我的发行版(Debian)中修复了该错误为止,此时,我将再次恢复其内核。


2

该线程已有很长的历史了,但今天仍然有效,就像提出问题时一样!

答案是:您可以根据需要和要求来编译自己选择的linux内核。

许多情况是有效的:

  1. 您是一名工程师,要求您的构建满足系统的性能和安全性要求/需求,然后重新编译以达到和/或超过指定的条件。

  2. 您是普通用户,并且有一个想要长期使用的旧系统,因此您可以重新编译以添加/删除组件,以使旧系统保持最佳状态。

  3. 您是拥有最新最快硬件的普通用户,并且它具有足够的内存/ RAM。无需重新编译,但是如果您有兴趣了解有关系统的更多信息,仍然可以。

  4. 您只想成为Microsoft和/或Mac的日常用户,不要重新编译,而只需要处理上游发行版中的更新。

  5. 保持场景:-)

与Mac / Windows用户不同,Linux提供了选择。轻松选择或根据您的需求优化系统的选择。


1

对于大多数用途,通用内核几乎适用于所有硬件。另外,它们通常包含特定于发行版的补丁,因此编译您自己的内核可能(可能)引起问题。

编译自己的内核的原因是:

  • 您正在使用基于源的发行版,因此没有“通用”内核
  • 您是内核开发人员,并且正在开发内核
  • 您必须为硬盘驱动器非常有限的嵌入式设备自定义内核
  • 某些驱动程序未编译(极少数情况)
  • 您想打补丁知道自己在做什么
  • 您想学习如何编译内核

如果我不使用基于源的发行版,那么我将根本不会编译内核。


1

除了这里提到的许多具有自定义编译内核的情况外,另一种情况是设置专用的网络引导环境,在该环境中模块加载是不可行的,您必须将完全工作的内核传递给特定任务的特定计算机。


1

我很惊讶没有人提到编译定制内核的原因:

因为您要使用其他C / c ++编译器。GCC非常适合编译Linux内核。但是那里有很多高级编译器!GCC的优化落后于英特尔的C / C ++编译器。英特尔还提供了性能基元库和vtune工具,这两者都是生产高性能linux内核必不可少的。到目前为止,您只能使用GCC和G ++。实际上,无论您做什么,结果都会受到编译器的限制。因此,我使用Intel编译器和性能库,下载量很大-1.5GB,但这使您对好的编译器中包含的所有内容有了一些了解。

英特尔的C / C ++编译器可免费用于非商业用途。但是,通过谷歌搜索非商业性许可英特尔c ++编译器下载页面来搜索英特尔网站会更容易。我通常不使用GCC / G ++做任何事情。而且您不需要成为程序员。您只需设置环境并在make文件中更改两行以指向Intel的编译器。

然后,您可以得到一些严重的速度!


-1

如果要在非常特定的硬件上安装Linux,比如说比DS更具异质性,则必须交叉编译自己的内核。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.