Czy mogę cofnąć aktualizację apt-get, jeśli coś pójdzie nie tak?

53

Czy jest jakiś sposób, aby przed uruchomieniem aptitude upgradelub apt-get upgradeskonfigurować coś, co umożliwi „łatwe” przywrócenie systemu do stanu „apt”, który był przed faktyczną aktualizacją, jeśli coś pójdzie nie tak?

To znaczy, na przykład, zainstaluj ponownie starą wersję pakietów, które zostały zaktualizowane podczas procesu.

(EDYCJA) Kilka wskazówek : wiem, że etckeeperna przykład używa jakiegoś zaczepienia apt, aby był powiadamiany za każdym razem, gdy aptinstaluje lub odinstalowuje pakiet. Przypuszczam, że może istnieć jakiś skrypt, który mógłby zapisać listę nowo zainstalowanych pakietów i ich poprzedni numer wersji, aby móc je ponownie zainstalować z aptpamięci podręcznej ( /var/cache/apt/archives). Są też takie, checkinstallktóre mogą śledzić modyfikacje plików ...

Jakieś szczegółowe informacje na temat tego, jak właściwie to osiągnąć?

Totor
źródło
Nie wiem, czy apt ma coś takiego w tym wbudowanym, będziesz musiał śledzić aktualnie zainstalowane numery pakietów itp. Łatwiej IMHO tylko przywrócić wczorajszą kopię zapasową, jeśli to konieczne.
Anthon

Odpowiedzi:

46

Właśnie teraz musiałem znaleźć odpowiedź na to pytanie, ponieważ ostatni apt-get upgradena serwerze Debiana uniemożliwiał uruchomienie najnowszego jądra poza zajętym boxem, nie mogąc zamontować partycji root zfs. Przynajmniej starsze jądro nadal mogło się uruchomić, ale było niekompatybilne z innym oprogramowaniem. Zatem potrzeba wycofania.

Krótka odpowiedź - możesz użyć następującego polecenia:

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

jeśli zrobi to, co chcesz, usuń ją -si uruchom ponownie. Oto kroki, które podjąłem, aby to działało poprawnie:

  1. Tymczasowo przyciąłem, /var/log/dpkg.logby zostawić tylko dzisiejszą aktualizację

  2. Po zainstalowaniu drobny skrypt apt-historyz tutaj do ~/.bashrci ran

    $ 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. Zapewnia to ładnie sformatowaną listę wersjonowanych pakietów, do których można przywrócić, wprowadzając ją apt-get install. Przytnij tę listę w razie potrzeby w edytorze tekstów, a następnie uruchom ( -snajpierw w przypadku suchobiegu):

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

Apt ostrzeże o oczekiwanych obniżkach. Aby zapobiec zastąpieniu tego wycofania przez następne uaktualnienie, pakiety będą musiały zostać przypięte, dopóki oryginalny problem nie zostanie rozwiązany. Na przykład z: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
źródło
Fajnie jest znaleźć te zasoby! Świetna odpowiedź!
L0j1k,
1
apt-history rollbackPolecenie można zastąpić czymś takim awk '$3 ~ /upgrade/ {print $4"="$5}' dpkg.log.
Totor
Z następującym rozszerzeniem pasuje tylko do aktualizacji z danej daty (więc nie trzeba wcześniej modyfikować dziennika):awk '$1 == "2018-09-07" && $3 == "upgrade" {print $4"="$5}' /var/log/dpkg.log
luator
1
Po przycięciu dpkg.log otrzymuję kilka komunikatów o nieznalezionej wersji, tj E: Version '5.24.1-3+deb9u3' for 'libperl5.24' was not found. Używam Debian Stretch dla Raspian.
dps,
7

Pliki dziennika /var/log/apt/history.logi /var/log/apt/term.logsą najbliższymi rzeczy dostępne dla opisem:

Przypuszczam, że może istnieć jakiś skrypt, który mógłby zapisać listę nowo zainstalowanych pakietów i ich poprzedni numer wersji

history.logzawiera listę podsumowującą każde działanie, które aptma następujący format:

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

W szczególności zawiera listę nowo zainstalowanych pakietów lub usuniętych pakietów. Dodatkowo term.logpokazuje, co faktycznie pojawiło się na terminalu podczas akcji, aby pokazać starą i nową wersję pakietów. Losowa próbka z mojego 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) 

Próba aptautomatycznego wycofania nie jest zalecana, ale jeśli korzystasz z dzienników, powinna istnieć możliwość ręcznego cofnięcia, chyba że nieudane działanie spowodowało uszkodzenie czegoś, co zakłóca aptdziałania, np. Niespójna baza danych dpkg. W takim przypadku musisz rozwiązać problem przed kontynuowaniem.

Faheem Mitha
źródło
4

Nie, apt nie ułatwia tego.

Najlepszą opcją jest jakiś rodzaj migawki. Migawki systemu plików za pomocą lvm / zfs / btrfs lub migawki instancji, jeśli używasz jakiejś maszyny wirtualnej.

Jedyną inną opcją jest sporządzenie spisu zainstalowanych pakietów (dpkg -l) przed i po. Jeśli chcesz „przywrócić”, musisz wyraźnie zainstalować poprzednią wersję.

bahamat
źródło
Znam dokładną wersję, ale apt odmawia: apt install openssl=1.0.2g-1ubuntu4.12powoduje E: Version '1.0.2g-1ubuntu4.12' for 'openssl' was not found. Właśnie uaktualniłem do 1.0.2g-1ubuntu4.13i zastanawiam się, czy to powoduje teraz jakieś problemy CORS / CSP
Csaba Toth
Może już nie być w repozytorium.
bahamat