理解为什么软件包要安装“dpkg --search”和“dpkg --listfiles ...”不知道的文件?

理解为什么软件包要安装“dpkg --search”和“dpkg --listfiles ...”不知道的文件?

我已通过 安装了一个特定程序apt。它源自第三方存储库,我 100% 确信该文件是通过apt其他路径安装和更新的(根据我下面列出的数据)

我已经删除了特定的包名称,因为我想知道(A)我是否dpkg --search正确理解了功能,以及(B)面对未知的文件dpkg,我如何确切地找出它来自哪里?

$ which -a foobaz
/usr/bin/foobaz
/bin/foobaz

这些是不同的但相同的:

  • 文件存在
  • 既不是符号链接(test -L $file失败)也不是硬链接(stat -c %h -- $file打印1
  • 有相同的ctimemtime
    • 请注意,该包最近已更新,所有时间对我来说看起来都是正确的。
  • 具有相同的sha1sum哈希值

但 dpkg 似乎只知道第一个?

$ dpkg --get-selections  | grep -i foobaz
foobaz              install

$ dpkg-query -S /usr/bin/foobaz 
foobaz: /usr/bin/foobaz
dpkg-query -S /bin/foobaz 
dpkg-query: no path found matching pattern /bin/foobaz

不应该dpkg -S <file>总是知道 debs/apt 添加的文件吗?当我知道某些“未知”文件的来源时,我应该如何处理这个问题来确定它们来自哪里充满信心它是用apt?安装的。

答案1

dpkg不会尝试解决links、bind-mounts 或任何其他此类文件/inodes/目录的“重复视图”,即使在同一个文件系统中也是如此。解决所有此类情况会很困难(不可能?),尤其是在一般情况下(多个文件系统,因为许多安装都使用多个文件系统)。它也可能更接近 Unix 哲学“做好一件事”。

在某些系统(包括最近的 Ubuntu)上,/bin是,这symlink意味着/usr/bin“搜索”的逻辑(例如which)将看到两个副本,但使用静态 ~manifests 的逻辑(例如dpkg)将只看到明确安装的文件。因为这是一个目录符号链接,它也是透明的/不能通过查看底层 inode 上的文件条目本身直接发现,必须检查所有父级。

相关内容