节省编译内核的时间

节省编译内核的时间

我必须演示一个实践,我必须制作自己的模块,将此模块添加到内核源代码并实现系统调用。我在 Ubuntu 上使用 3.16 内核,但从源代码安装内核大约需要 2 小时。

是否可以从源代码中删除内核的某些部分(例如不必要的驱动程序等)以节省时间,因为我不打算定期使用这个新安装的内核?如果是,怎么办?

答案1

正如评论中提到的,您应该使用类似make -j4.使用等于或略高于您拥有的 CPU 核心数量的数字。

进行本地修改配置

以下说明适用于从上游构建内核。我个人认为这最简单。我不知道如何获得应用了 ubuntu 补丁的树,准备像这样构建。

(1) 理论上,在更合理的时间跨度内构建内核进行测试的方式应该是

cp /boot/config-`uname -r` .config

你不需要启用任何更新的东西,所以 - 唯一的问题是如果他们重命名了东西就会中断:

make oldnoconfig

现在禁用当前未加载的所有模块。 (确保您已插入所需的所有 USB 设备...):

make localmodconfig

它最近对我有用,所以可能有用。上次我尝试的时候不太好。

我想我把它从大约一小时缩短到了十分钟。即使make localmodconfig它仍在构建大量我不需要的东西。 OTOH 实际上找到并禁用这些东西(例如在make xconfig)也需要一段时间(如果你错误地禁用了你想要的东西,甚至需要更长的时间)需要)。

我想知道它的存在是值得的,只是不能保证让你快乐。

(2) 我认为构建每个项目不应该花费两个小时修改到你的“模块”。 (如果您要实现新的系统调用,它实际上需要是内置函数)。 make只会重新编译修改后的文件并将其集成到内核二进制文件中。因此,如果正确设置 Kconfig 太麻烦,那么最初的两小时构建也许还不错。

如果您使用发行版内核源代码包进行构建,则可能会遇到此问题。 (您可以切换到手动构建,或者您可以欺骗发行版源代码包使用ccache)。或者,您的修改可能会修改头文件,不幸的是,该头文件被许多源文件包含。

即便如此,如果您想移植到不同的内核版本、执行git bisect、测试不同的构建选项等,那么制作自定义 Kconfig(例如更小的 Kconfig)可能会很有用。

答案2

如果您在同一台机器上重复构建内核,缓存可以提供很多帮助,尤其是当您使用虚拟机时。根据我的经验,在虚拟机上连续进行同一项目的干净构建所需的时间大约是不使用 ccache 的构建的一半。您将需要一些额外的磁盘空间来存储从第一次构建中保存的对象文件。此外,启用 ccache 的第一个构建在将所有对象文件写入~/.ccache文件夹时将花费稍长的时间(可能长 5-10%)。

我在构建机器的设置脚本中有类似这样的内容:

sudo apt-get install ccache
for binary in gcc g++ cc c++ i686-linux-gnu-g++ i686-linux-gnu-gcc x86_64-linux-gnu-gcc x86_64-linux-gnu-g++
do
    if [[ -e /usr/bin/$binary ]]
    then
        sudo ln --symbolic /usr/bin/ccache /usr/local/bin/$binary
        test $? -eq 0 || echo error: symlinking $binary to ccache
    fi
done
echo "If you have the space, you may want to increase your ccache size with \"ccache -s 5G\" (or however much space you can afford)"

相关内容