Kann ich ein passendes Upgrade rückgängig machen, wenn etwas schief geht?

53

Gibt es eine Möglichkeit, vor dem Starten eines aptitude upgradeoder apt-get upgradeetwas einzurichten, so dass Sie Ihr System "leicht" in den Zustand "passend" zurückversetzen können, der vor dem eigentlichen Upgrade bestand, falls etwas schief geht?

Das heißt, Sie müssen beispielsweise die alte Version der Pakete neu installieren, die während des Vorgangs aktualisiert wurden.

(EDIT) Ein paar Hinweise : Ich weiß, dass etckeeperzum Beispiel einige Hooks verwendet aptwerden, damit es benachrichtigt wird, wenn aptein Paket installiert oder deinstalliert wird. Ich nehme an, es könnte eine Art Skript geben, das die Liste der neu installierten Pakete und ihre vorherige Versionsnummer speichert, um sie aus dem aptCache neu installieren zu können ( /var/cache/apt/archives). Es gibt auch checkinstallwelche, die Dateiänderungen verfolgen können ...

Irgendwelche Details, wie man das richtig erreicht?

Totor
quelle
Mir ist nicht bewusst, dass in apt so etwas eingebaut ist. Sie müssten die aktuell installierten Paketnummern usw. im Auge behalten. Einfacher, wenn nötig, nur, um das Backup von gestern wiederherzustellen.
Anthon

Antworten:

46

Ich musste gerade eine Antwort auf diese apt-get upgradeFrage finden, weil der letzte auf einem Debian-Server es unmöglich machte, den neuesten Kernel über eine Busybox hinaus zu booten, und die zfs-Root-Partition nicht eingehängt werden konnte. Zumindest ein älterer Kernel konnte noch booten, war aber mit anderer Software nicht kompatibel. Also die Notwendigkeit eines Rollbacks.

Die kurze Antwort - Sie könnten den folgenden Befehl verwenden:

$ apt-get -s install $(apt-history rollback | tr '\n' ' ')

Wenn es tut, was Sie wollen, entfernen Sie das -sund führen Sie es erneut aus. Hier sind die Schritte, die ich unternommen habe, um dies richtig zum Laufen zu bringen:

  1. Ich habe meine vorübergehend so eingestellt /var/log/dpkg.log, dass nur das heutige Upgrade übrig bleibt

  2. Ich habe das winzige Skript apt-historyvon hier in installiert ~/.bashrcund lief

    $ apt-history rollback > rollback.txt
    ...
    libzfs2:amd64=0.6.4-4~wheezy 
    zfsutils:amd64=0.6.4-4~wheezy 
    zfs-initramfs:amd64=0.6.4-4~wheezy
    ...
    
  3. Dies bietet eine schön formatierte Liste versionierter Pakete, auf die durch Einspeisen ein Rollback durchgeführt werden kann apt-get install. Schneiden Sie diese Liste nach Bedarf in einem Texteditor und führen Sie sie dann aus (mit zuerst -sfür den Probelauf):

    $ apt-get -s install $(cat rollback.txt | tr '\n' ' ')
    $ apt-get install $(cat rollback.txt | tr '\n' ' ')
    

Apt warnt vor den erwarteten Downgrades. Um zu verhindern, dass dieses Rollback beim nächsten Upgrade überschrieben wird, müssen die Pakete fixiert werden, bis das ursprüngliche Problem behoben ist. Zum Beispiel mit:apt-mark hold zfsutils libzfs2 ...


