如何加速Linux内核编译?

35

我有一台配备Core i5处理器和8GB内存的电脑。 我安装了VMware Workstation 10.0.1. 在VMware中作为客户机操作系统,我安装了Fedora 20桌面版。

我正在开发Linux内核源代码v3.14.1的I/O调度程序。每次对代码进行修改后,编译并安装整个内核代码需要约1小时30分钟才能看到更改后的效果。

编译和安装命令: make menuconfig, make, make modules, make modules_install, make install

我的问题是,是否可能将1小时30分钟的时间缩短至只需10到15分钟?


2
有一个鲜为人知的 menu gconfig,与 make menuconfig 相比,它非常方便。 - Oleg Mikheev
1
我建议增加更多的RAM,这将使事情变得更快。如果你有超级快速的SSD(例如Intel Optane),差别不是很大。我建议内核开发人员至少使用16 GB,特别是如果你使用虚拟机。对我来说不清楚你是否在主机或虚拟客户端上编译代码,但无论哪台机器进行编译都需要有大量的RAM,以便始终将所有文件保存在RAM中。如果你有足够的资源,也应该学习一下distccccache - Mikko Rantalainen
1
还值得尝试的是:使用make localconfig而不是make menuconfig来最小化您正在构建的模块和功能的数量。 - Mikko Rantalainen
1
这是一篇文章,介绍了构建时间约为90秒而不是90分钟的方法:http://nickdesaulniers.github.io/blog/2018/06/02/speeding-up-linux-kernel-builds-with-ccache/ - 但该文章并未制作模块。 - Mikko Rantalainen
10个回答

29

不要在每次更改源代码时都执行make menuconfig命令,因为它会触发完整的编译过程,无论你的更改有多微小。只有当内核的配置选项发生更改时才需要执行此操作,而这在开发过程中应该很少发生。

只需执行:

make

或者如果你更喜欢并行编译:

make -j4

或者您想要的并发任务数。

然后,当然需要执行make install等操作来部署最近构建的二进制文件。

另一个技巧是将内核配置为测试所需的最小值。我发现对于许多任务,UML编译(User Mode Linux)是最快的。您可能也会发现使用make localmodconfig而不是make menuconfig更有用。


6
-j参数应该是核心数量的1.5倍。 - noɥʇʎԀʎzɐɹƆ
通常情况下,可以通过使用机器上的CPU核心数+1来获得最佳结果;例如,对于一个2核处理器,运行make -j3。 - debug
我通常使用 make -j$(( $(nproc) * 2 )) 命令,并将 CFLAGS 选项(如 mtune=native、march=native、O3、fno-plt、pipe 等)传递给内核,以使其更快。这已被证明可以产生更好的二进制文件。在我的英特尔 i3 Haswell 3.5 GHz 台式机处理器上,使用 GCC 10.2.0 进行编译需要约 1 小时。但对于 Xanmod 和 liquorix 内核,编译时间不少于 2 个半小时... - 15 Volts
@noɥʇʎԀʎzɐɹƆ 我不知道你是怎么得出那个乘数的,但它对我来说一直表现很好。 - Hritik

11
  1. 使用-j选项并行构建make
  2. 仅为目标架构编译,否则make将为每个列出的架构构建内核。

例如,不要运行:

make

运行:

make ARCH=<your architecture> -jN

其中 N 是您机器上的核心数量(cat /proc/cpuinfo 列出了核心数量)。例如,对于 i386 目标和主机机器,有 4 个核心(cat /proc/cpuinfo 的输出):

make ARCH=i386 -j4

同样地,您可以使用-jN标志运行其他make目标(modulesmodules_installinstall)。 注意: make会检查已修改的文件并只编译那些已被修改的文件,因此只有初始构建需要时间,后续构建将更快。

抱歉,我对内核方面还有些陌生,所以您能否详细解释一下“make ARCH=<your architecture> -jN”是什么意思?另外,您说得对,make只编译修改过的代码,这需要大约10分钟,但“make modules_install”命令需要大约45分钟来生成.ko文件。您有什么建议吗? - momersaleem
如果目标机器是i386,而你的机器有4个核心,那么你可以这样运行make命令:make ARCH=i386 -j4 - brokenfoot
3
make ARCH=$(arch) -j$(nproc)修改为通用命令。 - deadLock
ARCH=在这种情况下没有用处。请参见https://docs.kernel.org/kbuild/makefiles.html#kbuild-variables。只有在进行交叉编译时才有用。 - Yutsing

6

make -j将利用所有可用的CPU。


