使用所有 RAM (8GB) 通过自定义配置构建 Linux?

使用所有 RAM (8GB) 通过自定义配置构建 Linux?

我正在尝试使用自定义配置编译主线 Linux 内核。这个!

在 64 位系统上运行。

在最后一步,链接内核时失败,因为出现 OOM(错误 137)。

[...]
  DESCEND objtool
  INSTALL libsubcmd_headers
  CALL    scripts/checksyscalls.sh
  LD      vmlinux.o
Killed
make[2]: *** [scripts/Makefile.vmlinux_o:61: vmlinux.o] Error 137
make[2]: *** Deleting file 'vmlinux.o'
[...]

ulimit -a说每个进程的内存是无限的。

我都试过了makemake -j1 make -j4没有任何区别。

使用 gcc 作为编译器而不是 clang 的结果相同。

有人知道为什么编译会消耗这么多内存吗?开发 Linux 的成本越来越高了:\

答案1

开发 Linux 的成本越来越高

恐怕一直如此。
32GB RAM 在内核开发桌面上很常见。然而他们中的一些人开始遇到ooms 在构建他们的 allyesconfig-ed 内核时。

幸运的是你…显然不是 allyesconfig-ing…你不应该需要超过 32G…;-)

顺便说一句,CONFIG_HAVE_OBJTOOL=y作为 .config 文件的一部分阅读,您可能会从作为上面链接的讨论的一部分提交的补丁中获益。


有人知道为什么编译会消耗这么多内存吗?

你可能是唯一能准确说出这一点的人。 (考虑到各种 *.o 文件的大小后,您可能能够在内核源代码分发的每个顶级目录中找到(因为编译已成功实现))

根据您提供的信息(kernel.config 文件),我只能大胆推测:

A/ 内核的每个组件都将被静态链接: (因为我注意到您选择的所有 OPTION_* 都标记为“=y”)
这本身没有任何问题,因为在内核中构建所有内容可能有很多充分的理由,但这肯定会显着增加链接所有内容时所需的 RAM这个一起。

=> 您可能应该考虑尽可能将内核部分构建为模块。

B/大量的CONFIG_调试出现设置。 再一次,这本身并没有什么问题,但是它可能会显着增加链接不同部分所需的 RAM,更不用说更多了,因为它意味着 CONFIG_KALLSYMS_*=y

顺便说一句,考虑到所选的调试功能,除了 CONFIG_HZ_100=y 之外,我还假设您不是在寻找最佳的延迟/性能。 => 然后我会考虑选择 CONFIG_CC_OPTIMIZE_FOR_SIZE

相关内容