Wie kann ich ein Downgrade von Paketen durchführen, ohne die abhängigen Pakete zu entfernen?

17

Ich habe eine Reihe von Mesa-Paketen, die ich auf eine PPA-Version aktualisiert habe, bevor ich die PPA lösche, damit ich mein System aktualisieren kann. Die Unterschiede in den Versionen sind geringfügig (sie sind technisch identisch, nur eine Gruppe von Bibliotheken stammt von git und die anderen sind die endgültigen Versionen).

Wenn ich versuche, ein Downgrade über Synaptic, apt-get oder aptitude durchzuführen, gerate ich in die Hölle der Abhängigkeit.

Gibt es eine Möglichkeit, die Pakete manuell herunterzustufen (möglicherweise einzeln) und ihre abhängigen Pakete als unbeweglich zu markieren (sofern dies sinnvoll ist), bis ich fertig bin?

PS diese Frage: Wie kann man ein Paket über apt-get downgraden? ist ein bisschen anders und hilft dieser Situation nicht.

RolandiXor
quelle
Warum gehst du nicht ppa-purgezuerst?
Landroni
Sie können das Paket erneut installieren. Wenn Sie beispielsweise synapticdas Paket xyz auswählen, werden standardmäßig alle Abhängigkeiten ausgewählt. Sie können jedoch immer alle Abhängigkeiten deaktivieren und nur das Hauptpaket installieren. Später können Sie alle Abhängigkeiten erneut installieren. Dies funktioniert nur, wenn Sie zur Neuinstallation bereit sind.
Registrierter Benutzer
@landroni Wenn ich lösche, werden die Pakete entfernt, die ich nicht entfernen möchte.
RolandiXor

Antworten:

13

Ich habe noch nie damit gespielt, aber ich würde vorschlagen, dass Sie hold(oder lock) die Version der Abhängigkeiten, die Sie Probleme verursachen. Dieser Weg apthat eine begrenzte Anzahl möglicher Lösungen und wird möglicherweise nicht verwirrt, wenn Sie versuchen, die anderen Pakete herunterzustufen.


Wenn nichts anderes funktioniert, können Sie den in dieser Antwort vorgeschlagenen manuellen Ansatz verwenden: Wie stuft man ein Paket über apt-get herunter? . Im Grunde genommen, laden Sie die notwendigen .debPakete manuell, dann installieren Sie sie eins nach dem anderen mit der unteren Ebene dpkgund einer seiner kraftvollen Argumente: --ignore-depends, --force-depends, --force-depends-version, oder sogar --force-all.

Im gleichen Sinne wie oben haben Sie das --force-downgradeArgument:

          downgrade(*): Install a package, even if newer version of
          it is already installed.

          Warning:  At  present  dpkg  does  not  do any dependency
          checking on downgrades and therefore will not warn you if
          the  downgrade  breaks the dependency of some other pack‐
          age. This can  have  serious  side  effects,  downgrading
          essential system components can even make your whole sys‐
          tem unusable. Use with care.

Dies setzt jedoch voraus, dass Sie gelesen man dpkghaben und verstehen, was Sie tun:

          Warning: These options are mostly intended to be used  by
          experts  only.  Using  them  without  fully understanding
          their effects may break your whole system.

Siehe Fehler: Versionsnummer beginnt nicht mit Ziffer und Wie installiere ich eine ältere Version von Java und Wie installiere ich eine ältere Version eines Pakets wie liquid 2.2.2? für Beispiele von:

sudo dpkg --force-downgrade -i your_mesa_package.deb

Und siehe Wie kann ich ein Paket installieren, ohne einige Abhängigkeiten zu installieren? für ein Beispiel (zusammen mit der entsprechenden Warnung) von:

sudo dpkg --force-all -i your_mesa_package.deb

Ein weiterer Ansatz wäre die Erstellung eines Dummy- .debPakets unter Verwendung des equivsPakets (und möglicherweise eines etwas anderen Namens). Wenn Sie dann das Dummy-Paket installieren, sollten Sie das "wahre" Paket entfernen können, während Sie die relevanten Abhängigkeiten beibehalten, und dann die ältere Version installieren. Ich bin mir nicht sicher, wie genau dies funktionieren würde, aber überprüfen Sie diesen relevanten Thread auf Details: So entfernen Sie eine Deb, ohne ihre Abhängigkeiten zu entfernen .

Landroni
quelle
4

