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

评论

关于什么是好处的简单问题很快变得模糊不清或脱离上下文。最好提出这样的问题:编译自己的内核有什么优点和缺点?缺点=不容易,很多情况下没有增值。优点=安全性,性能,如果您知道自己在做什么,则可以使用NAS设备,例如使用Linux使某些硬件工作并具有联网和图形功能。

#1 楼

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

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

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

话虽这么说,编译特定的内核是有一些特定的原因的(正如其他答案中指出的那样)。通常,这些是出于您对特定结果的特定需求而产生的,例如:


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

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

评论


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

–桑迪
2010年8月20日在17:04

同意...这两个项目是针对此类事情而构建的。

– Gabe。
2010年8月20日在18:08

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

–rozcietrzewiacz
2011年8月1日18:14



@rozcietrzewiacz知识具有最大价值。编译内核可以帮助您扩展知识。如果您不购买,那么这就是-知识就是力量,人们付出高昂的金钱来获得权力,金钱在当今世界中具有价值,所以通过可转让财产....:P

–午餐
2011年9月2日19:38

我同意,仅对获得的知识值得。

–1100110
2012年1月25日上午11:07

#2 楼

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

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

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


修补错误或添加生产系统的一项特定功能,您不必冒着一次或两次修复整个内核的风险。
要试用特定的设备驱动程序或一项新功能
要扩展内核,进行测试
测试一些“ Alpha”模块或功能。

许多开发操作人员也可以使用它为需要特殊设备驱动程序或希望删除不需要的功能的嵌入式系统或机顶盒创建内核的自定义版本。

评论


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

–axel_c
10年8月20日在23:21

您应该添加二等分线来查找引入错误的位置...

– xenoterracide
10年8月22日在12:10

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

–埃里克
2010-09-30 18:24

有时以一种不会伤害任何人的方式违反规则是很好的。

–丹尼斯
20-2-14在11:55

#3 楼

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

评论


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

–桑迪
10年8月20日在17:02

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

–吉尔斯'所以-不再是邪恶的'
10年8月20日在19:22

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

–桑迪
10年8月20日在19:30

@Sandy Agreed,因为它看起来像我是这些n00bs之一:)。固定

– Michael Mrozek
10年8月20日在21:36

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

–卡莱布
2011年6月17日在21:03

#4 楼

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

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

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

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

评论


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

–安德烈斯·里奥弗里奥(Andres Riofrio)
2012年5月5日在2:31



那么,最好不要在原始问题中陈述这一点,然后接受您所指控的答案,这是不明智的。

–埃里克
2012年5月10日下午2:20

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

– Gabe。
2014年2月6日下午13:45

#5 楼

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


禁用模块加载的内核更加安全。这将需要您选择所需的模块,并将其作为内核的一部分包含在内,而不是将其作为模块进行编译。
禁用/ dev / kmem的支持,或使用适当的编译器选项对其进行破坏是对安全有好处。我认为大多数发行版现在默认情况下都会执行此操作。
我不希望在可能的情况下不使用initrd。对内核进行自定义以使其启动时所使用的硬件消除了initrd。
有时更高版本的内核将具有您所需的功能,但是今天这种情况很少见。我记得我刚开始使用Debian时使用的是2.4内核,但是我需要2.6内核来支持udev。
禁用不需要的网络协议/选项可以加快TCP / IP性能。 />禁用不需要的选项可以减少内核的内存占用,这在低RAM环境中很重要。当您将256MB RAM系统用作路由器时,这会有所帮助。
在通常只通过串行或ssh登录的系统上,我发现/ dev中所有“ tty”设备都令人烦恼。


评论


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

–美
2012年2月4日,0:58

#6 楼

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

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

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

#7 楼

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

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

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

#8 楼

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

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

#9 楼

该线程已经很老了,但是直到今天被问到时它仍然有效!

答案是:您可以根据需要和要求来编译自己选择的linux内核。 >
许多情况都有效:


您是一名工程师,需要您的构建才能满足系统的性能和安全性要求/需求,然后重新编译以满足和/或超出指定的标准。
您是普通用户,并且有一个想要长时间运行的旧系统,因此您可以重新编译以添加/删除组件以使您的旧系统保持最佳状态。
您是拥有最新最快硬件的普通用户,并且它具有足够的内存/ RAM。无需重新编译,但是如果您有兴趣了解更多有关系统的信息,您仍然可以。
您只想像Microsoft和/或Mac的日常用户一样,不要重新编译,只需进行更新即可请从上游发行版中获取。
请注意即将出现的情况:-)

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

#10 楼

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

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


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

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

#11 楼

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

#12 楼

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

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

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

然后您就可以得到相当快的速度!

#13 楼

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