Найти все пакеты, которые используют данный файл в 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

это сработало, теперь мой вопрос: как я мог бы прийти к такому выводу систематически без паутины-волшебной пыли? В частности, было бы интересно узнать, как определить, какой пакет зависит от данного файла?

Пожалуйста, обратите внимание, что 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' принял бы файлы вместо пакетов, которые могли бы быть именно тем, что я ищу.

Заранее спасибо и надеюсь, вопрос понятен.

3 ответа

Решение

Не существует общего способа найти пакеты, которые используют данный файл. Вы можете объединить dpkg -S или же dlocate найти пакет, содержащий файл, с apt-rdepends чтобы найти, какие пакеты зависят от этого пакета. Но это не охватит все случаи, и не скажет вам, от каких файлов зависит каждый пакет (не то, что это действительно имеет смысл: зависимости применяются к пакетам в целом, и часто они не могут быть точно определены для конкретного файла в зависимом пакете).

Один случай, который вы не сможете найти через зависимости, это зависимости от основных пакетов (те, для которых метаданные включают Essential: yes). Каждая система должна иметь полный набор необходимых пакетов, или, если вам нравится, предполагается, что каждый пакет зависит от каждого необходимого пакета. Дело в точке: kvm.ko является модулем ядра, принадлежащим к пакету ядра, что существенно.

Другой случай, который вы не всегда можете найти через зависимости, это плагины. Многие программы будут загружать любые плагины, которые они установят, и будут работать, даже если плагина там нет, поэтому программа обычно не объявляет зависимость от плагина. (Плагин может объявлять зависимость от некоторой платформы плагинов, от которой зависит пакет, обеспечивающий исполняемый файл основной программы, но это не всегда так.) Пример: kvm модуль ядра является необязательным компонентом виртуальной машины kvm; Вы можете запустить /usr/bin/kvm даже если kvm Модуль ядра не загружен, он будет работать медленнее.

Здесь сообщение от VirtualBox является настолько общим и безопасным, что вводит в заблуждение. В сообщении предполагается, что расширение KVM скомпилировано в ядро, но в вашей системе это действительно модуль, который можно выгрузить. Достаточно просто выгрузить модуль, чтобы удовлетворить VirtualBox: просто запустите rmmod kvm_amd kvm_intel kvm, Вы также можете сохранить qemu-kvm пакет от загрузки kvm модуль путем редактирования /etc/init.d/qemu-kvm или же /etc/init/qemu-kvm.conf (в зависимости от того, есть ли в вашей версии Ubuntu сценарий SysVinit или сценарий Upstart) и комментирование строки загрузки модуля или предотвращение запуска службы во время загрузки.

Веб-фея пыли? Объединив свои силы, команда пакетных инструментов осветит ослепительный свет и заставит тьму отступить!

  1. использование dlocate -S найти владельца пакета
  2. использование aptitude remove -sy $pkg выяснить все зависимые пакеты (-syD добавить детали; aptitude why найти только одну цепочку зависимостей).

Или за один шаг:

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

apt-файл должен работать для этого. Я не проверял это

Другие вопросы по тегам