function apt-history(){
    case "$1" in
      install)
            cat /var/log/dpkg.log | grep 'install '
            ;;
      upgrade|remove)
            cat /var/log/dpkg.log | grep $1
            ;;
      rollback)
            cat /var/log/dpkg.log | grep upgrade | \
                grep "$2" -A10000000 | \
                grep "$3" -B10000000 | \
                awk '{print $4"="$5}'
            ;;
      *)
            cat /var/log/dpkg.log
            ;;
    esac
}
ChrisW
quelle
Schön, diese Ressourcen zu finden! Gute Antwort!
Mittwoch,
1
Der apt-history rollbackBefehl kann durch so etwas wie ersetzt werden awk '$3 ~ /upgrade/ {print $4"="$5}' dpkg.log.
Totor
Mit der folgenden Erweiterung werden nur Aktualisierungen des angegebenen Datums berücksichtigt (das Protokoll muss also nicht zuvor awk '$1 == "2018-09-07" && $3 == "upgrade" {print $4"="$5}' /var/log/dpkg.log
geändert werden
1
Nach dem Trimmen von dpkg.log erhalte ich eine Reihe von Meldungen über nicht gefundene Versionen, d E: Version '5.24.1-3+deb9u3' for 'libperl5.24' was not found. H. Ich benutze Debian Stretch für Raspian.
DPS
7

Die Protokolldateien /var/log/apt/history.logund /var/log/apt/term.logsind die Objekte, die Ihrer Beschreibung am nächsten kommen:

Ich nehme an, es könnte eine Art Skript geben, das die Liste der neu installierten Pakete und ihre vorherige Versionsnummer speichert

history.logGibt eine zusammenfassende Liste aller Aktionen aptin folgendem Format aus:

Start-Date: 2013-06-21  16:05:05
Commandline: apt-get install rdiff-backup
Install: python-pyxattr:i386 (0.5.0-3, automatic), rdiff-backup:i386 (1.2.8-6), python-pylibacl:i386 (0.5.0-3, automatic
), librsync1:i386 (0.9.7-7, automatic)
End-Date: 2013-06-21  16:05:42

Insbesondere wird eine Liste neu installierter oder entfernter Pakete angezeigt. Außerdem wird angezeigt, term.logwas während der Aktion tatsächlich auf dem Terminal angezeigt wurde, sodass die alte und die neue Version von Paketen angezeigt werden. Eine zufällige Auswahl von meinem history.log:

Preparing to replace gnupg 1.4.10-4 (using .../gnupg_1.4.10-4+squeeze1_i386.deb) ...
Unpacking replacement gnupg ...
Processing triggers for install-info ...
Processing triggers for man-db ...
Processing triggers for doc-base ...
Processing 1 changed doc-base file(s)...
Registering documents with scrollkeeper...
Setting up gnupg (1.4.10-4+squeeze1) 

Der Versuch, ein aptautomatisches Rollback durchzuführen, wird nicht empfohlen. Wenn Sie jedoch die Protokolle verwenden, sollte dies manuell möglich sein, es sei denn, die fehlgeschlagene Aktion hat einen Fehler verursacht, der die aptAktionen des Benutzers stört , z. B. eine inkonsistente dpkg-Datenbank. In diesem Fall müssen Sie das Problem beheben, bevor Sie fortfahren können.

Faheem Mitha
quelle
4

Nein, apt macht das nicht einfach.

Die beste Option ist eine Art Schnappschuss. Entweder Dateisystem-Snapshots über lvm / zfs / btrfs oder Instanz-Snapshots, wenn Sie eine VM verwenden.

Die einzige andere Möglichkeit besteht darin, vorher und nachher eine Bestandsaufnahme der installierten Pakete (dpkg -l) durchzuführen. Wenn Sie ein Rollback durchführen möchten, müssen Sie die vorherige Version explizit installieren.

Bahamat
quelle
Ich kenne die genaue Version, aber apt lehnt ab: apt install openssl=1.0.2g-1ubuntu4.12ergibt E: Version '1.0.2g-1ubuntu4.12' for 'openssl' was not found. Ich habe gerade auf aktualisiert 1.0.2g-1ubuntu4.13und frage mich, ob dies jetzt einige CORS / CSP-Probleme verursacht
Csaba Toth
Es befindet sich möglicherweise nicht mehr im Repository.
Bahamat