CentOS 5.5 - 在 RPM 规范文件中创建符号链接

Posted

技术标签:

【中文标题】CentOS 5.5 - 在 RPM 规范文件中创建符号链接【英文标题】:CentOS 5.5 - symbolic link creation into RPM spec file 【发布时间】:2011-06-16 23:06:09 【问题描述】:

我需要在 RPM 文件中创建以下符号链接

/bin/ln -sf libcrypto.so.0.9.8e /lib/libcrypto.so.0.9.8
/bin/ln -sf libssl.so.0.9.8e /lib/libssl.so.0.9.8

在我的 RPM 规范文件中:

%files
%defattr(-,root,root)
/lib/libcrypto.so.0.9.8
/lib/libssl.so.0.9.8
<other files...>

%install
/bin/ln -sf libcrypto.so.0.9.8e /lib/libcrypto.so.0.9.8
/bin/ln -sf libssl.so.0.9.8e /lib/libssl.so.0.9.8

我的 PC 上存在 /lib/libcrypto.so.0.9.8e 和 /lib/libssl.so.0.9.8e,但是当我尝试安装 RPM 时,出现错误:

libcrypto.so.0.9.8 is needed by my-test-rpm-1.el5.i686
libssl.so.0.9.8 is needed by my-test-rpm-1.el5.i686

怎么了?作为 RPM 安装的一部分,我需要做什么才能创建符号链接?

谢谢

【问题讨论】:

【参考方案1】:

最好的方法是防止您创建的符号链接被自动依赖和需要生成器扫描:

%filter_provides_in libcrypto.so.0.9.8e
%filter_provides_in libssl.so.0.9.8e
%filter_requires_in libcrypto.so.0.9.8e
%filter_requires_in libssl.so.0.9.8e
%filter_setup

更多关于依赖/需要过滤here的信息。

【讨论】:

【参考方案2】:

1) 仅对于符号链接,您无需在后期调用 ldconfig。

2) 正如 ldav1s 所述:确保您的文件列在 %files 部分中。

3) 再次重申:确保您的文件已列出 - 尤其是如果您使用类似

%define _unpackaged_files_terminate_build 0

如果在 buildroot 中找到未在 %files 部分列出的文件,则 RHEL rpmbuild 会因错误而终止。通过这个定义,您可以关闭行为/错误,但您应该确切地知道您实际在做什么。如果您使用此行,则应将其从规范文件中删除。

4) 不要以 root 用户身份构建 rpm 包。如果您忘记使用 rpm_build_root,您将不会破坏您的实时系统。您的示例看起来像是取自 1997 年 Red Hat 4.2 的规范文件。由于 1997 年的 Red Hat 5(不是 RHEL 5!),rpm/rpmbuild 命令知道 RPM_BUILD_ROOT 定义。我猜这是您的问题:您不使用 buildroot,而是直接安装到根 FS 并以 root 用户身份运行 rpmbuild。

根据您的示例,它应该更改为:

%install
/bin/ln -sf libcrypto.so.0.9.8e $RPM_BUILD_ROOT/lib/libcrypto.so.0.9.8
/bin/ln -sf libssl.so.0.9.8e $RPM_BUILD_ROOT/lib/libssl.so.0.9.8

RPM docs 中描述了使用 buildroot。

【讨论】:

【参考方案3】:

作为解决方法,我通过添加禁用自动依赖处理:

AutoReqProv: no

到我的规范文件。 我仍在寻找真正的解决方案。

【讨论】:

【参考方案4】:

您需要在规范文件的 %post 部分运行 ldconfig:

%post
umask 007
/sbin/ldconfig > /dev/null 2>&1


%postun
umask 007
/sbin/ldconfig > /dev/null 2>&1

应该这样做。

【讨论】:

听起来像 /lib/libcrypto.so.0.9.8e 和 /lib/libssl.so.0.9.8e 不在 %files 列表中。此外,您对“ln”的调用也不会像“/bin/ln -sf /lib/libcrypto.so.0.9.8e /lib/libcrypto.so.0.9.8”那样引用它们。 /lib/libcrypto.so.0.9.8e 和 /lib/libssl.so.0.9.8e 是 openssl RPM 的一部分。 但是我的 RPM 正在安装的另一个二进制文件需要 /lib/libssl.so.0.9.8 和 /lib/libssl.so.0.9.8 而不是 /lib/libcrypto.so.0.9.8e和 /lib/libssl.so.0.9.8e

以上是关于CentOS 5.5 - 在 RPM 规范文件中创建符号链接的主要内容,如果未能解决你的问题,请参考以下文章

CentOS 6.5通过yum安装 MySQL-5.5

CentOS 6.*通过yum安装 MySQL-5.5

在 CentOS 6.2 中将 MySQL 版本从 5.1 更新到 5.5

Centos 5.5 上的 RabbitMQ 安装问题

centOS-5.5如何用命令行来安装软件包?

将规范文件转换为 debian