Чи можу я відкатати оновлення apt-get, якщо щось піде не так?


53

Чи є спосіб, перш ніж запустити aptitude upgradeабо apt-get upgrade, налаштувати щось, щоб ви могли «легко» відкатати вашу систему до стану «влучного», який був до фактичного оновлення, якщо щось піде не так?

Тобто, наприклад, перевстановіть стару версію пакетів, які були оновлені під час процесу.

(EDIT) Кілька підказок : я знаю, що, etckeeperнаприклад, використовується якийсь гак, aptщоб він отримував сповіщення щоразу, коли aptвстановлює або видаляє пакет. Я припускаю, що може бути якийсь скрипт, який міг би зберегти список нещодавно встановленого пакету та попередній номер версії, щоб він міг перевстановити їх з aptкешу ( /var/cache/apt/archives). Також є checkinstallможливість відстежувати зміни файлів ...

Будь-які деталі, як правильно цього досягти?


Я не знаю, що в apt є щось подібне, що вбудовується, вам доведеться відслідковувати встановлені на даний момент номери пакунків і т.д.
Антон

Відповіді:


46

Мені просто довелося з’ясувати відповідь на це, тому що останній apt-get upgradeна сервері Debian унеможливив завантаження останнього ядра поза зайнятим ящиком, не вдалося встановити кореневий розділ zfs. Принаймні старше ядро ​​все ще може завантажуватися, але воно було несумісне з іншим програмним забезпеченням. Таким чином необхідність відкату.

Коротка відповідь - ви можете використовувати таку команду:

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

якщо він робить те, що ви хочете, видаліть -sі запустіть його знову. Ось такі кроки, які я здійснив, щоб правильно працювати:

  1. Я тимчасово обрізав своє, /var/log/dpkg.logщоб залишити лише сьогоднішнє оновлення

  2. Я встановив крихітний скрипт apt-historyз тут в ~/.bashrcі побіг

    $ 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. Це забезпечує добре відформатований список перетворених пакунків, на який потрібно повернути, подаючи його apt-get install. Обріжте цей список за потребою в текстовому редакторі, а потім запустіть ( -sспочатку для сухого виконання):

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

Apt попередить про зниження рівня, який очікується. Щоб запобігти перезапису цього відкату наступним оновленням, пакети потрібно буде закріпити, поки не буде вирішена вихідна проблема. Наприклад з: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
}

Приємно знайти ці ресурси! Чудова відповідь!
L0j1k

1
apt-history rollbackКоманда може бути замінена чимось - щось на зразок awk '$3 ~ /upgrade/ {print $4"="$5}' dpkg.log.
Тотор

З наступним розширенням він відповідає лише оновленням даної дати (тому не потрібно змінювати журнал раніше):awk '$1 == "2018-09-07" && $3 == "upgrade" {print $4"="$5}' /var/log/dpkg.log
luator

1
Після обрізки dpkg.log я отримую купу не знайдених версій повідомлень, тобто E: Version '5.24.1-3+deb9u3' for 'libperl5.24' was not found. Я використовую Debian Stretch для Raspian.
дпс

7

Файли журналу /var/log/apt/history.logта /var/log/apt/term.logнайближчі речі, доступні вашому опису:

Я припускаю, що може бути якийсь сценарій, який міг би зберегти список нещодавно встановленого пакету та їх попередню кількість версії

history.logподає зведений перелік кожної дії, яка aptвиконується у такому форматі:

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

Зокрема, він містить список щойно встановлених пакетів або вилучених пакетів. Крім того, term.logпоказує, що насправді з’явилося на терміналі під час дії, щоб відображати стару та нову версії пакетів. Випадковий зразок з мого 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) 

Спроба відкотитись aptавтоматично не рекомендується, але якщо ви використовуєте журнали, це слід робити вручну, якщо невдала дія не порушила щось, що заважає aptдіям, наприклад, непослідовної бази даних dpkg. У такому випадку вам доведеться виправити проблему, перш ніж продовжувати.


4

Ні, спритність не робить це просто.

Найкращий варіант - деякий тип знімків. Або знімки файлової системи через lvm / zfs / btrfs, або знімки екземпляра, якщо ви використовуєте який-небудь VM.

Єдиний інший варіант - провести інвентаризацію встановлених пакетів (dpkg -l) до і після. Якщо ви хочете "відкататись", ви повинні явно встановити попередню версію.


Я знаю точну версію, але apt відмовляється: apt install openssl=1.0.2g-1ubuntu4.12призводить до E: Version '1.0.2g-1ubuntu4.12' for 'openssl' was not found. Я щойно оновив 1.0.2g-1ubuntu4.13і мені цікаво, чи це зараз викликає деякі проблеми з CORS / CSP
Csaba Toth,

Він може більше не бути в сховищі.
bahamat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.