构建内核 rpm 包时
rpmbuild
是否很慢“检查未打包的文件”检查:
$ make -j$(nproc) binrpm-pkg
...
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/user/rpmbuild/BUI
LDROOT/kernel-4.17.0_rc5_next_20180517_3.gd86d9e8_default+-98.x86_64
对于内核,即使在功能强大的机器上也需要 30 分钟。如何避免这种情况? 我尝试用
_unpackaged_files_terminate_build
来避免它,但没有帮助:
echo "%_unpackaged_files_terminate_build 0" >> ~/.rpmmacros
还将
--nocheck
添加到 rpmbuild
对 binrpm-pkg
中的 scripts/package/Makefile
目标的调用也没有帮助。
但也许还有其他问题。当我使用配置构建时
make allyesconfig
rpm 文件有 168MB。使用 openSUSE Tumbleweed 配置构建的 RPM 文件有 647MB。
不幸的是,我很确定你无法阻止它。是在慢速行驶吗?您是否处于
/home/user
已联网的企业环境中?
您尝试更改的内容只是说“如果您发现我没有解释的文件,请将其设为警告而不是错误。”
遇到同样的问题并找出发生了什么。
如果你的 rpmbuild 处理速度很慢,它不是来自 /usr/lib/rpm/check-files 脚本:
尝试注释它的所有行,你会发现它仍然挂起,即使这个脚本基本上不再做任何事情。
执行中:
strace -f -s900 rpmbuild [your args]
您将看到在挂起之间,会发出 DNS 调用(调用 /usr/lib64/libresolv.so lib)尝试解析构建计算机的主机名,该调用在一段时间后超时,然后重试....
如果您的计算机的 DNS 配置有错误或者您的 DNS 服务器无法正常工作,则 rpmbuild 进程将在每次启动时挂起。
为了避免这些挂起:
剩下的真正问题是:
“为什么像 rpmbuild 这样的本地进程正在执行 DNS 调用?”....
为了将来参考,问题行位于构建 RPM 内的 buildHost(void) 中。
代码:
bhMacro = rpmExpand("%{?_buildhost}", NULL);
if (strcmp(bhMacro, "") != 0) {
rasprintf(&hostname, "%s", bhMacro);
} else {
hostname = rcalloc(NI_MAXHOST + 1, sizeof(*hostname));
if (gethostname(hostname, NI_MAXHOST) == 0) {
struct addrinfo *ai, hints;
memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_CANONNAME;
if (getaddrinfo(hostname, NULL, &hints, &ai) == 0) {
strcpy(hostname, ai->ai_canonname);
freeaddrinfo(ai);
} else {
rpmlog(RPMLOG_WARNING,
_("Could not canonicalize hostname: %s\n"), hostname);
}
}
如果您使用主机名定义 _buildhost,这将跳过 DNS 调用。
示例:
rpmbuild -bb --define "_buildhost $(hostname)" ./path/to/spec/file.spec
注意:安装仍将挂在“检查文件”部分,但它会在后台执行其他操作,并且 dns 调用本身将被跳过。