3

我的 deb 文件安装到 /opt/myCompany/myProgram,当我使用 dpkg -P myProgram 清除包时,所有内容都被删除了 - 甚至 /opt(如果我的包是 /opt 中唯一包含文件的包) - 如何避免删除 /在清除期间选择文件夹?

我尝试检查 postrm 中是否存在 /opt ,如果不存在则添加它,但不高兴......似乎在 postrm 脚本运行后删除了该文件夹。目前我正在使用 postinst 在 /opt 中添加一个隐藏文件——这会阻止 opt 被删除,但感觉很糟糕——应该有更好的方法。

谢谢,

4

2 回答 2

2

这个问题是大约 7 年前提出的,但我在谷歌搜索类似问题时偶然发现了它,并认为无论如何我都会发布一个答案,因为这个问题的答案并不是真正的解决方案。

以下问题也是相关的(但与 /usr/local 而不是 /opt 相关)并且可以类似地解决:

dpkg:警告:删除目录时 /usr/local 不为空,因此未删除

我能够使用以下技术解决此问题。

Debian 软件包 (.deb) 只是一个包含 3 个成员的“ar”归档文件:

$ ar t package.deb
debian-binary
control.tar.gz
data.tar.xz

data.tar.xz 成员可能被命名为 data.tar.gz,具体取决于 *.deb 的年龄。相应地调整命令。

安装到目标系统的文件包含在 data.tar.xz 成员中。如果您提取 data.tar.xz 成员并列出其内容,您将看到例如以下内容。

$ ar p package.deb data.tar.xz | unzx -c | tar t
./
./opt/
./opt/myCompany/
./opt/myCompany/myProgram

从 data.tar.xz 文件中删除 ./opt/ 目录成员(但不是其内容)将阻止 dpkg 在卸载软件包时尝试删除 /opt 目录。

$ ar x package.deb data.tar.xz
$ unzx data.tar.xz
$ tar --delete --occurrence -f data.tar ./opt/
$ #tar --delete --occurrence -f data.tar ./usr/local/

现在,如果您列出 data.tar 文件的内容,您应该会看到如下内容:

$ tar tf data.tar
./
./opt/myCompany/
./opt/myCompany/myProgram
  • 请注意 ./opt/ 成员已被删除。

最后一步是重新压缩data.tar文件,将deb中的data.tar.xz成员替换为修改后的成员。

这是从 tar 文件存档中删除 ./opt/ 条目并将 deb 中的 tar 文件存档替换为修改后的完整过程的一个示例:

$ ar x package.deb data.tar.xz
$ unzx data.tar.xz
$ tar --delete --occurrence -f data.tar ./opt/
$ xz data.tar
$ ar r package.deb data.tar.xz
$ rm data.tar.xz

现在,当 deb 从系统中删除/卸载时,dpkg 将不会尝试删除 /opt 目录。

于 2019-09-23T15:59:08.383 回答
1

那只是Debian。每当它从非 debian 标准目录(例如/opt在您的情况下)中删除软件包并且该目录中没有文件时,dpkg将尝试删除该目录。

如果在删除时还有其他文件/opt,您会在“/opt 不是空的;未删除”行中收到一条消息,仅此而已。

另一种“hacky”方法是添加重新创建 /opt in postrm,但它并不比隐藏文件更干净:)

于 2012-10-23T01:42:39.917 回答