5
它会产生数百个编译器进程,导致系统冻结。 - Oleg Mikheev
2
@OlegMikheev之前的程序中没有看到这个,也许你可以指定一个作业计数限制,例如其他答案中建议的make -j 4 - Eric
1
关于原始答案:利用所有可用的CPU核心:make -j $(nproc) - garritfra
1
@garritfra 该手册表示:“如果未提供参数,则使用-j选项时,make不会限制可以同时运行的作业数。” 因此,我猜这意味着make会利用所有CPU。 - Eric
2
你说得对,它确实不会限制核心数量,这也意味着它会不断地生成进程,从而导致系统冻结。 - garritfra
@garritfra 我猜make会处理要运行的作业数量。而且操作系统本身有一个公平而智能的任务调度程序,所以即使没有-j选项,我认为也是安全的。 - Eric

4
您不需要每次更改时再运行make menuconfig —— 它只需要运行一次以创建内核.config文件。(或者如果您编辑Kconfig文件以添加或修改配置选项,可能需要再次运行,但这通常不会经常发生。)
只要你的.config没有被改动,运行make应该只重新编译您更改的文件。有一些文件必须每次编译,但绝大部分不用重新编译。

感谢您的评论。正如您所说,只需运行一次“make menuconfig”即可。这很好。显然,在代码更改后每次都会运行“make”命令。但是,是否有必要在代码更改后每次运行“make modules”,“make modules_install”和“make install”以查看我的更改? - momersaleem
1
make modules会编译模块,make modules_install会将模块安装到它们的默认目录 /lib/{你的内核版本名}/modulesmake install会“安装”新内核,也就是将压缩的内核映像与 System.map 和 .config 文件一起复制到默认位置,通常为 /boot/。回到你的问题,如果你修改了一些模块,那么确实需要进行这些步骤。由于你显然正在处理调度程序,所以不需要执行 make modules,因为它将不会做任何事情。 - AjB

3

ccache可以大大加快编译时间。它通过缓存以前的编译,并检测是否再次进行相同的编译,从而加速重新编译。使用ccache进行首次编译会比较慢,因为需要填充缓存,但是后续的构建应该会更快。

如果您不想麻烦地配置ccache,只需像这样运行它即可编译内核:

ccache make

有趣的是,我不知道可以这样使用ccache,而不是更常见的make CC='ccache gcc':https://dev59.com/e2HVa4cB1Zd3GeqPo6vS#52335011我在一个仅打印echo which $(CC)的最小示例上尝试了一下,它指向了/usr/bin/cc,所以似乎没有被使用。您能否提供一个最小的示例来证明这起作用,或者提供一些支持此方法的文档? - Ciro Santilli OurBigBook.com

1
也许除了之前的建议,使用ccache的时候,你可能希望取消设置CONFIG_GCC_PLUGINS(如果已经设置),否则你可能会遇到很多缓存未命中,就像this的例子所示。

这应该是一条注释,而不是一个答案。 - L_J
4
很抱歉,我不能在这个平台上翻译中文以外的语言。需要翻译的内容为:“@L_J I wish, but need 50 rep to comment :(” 我可以将其翻译为:“@L_J 我希望能够评论,但需要50声望值才能发表评论 :(” - user10239615

0

如果您有足够的RAM,并且在内核构建时不会使用您的计算机,您可以生成大量并发作业。但一定要确保您的RAM足够,否则您的系统将挂起和崩溃。


0

除了之前的建议,也许使用ccache软件(https://ccache.samba.org/)和在SSD驱动器上设置编译目录可以大幅减少编译时间。


0
使用以下命令:
sudo make -j 4 && sudo make modules_install -j 4 && sudo make install -j 4

这里的4是我分配给处理该进程的核心数量。

积分


-2

一个简单的技巧。如果你没有使用自己的机器或者有另一台机器,你可以完全注销并使用CTRL + ALT + F* 切换到TTY终端。这样一切都会快得多。


除非您的登录环境有一些过于苛刻的后台应用程序运行,或者您的内存非常小,否则这样做不会使任何东西“快得多”。 - Bracken
@Bracken gnome-shell是一个“要求很高的应用程序”。这就是为什么它能够正常工作,首先要检查它... - Max_Payne
Gnome Shell并不占用太多系统的CPU时间和内存,因此对编译时间几乎没有任何影响。如果你的Shell正在使用大量资源,那么要么你有问题,要么你的机器比树莓派还要弱。 - Bracken
@Bracken 先不要考虑 GNOME Shell。那只是一个例子,在普通桌面上运行它实际上是一个很耗费资源的应用程序。我谈论的是一般的注销,这将卸载许多应用程序和系统组件,并明显加快内核编译速度。祝你好运。 - Max_Payne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接