Finden Sie alle Pakete, die eine bestimmte Datei in Ubuntu verwenden?

2

Ich möchte alle Pakete auflisten, die eine bestimmte Datei verwenden. Ich bin bereit, ein beliebiges Tool (wie dpkg, dlocate, apt-file usw.) zu verwenden. Bitte beachten Sie, wenn ich 'use' sage, dass ich nicht unbedingt nur die Datei besitze / installiere, würde ich gerne wissen welches Paket auch darauf verweisen, dagegen verlinken usw.

Hier ist mein Anwendungsfall:

Ich habe sowohl KVM als auch VirtualBox installiert und habe letztendlich nur VirtualBox verwendet, da es sich herausstellt, dass VirtualBox und KVM um Ressourcen konkurrieren. Glücklicherweise verwende ich KVM nicht und habe es einfach deinstalliert.

durch Ausgabe von:

sudo apt-get purge kvm

Aber es war nicht genug und als ich versuchte, VirtualBox bei einem nachfolgenden Start auszuführen, bekam ich den folgenden Fehler:

Fehler: Maschine konnte nicht gestartet werden. Fehlermeldung: VirtualBox kann nicht im VMX-Root-Modus ausgeführt werden. Bitte deaktivieren Sie die KVM-Kernel-Erweiterung, kompilieren Sie Ihren Kernel neu und starten Sie ihn neu (VERR_VMX_IN_VMX_ROOT_MODE)

Ein Blick auf die geladenen Module ergab, dass die kvm-Kernelmodule noch geladen waren

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

abgestimmt auf eine Websuche, die vorschlug, qemu-kvm zu löschen

sudo apt-get purge qemu-kvm

das hat geholfen, jetzt ist meine frage: wie hätte ich systematisch zu diesem schluss kommen können ohne den web-magic-dust? Insbesondere wäre es schön zu wissen, wie man erkennen kann, welches Paket von einer bestimmten Datei abhängt .

Bitte beachten Sie, dass dlocate -S nicht gut genug ist, da es das Eigentümerpaket der Datei anzeigt und ich das Paket finden wollte, das das Laden von 'kvm.ko' verursacht!

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

Wenn 'apt-rdepends -r' Dateien anstelle von Paketen akzeptiert hätte, die genau das gewesen wären, wonach ich gesucht habe.

Vielen Dank im Voraus und ich hoffe die Frage ist klar.

Mcradle
quelle
1
Diese Frage passt möglicherweise besser zu askubuntu
RobotHumans
2
@ aking1012: Diese Frage ist nicht Ubuntu-spezifisch. Auf allen Debian-Derivaten gibt es die gleichen Paketverwaltungstools, und das zugrunde liegende Problem gilt für alle Linux-Distributionen und darüber hinaus. Während es also auf Ask Ubuntu zum Thema gehört, passt es hier besser zusammen.
Gilles

Antworten:

1

Es gibt keine allgemeine Möglichkeit, Pakete zu finden, die eine bestimmte Datei verwenden. Sie können kombinieren dpkg -Soder dlocateherausfinden, welches Paket eine Datei enthält, apt-rdependsum herauszufinden, welche Pakete von diesem Paket abhängen. Dies deckt jedoch nicht alle Fälle ab und gibt keinen Aufschluss darüber, von welchen Dateien jedes Paket abhängt (nicht, dass dies wirklich von Bedeutung ist: Abhängigkeiten gelten für Pakete insgesamt und können häufig nicht auf eine bestimmte Datei genau festgelegt werden im abhängigen Paket).

Ein Fall, den Sie durch Abhängigkeiten nicht finden können, sind Abhängigkeiten von wichtigen Paketen (die in den Metadaten enthalten sind Essential: yes). Jedes System muss über die vollständige Sammlung der wesentlichen Pakete verfügen. Wenn Sie möchten, wird davon ausgegangen, dass jedes Paket von jedem wesentlichen Paket abhängt. Ein typisches Beispiel: kvm.koIst ein Kernelmodul, das zum Kernelpaket gehört und von wesentlicher Bedeutung ist.

Ein weiterer Fall, den Sie nicht immer durch Abhängigkeiten finden können, sind Plug-Ins. Viele Programme laden alle installierten Plug-Ins und werden auch dann ausgeführt, wenn das Plug-In nicht vorhanden ist. Daher gibt das Programm normalerweise keine Abhängigkeit vom Plug-In an. (Das Plug-In kann eine Abhängigkeit von einem Plug-In-Framework deklarieren, von dem das Paket abhängt, das die ausführbare Hauptprogrammdatei bereitstellt. kvmDies ist jedoch nicht immer der Fall.) Beispiel: Das Kernelmodul ist eine optionale Komponente von kvm virtuelle Maschine; Sie können /usr/bin/kvmdas kvmKernelmodul auch dann ausführen , wenn es nicht geladen ist. Es ist nur langsamer.

