在 Ubuntu 中查找使用给定文件的所有软件包?

在 Ubuntu 中查找使用给定文件的所有软件包?

我想列出使用给定文件的所有软件包。我愿意使用任何工具(例如 dpkg、dlocate、apt-file 等),请注意,当我说“使用”时,我并不一定意味着只拥有/安装该文件,我想知道哪些软件包也引用它、链接到它等。

这是我的用例:

我已经安装了 KVM 和 VirtualBox,但最终只使用了 VirtualBox,事实证明 VirtualBox 和 KVM 会争夺某种资源,幸运的是我并不使用 KVM,所以我只是卸载了它。

通过发布:

sudo apt-get purge kvm

但这还不够,当我尝试在后续启动中运行 VirtualBox 时出现以下错误:

错误:无法启动机器。错误消息:VirtualBox 无法在 VMX 根模式下运行。请禁用 KVM 内核扩展,重新编译内核并重新启动 (VERR_VMX_IN_VMX_ROOT_MODE)

查看已加载的模块发现 kvm 内核模块仍然已加载

mcradle:~> lsmod | grep -i kvm
kvm_intel              39416  0
kvm                   244969  1 kvm_intel

调整网络搜索,建议清除 qemu-kvm

sudo apt-get purge qemu-kvm

这个方法奏效了,现在我的问题是:如果没有 web-magic-dust,我怎么能系统地得出这个结论?特别是,知道如何判断哪个包依赖于给定的文件

请注意 dlocate -S 不够好,因为它显示文件的所有者包,而我想要找到导致“kvm.ko”被加载的包!

mcradle:/etc# dlocate -S kvm.ko
linux-image-2.6.32-25-generic-pae: /lib/modules/2.6.32-25-generic-pae/kernel/arch/x86/kvm/kvm.ko

如果“apt-rdepends -r”接受的是文件而不是包,那可能正是我想要的。

提前致谢,我希望问题清楚。

答案1

没有通用的方法来查找使用给定文件的软件包。您可以组合使用dpkg -Sdlocate来查找包含文件的软件包,使用来apt-rdepends查找依赖于该软件包的软件包。但这并不能涵盖所有情况,也不会告诉您每个软件包依赖哪些文件(这并不是真正有意义的:依赖关系适用于整个软件包,并且通常无法将它们精确地定位到所依赖软件包中的特定文件)。

有种情况您无法通过依赖关系找到,那就是对基本软件包(元数据中包含的软件包Essential: yes)的依赖关系。每个系统都必须拥有基本软件包的完整集合,或者如果您愿意,可以假设每个软件包都依赖于每个基本软件包。例如:kvm.ko一个内核模块属于内核软件包,它是基本软件包。

另一种您无法通过依赖关系找到的情况是插件。许多程序会加载它们发现已安装的任何插件,即使没有插件也会运行,因此程序通常声明不依赖插件。(插件可能会声明依赖某种插件框架,而提供主程序可执行文件的软件包则依赖该框架,但情况并非总是如此。)例如:内核模块kvm是 kvm 虚拟机的可选组件;/usr/bin/kvm即使kvm未加载内核模块,您也可以运行,只是速度会更慢。

这里 VirtualBox 的消息非常通用且谨慎,因此具有误导性。该消息假设 KVM 扩展已编译到内核中,但在您的系统上,它实际上是一个可以卸载的模块。仅卸载模块就足以满足 VirtualBox 的要求:只需运行rmmod kvm_amd kvm_intel kvm。您还可以通过编辑或(取决于您的 Ubuntu 版本是否有 SysVinit 脚本或 Upstart 脚本)并注释掉模块加载行,或阻止服务在启动时启动,来阻止软件包加载模块qemu-kvmkvm/etc/init.d/qemu-kvm/etc/init/qemu-kvm.conf

答案2

网络精灵粉尘?通过结合它们的力量,一组软件包工具将发出耀眼的光芒,驱散黑暗!

  1. 用于dlocate -S查找所有者包
  2. 用于aptitude remove -sy $pkg找出所有依赖包(-syD添加详细信息;aptitude why仅查找一个依赖链)。

或者只需一步:

  1. aptitude remove -sy $(dlocate -S /path/to/file |sed 's#:.*##' |uniq )

答案3

apt 文件应该可以。我还没有测试过

相关内容