Могу ли я откатить обновление apt-get, если что-то пойдет не так?

53

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

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

(РЕДАКТИРОВАТЬ) Несколько советов : я знаю, что, etckeeperнапример, использует некоторую зацепку, aptчтобы он был уведомлен всякий раз, когда aptустанавливает или удаляет пакет. Я предполагаю, что мог быть какой-то сценарий, который мог бы сохранить список вновь установленных пакетов и номер их предыдущей версии, чтобы иметь возможность переустановить их из aptкэша ( /var/cache/apt/archives). Существует также, checkinstallкоторый может отслеживать изменения файлов ...

Есть какие-нибудь подробности о том, как этого добиться?

Totor
источник
Я не знаю, что в apt есть что-то подобное, вам придется отслеживать текущие установленные номера пакетов и т. Д. Проще имхо просто восстановить резервную копию вчерашнего дня, если это необходимо.
Anthon

Ответы:

46

Я только что должен был apt-get upgradeнайти ответ на этот вопрос, потому что последнее на сервере Debian сделало невозможным загрузку самого последнего ядра за пределами busybox, не смонтировав корневой раздел 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
}
ChrisW
источник
Приятно найти эти ресурсы! Отличный ответ!
L0j1k
1
Команда apt-history rollbackможет быть заменена чем-то вроде awk '$3 ~ /upgrade/ {print $4"="$5}' dpkg.log.
Totor
С последующим расширением он соответствует только обновлениям на указанную дату (поэтому нет необходимости изменять журнал раньше):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, либо снимки экземпляров, если вы используете виртуальную машину какого-либо типа.

Единственный другой вариант - провести инвентаризацию установленных пакетов (dpkg -l) до и после. Если вы хотите «откатиться», вы должны явно установить предыдущую версию.

bahamat
источник
Я знаю точную версию, но 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
Это больше не может быть в хранилище.
Багамат