编译Fedora 6.4.9内核时%config(noreplace)报错如何处理?
解决Fedora内核编译中
%config(noreplace)的“File not found”报错 问题根源
你在RPM spec文件的%files段中使用了%config(noreplace) /etc/modprobe.d/*-blacklist.conf,当BUILDROOT/etc/modprobe.d/目录下没有任何匹配*-blacklist.conf的文件时,rpmbuild会因为通配符未匹配到有效文件而抛出“File not found”错误——%config指令要求指定的文件必须在构建根目录中存在。
解决方案
1. 确保构建阶段生成/复制黑名单文件
最直接的解决方式是在spec文件的%install阶段,将内核对应的黑名单文件放入BUILDROOT的目标目录:
- 如果内核源码中自带blacklist配置文件,添加复制命令:
%install # 其他安装步骤... install -m 0644 ${KERNEL_SRC_DIR}/configs/my-kernel-blacklist.conf $RPM_BUILD_ROOT/etc/modprobe.d/ - 如果需要动态生成黑名单文件,可在
%install阶段通过脚本生成:%install # 其他安装步骤... cat > $RPM_BUILD_ROOT/etc/modprobe.d/kernel-6.4.9-blacklist.conf << EOF blacklist unwanted_module1 blacklist unwanted_module2 EOF chmod 0644 $RPM_BUILD_ROOT/etc/modprobe.d/kernel-6.4.9-blacklist.conf
2. 添加条件判断避免无文件时报错
如果无法保证构建时一定存在这类文件,可在spec中加入条件逻辑,仅当文件存在时才添加%config指令:
- 在
%install阶段末尾添加判断,设置条件宏:%install # 其他安装步骤... if ls $RPM_BUILD_ROOT/etc/modprobe.d/*-blacklist.conf 1>/dev/null 2>&1; then %global have_blacklist_files 1 fi - 在
%files段中使用条件包裹目标行:%files # 其他文件条目... %if 0%{?have_blacklist_files} %config(noreplace) /etc/modprobe.d/*-blacklist.conf %endif
3. 替换为目录级配置(可选)
如果只是需要确保/etc/modprobe.d/目录存在并保留用户配置,可改为指定目录(但注意这会打包目录下所有文件,需谨慎):
%config(noreplace) /etc/modprobe.d/
注意事项
- 优先采用第一种方案,明确控制打包的配置文件,避免通配符带来的不确定性;
- 使用rpm宏(如
%{_sysconfdir}替代/etc)可提升spec文件的兼容性;
内容的提问来源于stack exchange,提问作者user145453
相关产品推荐
相关产品推荐