Sie können zunächst apt-markalle Abhängigkeiten des Zielpakets (und möglicherweise auch die empfohlenen / vorgeschlagenen), die im System installiert sind, als manuell markieren installiert Installationen . Installieren Sie anschließend die vorherigen Versionen der Software, apt-getindem Sie die Version explizit erwähnen.

  • So listen Sie die Abhängigkeiten auf: Empfohlene und vorgeschlagene Pakete für das Zielpaket:

    apt-cache show <target-package-name>
    
  • Pakete als manuell installiert markieren :

    sudo apt-mark manual <package-name(s)>
    

    (Verwenden Sie dies für alle Abhängigkeiten, Empfehlungen und Vorschläge.)

  • Entfernen Sie das Zielpaket:

    sudo apt-get remove <target-package-name>
    
  • Verwenden Sie Folgendes, um eine Liste der Paketversionen anzuzeigen, auf die Sie ein Downgrade / Upgrade durchführen können:

    apt-cache policy <target-package-name>
    
  • Installieren Sie die Zielversion des erforderlichen Pakets:

    sudo apt-get install <target-package-name>=<target-package-version-number> 
    

    oder

    sudo apt-get -t=<target release> install <target-package-name>
    

PS. Wenn die Liste der Abhängigkeiten / empfohlenen / vorgeschlagenen Pakete, dh derjenigen, die mit gekennzeichnet werden sollen, apt-markgroß ist, speichern Sie die vorgesehene Liste der gepackten Ausgaben apt-cache show <target-package-name>in einer beliebigen Datei /path/to/foound verwenden Sie die apt-markin einer Kombination wie der folgenden:

cat /path/to/foo | xargs -imarkthese sudo apt-mark manual markthese
präzise
quelle
Diese Methode mag funktionieren, aber anstatt über 100 Pakete zu markieren, habe ich einfach die andere Antwort gewählt.
RolandiXor
@RolandiXor, Sie nutzen könnten apt-cache policy <target-package-name>für mit einer Liste von Paketversionen , dass Sie eine Herabstufung / Upgrade auf ..
präziser
..bitte verweisen Sie die vorgenommene Bearbeitung auf den Beitrag; wenn größere Anzahl von Dateien werden markiert sind , könnten Sie den Befehl Kombination verwenden , enthalten ...
präzise
Ich glaube nicht, dass du mich verstehst. Wie auch immer, ich habe es jetzt repariert und das Kopfgeld ausgegeben (kann es nicht wechseln).
RolandiXor
1

Ich habe gerade die Qualen hinter mir, ein Upgrade auf eine Upstream-Version eines Pakets durchzuführen und mich dann für ein Downgrade zu entscheiden. Dies geschah über ein privates Repository des Betreuers. In meinem Fall ging es darum, die neueste (noch unveröffentlichte) systemd 233-Version auszuprobieren.

Der Schlüssel ist zu verstehen, dass Sie alle Pakete angeben müssen, die heruntergestuft werden sollen. Wenn Sie das richtig verstehen, werden die Chancen gut stehen, dass Sie tun, was Sie wollen. Wenn Sie etwas verpassen, werden Sie von apt darauf hingewiesen, dass durch die Aktion viele Pakete entfernt werden. Um sicherzustellen, dass wir das '-s'-Flag verwenden, probieren wir das Downgrade aus, bevor wir es tatsächlich durchführen.

Die Schritte, die Sie unternehmen müssen, sind also:

1) Listen Sie alle Abhängigkeiten auf, die auf Upstream aktualisiert wurden (verwenden Sie ein anderes Schlüsselwort, wenn Ihre Situation anders ist):

dpkg -l|grep upstream

Dies gibt Ihnen eine Liste von Paketen mit einer Upstream-Versionsnummer.

2) Geben Sie für jedes Paket die richtige stabile Version an:

for i in libnss-resolve:amd64 libsystemd0:amd64 libpam-systemd:amd64 libsystemd0:i386 libudev1:amd64 libudev1:i386 systemd systemd-sysv udev; do apt-cache show $i; done|grep Version

3) Überprüfen Sie noch einmal, ob alles in Ordnung ist:

apt -s --allow-downgrades --no-remove --reinstall install libnss-resolve:amd64=232-21ubuntu5 libsystemd0:amd64=232-21ubuntu5 libpam-systemd:amd64=232-21ubuntu5 libsystemd0:i386=232-21ubuntu5 libudev1:amd64=232-21ubuntu5 libudev1:i386=232-21ubuntu5 systemd=232-21ubuntu5 systemd-sysv=232-21ubuntu5 udev=232-21ubuntu5

0 to upgrade, 0 to newly install, 9 to downgrade, 0 to remove and 0 not to upgrade.

(Ich bin mir nicht sicher, ob --reinstall erforderlich ist, aber das habe ich getan)

4) Entfernen Sie das -s und machen Sie es.

apt --allow-downgrades --no-remove --reinstall install libnss-resolve:amd64=232-21ubuntu5 libsystemd0:amd64=232-21ubuntu5 libpam-systemd:amd64=232-21ubuntu5 libsystemd0:i386=232-21ubuntu5 libudev1:amd64=232-21ubuntu5 libudev1:i386=232-21ubuntu5 systemd=232-21ubuntu5 systemd-sysv=232-21ubuntu5 udev=232-21ubuntu5
user2427436
quelle