我的deb文件安装到/ opt / myCompany / myProgram,当我用dpkg -P myProgram清除包时,一切都被删除 - 甚至/ opt(如果我的是唯一包含/ opt文件的包) - 我该如何避免在清除期间删除/ opt文件夹?
我已经尝试检查postrm中是否存在/ opt并添加它如果它没有但没有欢乐......似乎在运行postrm脚本后删除了该文件夹。目前我在/ opt中使用postinst添加一个隐藏文件 - 这会阻止删除,但感觉hackey - 应该有更好的方法。
谢谢,
答案 0 :(得分:1)
那只是debian。每当它从非debian标准目录(例如你的/opt
)中删除一个包时,该目录中没有文件,dpkg
将尝试删除该目录。
如果删除时/opt
中有其他文件,则会收到“/ opt不为空;未删除”的消息,就是这样。
另一种“hacky”方式是在postrm
中添加/ opt的重新创建,但它并不比隐藏文件更清晰:)
答案 1 :(得分:0)
这个问题大约在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
根据* .deb的使用期限,data.tar.xz成员可能会被命名为data.tar.gz。相应地调整命令。
已安装到目标系统的文件包含在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
最后一步是重新压缩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目录。