阻止 dpkg 在软件包升级时删除符号链接

阻止 dpkg 在软件包升级时删除符号链接

我有一个 debian 包,它将文件安装到/usr/local/java/jre/lib/ext,其中/usr/local/java是指向 jvm 实际安装位​​置的符号链接,在本例中是/usr/lib/jvm/java-6-sun

此软件包的新版本将 jar 安装在其他地方。问题是安装新版本会导致 dpkg 尝试自行清理,最终删除符号/usr/local/java链接。

这是一种非常令人不快的状态,即使是暂时的。

我一直无法找到 dpkg 的标志来说服它保留符号链接,并且似乎无法在符号链接上设置不可变位。

以下是 debian 打包配置的更改:

diff --git a/debian/dirs b/debian/dirs
--- a/debian/dirs
+++ b/debian/dirs
@@ -1 +1 @@
-usr/local/java/jre/lib/ext
+usr/share/java
diff --git a/debian/rules b/debian/rules
--- a/debian/rules
+++ b/debian/rules
@@ -30,7 +30,7 @@ install: build

        # Add here commands to install the package into debian/tmp.
        # $(MAKE) pure_install
-       cp thejar.jar $(TMP)/usr/local/java/jre/lib/ext
+       cp thejar.jar $(TMP)/usr/share/java

 # Build architecture-independent files here.
 binary-indep: build install

我想,保留usr/local/java/jre/lib/extdirs会产生预期的效果,但这只是将问题拖延下去——我宁愿这个包不负责维护符号链接。

那么:我有什么选择?

答案1

符号链接只是软件包安装的文件,因此适用正常行为。以下是我能想到的选项:

  • 将符号链接标记为配置文件。我不知道这是否受支持,但如果受支持,则只有在清除包时才应删除符号链接。
  • 不要将符号链接安装为文件,而是在 postinst 脚本中创建它。
  • 只需手动创建符号链接,而不是将其作为包的一部分。

请注意,卸载旧版本时,符号链接指向的任何内容都将被删除,因此我看不出这有什么好处。

答案2

当我尝试引导基于 Debian 的发行版时遇到了这个问题。

我已经/bin符号链接到usr/bin。安装 dash 后,我的/bin符号链接被替换为目录。

--keep-directory-symlink标志帮助我解决了这个问题。例如:

(cd /tmp; apt-get download dash)
dpkg-deb --fsys-tarfile /tmp/dash_*.deb | tar -x --keep-directory-symlink -C /chroot

答案3

如果您有 dpkg > 1.15.8,请尝试填充/etc/dpkg/dpkg.cfg.d/excludes

path-exclude=/usr/local/java/jre/lib/ext

来源:使用 dpkg 排除无用文件以节省磁盘空间 | Raphaël Hertzog

对于 Arch 用户,请使用NoExtract=in/etc/pacman.conf并从路径中排除前导斜杠。请参阅维基百科或者man pacman.conf

相关内容