【问题标题】:My deb file removes /opt我的 deb 文件删除 /opt
【发布时间】:2012-10-22 22:42:50
【问题描述】:

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

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

谢谢你,

【问题讨论】:

  • 那么,如果里面没有文件,为什么要删除 /opt?
  • @umlaeute 我想避免在使用 dpkg -P 删除 myProgram 时删除 /opt 文件夹。
  • 是的,我明白;但是,我想知道为什么您首先要这样做...也许您可以忍受debian处理(空)/ opt目录的方式...

标签: debian dpkg


【解决方案1】:

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

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

dpkg: warning: while removing directory /usr/local not empty so not removed

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

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 目录。

【讨论】:

    【解决方案2】:

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

    如果在删除时/opt 中还有其他文件,您会在“/opt is not empty; not removed”行中收到一条消息,仅此而已。

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

    【讨论】:

    • 感谢您的回复-您说-非debian标准目录(如/opt)-安装软件的debian标准目录是什么?我使用 /opt 是因为找到了 here 的信息。而且,我确实尝试在 postrm 中重新创建 /opt - 但删除发生在 postrm 运行之后。
    • 是的,FHS...FHS != Debian ;) Debian 希望一切都驻留在 /usr 下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多