Hier ist die Nachricht von VirtualBox so allgemein und sicher, dass sie irreführend ist. Die Meldung geht davon aus, dass die KVM-Erweiterung im Kernel kompiliert ist, auf Ihrem System jedoch ein Modul, das entladen werden kann. Lediglich das Entladen des Moduls genügt, um VirtualBox zufrieden zu stellen: einfach ausführen rmmod kvm_amd kvm_intel kvm. Sie können das qemu-kvmPaket auch daran hindern, das kvmModul zu laden, indem Sie es bearbeiten /etc/init.d/qemu-kvmoder /etc/init/qemu-kvm.conf(abhängig davon, ob Ihre Ubuntu-Version ein SysVinit-Skript oder ein Upstart-Skript enthält) und die Zeile zum Laden des Moduls auskommentieren oder den Dienst daran hindern, beim Booten zu starten.

Gilles
quelle
Ja, ich weiß, wie ich das vorgestellte Problem lösen kann (in meinem Fall war das Löschen von kvm und qemu-kvm gut genug), ich wollte verstehen, was ich nicht kenne, und mich mit den Werkzeugen ausstatten, sollte ich auf ein ähnliches Problem stoßen Ich bin mir zum Beispiel immer noch nicht sicher, wie ich feststellen soll, welches Paket das Laden eines Moduls verursacht (vielleicht hätte das meine Frage sein sollen)
Mcradle
@Mcradle: Der Hauptpunkt meiner Antwort ist, dass es keinen vollständig allgemeinen Weg gibt. Jedes Programm kann dazu führen, dass ein Modul zu einem beliebigen Zeitpunkt geladen wird (wenn beispielsweise qemu geringfügig anders entwickelt wurde, wurde das kvmModul möglicherweise von der qemuausführbaren Datei anstatt von einem Startskript geladen ).
Gilles
Ich stimme zu, aber warum geht qemu überhaupt davon aus, dass die kvm-Module kompiliert und verfügbar sind? Das Kernel-Paket aktiviert möglicherweise nicht einmal die Treiber.
Mcradle
@Mcradle: Es wird nicht davon ausgegangen, dass die Module vorhanden sind. Es wird lediglich versucht, sie zu laden (es wird nichts unternommen, wenn sie nicht vorhanden sind oder von der Hardware nicht unterstützt werden).
Gilles
Dies zeigt also vollständig, warum Sie andere Paketdateien "opportunistisch" nutzen, ohne dies irgendwo als Abhängigkeit zu registrieren. Ich verstehe es total.
Mcradle
1

Web Pixie Staub? Durch die Kombination ihrer Kräfte wird ein Team von Paketwerkzeugen ein blendendes Licht erstrahlen lassen und die Dunkelheit zum Rückstoß bringen!

  1. Verwenden Sie dlocate -S, um das Eigentümerpaket zu finden
  2. Verwenden Sie aptitude remove -sy $pkg, um alle abhängigen Pakete herauszufinden ( -syDum Details hinzuzufügen; aptitude whyum nur eine Abhängigkeitskette zu finden).

Oder in einem Schritt:

  1. aptitude remove -sy $(dlocate -S /path/to/file |sed 's#:.*##' |uniq )
Tobu
quelle
Vielen Dank. Ich glaube nicht, dass es für den Fall, den ich vorgestellt habe, funktionieren wird, weil 'dlocate -S' 'linux-image-2.6.32-25-generic-pae' zurückgibt, das ist das Kernel-Paket, das ich nicht möchte deinstallieren (man könnte sich vorstellen, dass dies entweder unmöglich ist oder schwerwiegende Folgen hat)
Mcradle
-sysimuliert tatsächlich eine Deinstallation und sagt Ihnen, was vom Paket abhängt. Es läuft ohne root-Rechte.
Tobu
-1

apt-file sollte dafür funktionieren. Das habe ich nicht getestet

zzeroo
quelle
1
Danke für die Answe. Ich denke, dass 'apt-file search /lib/modules/2.6.32-25-generic-pae/kernel/arch/x86/kvm/kvm.ko' nur das Paket anzeigt, das die Datei installiert hat, apt-file nicht scheinen andere Maßnahmen zu haben, die von Interesse wären.
Mcradle
Tut mir leid, ich war verletzt und lese nicht gut
zzeroo