it-swarm.cn

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

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

107
jjclarkson

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

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

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

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

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

问题在于认为,当一切都已经按照应有的方式工作时,编译自己的内核会有一些内在的好处,而我认为没有。尽管您可以花费无数小时来禁用不需要的内容并调整可调整的内容,但事实是,Linux内核已经针对most用户情况。

75
gabe.

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

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

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

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

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

36
miguel.de.icaza

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

30
Michael Mrozek

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

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

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

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

24
Eric

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

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

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

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

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

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

  • 禁用不需要的选项可以减少内核的内存占用,这在低RAM)环境中非常重要。当您使用256MB RAM路由器,这有帮助。

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

14
LawrenceC

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

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

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

7
camh

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

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

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

6
gvkv

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

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

3
jmtd

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

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

许多情况是有效的:

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

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

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

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

  5. 保持场景:-)

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

2
user4565

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

1
Caleb

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

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

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

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

1
SwanSword

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

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

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

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

1
Maciej Piechotka