在RPM中创建符号链接

时间:2015-11-17 00:18:07

标签: linux puppet rpm

我在Linux上有一个特定版本的软件,我在rpm中打包一个.jar文件(用于升级现有软件),然后尝试重新创建一个符号链接以指向最新版本的jar 。我尝试使用%post%postun创建和删除符号链接(如果它已经存在),但这不起作用。我在互联网上看到了一些帖子,但它们没有用。

作为一种解决方法,我尝试在puppet中创建符号链接。为此,我使用了以下内容:

if $version == ‘1.1'  {
    file { '/usr/share/prog/software.jar':
    ensure  => 'symlink',
    target  => '/usr/share/prog/java/software-1.1-bin.jar',
}

但即使在这里,新版jar也会被创建,但不会创建符号链接。

如果有人以前解决了这个问题,请告诉我。

以下是我使用过的spec文件:

%define base_install_dir %{_datadir}/prog

Name:cdplayer
Version:1.1
Epoch:1
Release:2el6
Source:cdplayer-1.1-bin.jar
BuildArch:noarch
%description    
%prep
%install
%{__mkdir} -p %{buildroot}%{base_install_dir}
%{__install} -D -m 755 %{SOURCE0} %{buildroot}%{base_install_dir}

%post
ln -s -f /usr/share/prog/cdplayer-1.1-bin.jar /usr/share/prog/cdplayer.jar
%postun
%{__rm} -f /usr/share/prog/cdplayer.jar
%files
%defattr(-,root,root,-)
%dir %{base_install_dir}
%{base_install_dir}/*

%changelog

2 个答案:

答案 0 :(得分:4)

给定的规范文件会安装cdplayer-1.1-bin.jar,但会链接到cdplayer-1.1.jar。这是一个差异显示我为使其按预期工作所做的更改:

--- foo.spec.orig   2015-11-16 20:34:48.000000000 -0500
+++ foo.spec        2015-11-16 20:44:08.017874483 -0500
@@ -1,21 +1,25 @@
 %define base_install_dir %{_datadir}/prog

+Summary: sample rpm spec-file
+License: unknown
 Name:cdplayer
 Version:1.1
 Epoch:1
 Release:2el6
-Source:cdplayer-1.1-bin.jar
+Source:%{name}-%{version}-bin.jar
 BuildArch:noarch
+%global actual %{name}-%{version}.jar
+%global linked %{name}.jar
 %description    
 %prep
 %install
 %{__mkdir} -p %{buildroot}%{base_install_dir}
-%{__install} -D -m 755 %{SOURCE0} %{buildroot}%{base_install_dir}
+%{__install} -D -m 755 %{SOURCE0} %{buildroot}%{base_install_dir}/%{actual}

 %post
-ln -s -f /usr/share/prog/cdplayer-1.1.jar /usr/share/prog/cdplayer.jar
+ln -s -f %{base_install_dir}/%{actual} %{base_install_dir}/%{linked}
 %postun
-%{__rm} -f /usr/share/prog/cdplayer.jar
+%{__rm} -f %{base_install_dir}/%{linked}
 %files
 %defattr(-,root,root,-)
 %dir %{base_install_dir}

您的规范文件中有一些问题需要探索:

  • 处理升级的方式存在缺陷,如果您使用yum(例如,请参阅 Own RPM package: Make symlink survive update/freshen ),则会出现这种缺陷,该示例会在删除链接之前检查状态作为包升级与删除的副作用。)
  • 您正在使用需要谨慎的epoch标记,但该问题并未提供有关升级所使用的步骤的线索。
  • 如果您直接安装软件包,例如,只更改epoch值,您最终可能会获得同一软件包的多个副本。

-vrm命令中添加ln选项可以更清楚地显示安装程序包时的功能。

答案 1 :(得分:2)

您不应该在%post中创建符号链接。其中一个原因是这个符号链接然后被rpm包拥有而不是。 如果符号链接由rpm包拥有,则rpm会在升级过程中处理它。

请参阅: https://stackoverflow.com/a/32073947/3489429