You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 09:15:26