`apt remove` 如何知道应该删除哪些文件?

`apt remove` 如何知道应该删除哪些文件?

我刚刚创建了一个小型 DEB 包,只是想看看它是如何工作的。我的文件结构如下:

~/temp/myapp_1.0                                                                                                                   
▶ tree          
.
├── DEBIAN
│   ├── control
│   └── postinst
└── usr
    └── bin
        ├── myapp
        ├── myapp.deps.json
        ├── myapp.dll
        ├── myapp.pdb
        └── myapp.runtimeconfig.json

基本上,我创建了一个 Hello-World dotnet 应用程序。我的control文件只是:

Package: myapp
Version: 1.0
Maintainer: marcin
Architecture: all
Description: demo

我的postinst是:

echo "echo (from postinst)"

我使用 创建了 DEB dpkg-deb --build myapp_1.0,然后使用sudo dpkg -i myapp_1.0.deb

我看到它/usr/bin如预期般包含了我应用程序的所有文件,并且该应用程序在使用时可以正常工作myapp

然后,我决定用 删除它sudo apt remove myapp。它从 中删除了应用程序的所有文件/usr/bin。我的问题是:它怎么知道哪些文件属于它?我以为它只会删除二进制文件/usr/bin/myapp,但它也删除了myapp.dll和所有其余文件。

是否总是apt remove something会完全删除程序(并且apt purge something还会删除所有配置)?它如何知道在哪里查找?它还会删除我的应用程序在运行时创建的文件吗?

答案1

它如何知道要删除哪些文件?“ 与” 完全相同的问题它如何知道要安装哪些文件?“您在包结构中向 apt/dpkg 提供了该信息。

为了满足 Debian 标准,运行时创建的文件必须通过 prerm 脚本删除幂等性apt install foo随后apt remove foo必须将系统恢复到安装之前的状态。

两个例外:

  1. /etc 中的文件是通过“purge”删除的,而不是通过“remove”删除的。
  2. apt/dpkg 永远不会删除 /home 中的文件。这些文件属于用户。

Apt/dpkg 没有任何设置可以只删除二进制文件并保留其他(非 /etc)文件。如果其他软件包依赖于某个库,则单独打包该库。

答案2

安装 deb 文件后,执行以下操作:

dpkg -L <packagename>

您将看到它列出了软件包的所有内容。这意味着系统知道软件包安装了哪些文件,因此知道要删除哪些文件。

此信息位于以下位置:

/var/lib/dpkg/info

对于每个包,都存在一个名为 packagename.list 的文件,其中包含与之前输出完全相同的信息dpkg -L

相关内容