【问题标题】:Unexpected RPM conflict on %config(noreplace) files%config(noreplace) 文件上出现意外的 RPM 冲突
【发布时间】:2013-09-15 15:08:01
【问题描述】:

我正在使用 rpmbuild 创建自己的 RPM
我的 RPM包含配置文件,即使 RPM 包含这些配置文件的新版本,也不应被覆盖

为了存档,我用

标记了这些
%config(noreplace) /opt/mypackage/etc/*

在规范文件中。

根据文档和this site,在这种情况下,本地修改的文件永远不会被覆盖,这正是我想要的。

但是,在进行以下操作时:

  1. 安装 RPM 版本 1
  2. 更改配置文件etc/myconfig
  3. 使用 RPM 版本 2 更新软件包

我遇到了冲突:

$ rpm --prefix ~/rpmroot/ -ih dist/mypackage-1.0.1-1.x86_64.rpm
########################################### [100%]
file /home/user/rpmroot/mypackage/etc/myconfig from install of mypackage-1.0.2-1.x86_64 conflicts with file from package mypackage-1.0.1-1.x86_64

问题:

  • 如何解释这种冲突? (我希望新版本的配置文件将存储为 myconfig.rpmnew 并且现有的保持不变)
  • 我做错了什么?


更新(附加信息)

rpm -qcp dist/mypackage-1.0.1-1.x86_64.rpm 的输出为:

/opt/mypackage/etc/config1.xml
/opt/mypackage/etc/config2.xml
/opt/mypackage/etc/run.sh
/opt/mypackage/etc/config3.xml

完整的%files 部分:

%files
%defattr(0444,root,root)
/opt/mypackage/java/*

#dba
%defattr(0444,root,root)
/opt/mypackage/dba/sql/*
%defattr(0555,root,root)
/opt/mypackage/dba/script/*

#srv
%defattr(0555,root,root)
/opt/mypackage/srv/bin/*
/opt/mypackage/srv/lib/*

#etc
%defattr(0664,root,root)
%config(noreplace) /opt/mypackage/etc/*

【问题讨论】:

  • 奇怪的是“(noreplace)”功能没有记录在案......当你遇到麻烦说“%config”时,这几乎是我书中的预期行为......
  • 已记录,但不是很好:rpm.org/wiki/PackagerDocs/Spec(也可以查看非官方但有用的网站:www-uxsup.csx.cam.ac.uk/~jw35/docs/rpm_config.html
  • 是的,我看到了非官方的,这是我搜索中唯一出现的一个(以及你的问题)。昨晚是我们第一次尝试noreplace

标签: linux unix rpm rpmbuild rpm-spec


【解决方案1】:

如果这真的是你的问题,你可能会踢自己......

我认为这可能只是因为您是在“安装”而不是“升级” 将-ih 替换为-Uh

我创建了一个具有类似设置的测试 RPM,结果如下:

像你一样使用 -ih

$ sudo rpm --prefix ~/rpmroot/ -ih /home/nhed/rpmbuild/RPMS/x86_64/ptst-1.1.0-1.x86_64.rpm

#################################### [100%] 文件 /home/nhed/rpmroot/etc /a 来自安装 ptst-1.1.0-1.x86_64 冲突

包含来自包 ptst-1.0.0-1.x86_64 文件的文件 /home/nhed/rpmroot/etc/b 来自安装 ptst-1.1.0-1.x86_64 冲突 带有来自包 ptst-1.0.0-1.x86_64 文件的文件 /home/nhed/rpmroot/etc/c 来自安装 ptst-1.1.0-1.x86_64 冲突 带有来自包 ptst-1.0.0-1.x86_64 的文件

用 -Uh

$ sudo rpm --prefix ~/rpmroot/ -Uh /home/nhed/rpmbuild/RPMS/x86_64/ptst-1.1.0-1.x86_64.rpm

##################################### [100%]

警告:/home/nhed/rpmroot/etc/a 创建为 /home/nhed/rpmroot/etc/a.rpmnew

##################################### [100%]

【讨论】:

  • 如果您在/opt/mypackage/etc/ 下有大量文件,听起来您可以在 %install 规则(或更早)中创建一个“清单”文件,该文件将找到所有这些文件并在它们前面加上 @ 987654325@ 指令,然后将带有“-f”的清单传递给%files
  • 你说得对,%config 后面只能跟一个文件名,但我认为允许带通配符的文件名。否则,它们很可能不会被打包 - 或者我会收到错误消息。尽管如此,我尝试了这一点 - 它没有任何区别,冲突仍然存在。 (顺便说一句,docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/… 这本书还显示了带有通配符的 %config)
  • @MRalwasser 我们可以查看您的 %files 部分的其余部分吗?你也可以粘贴rpm -qcp dist/mypackage-1.0.1-1.x86_64.rpm的输出
  • @MRalwasser 非常着迷,我进行了测试并更新了我的答案
  • 哇,谢谢!这确实是问题所在。我认为 -i 是 -U 的同义词,以防软件包已经安装在旧版本中。从没想过这会导致这样的错误。您是如何在不知道我输入的内容的情况下发现此错误的?
猜你喜欢
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 2022-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
相关资源
最近更新 更多