Не было печали, апдейтов накачали

habr.png

У меня дома используется Debian Sid. Большей частью он весьма и весьма хорош, но местами он слишком Bleeding слишком Edge. Например, когда отгружает пакеты, ломающие работоспособность системы. Вчера приехал wpasupplicant, который сломал мне wifi. Я его откатил, но в процессе я подумал, что многие пользователи не умеют этого делать. Рассказ «как откатить плохой apt-get install/upgrade» — в этом посте.


Ситуация

Мы сделали apt-get install что-то, или apt-get upgrade, или даже apt-get dist-upgrade, и после перезагрузки (или даже сразу же) обнаружили, что так нельзя. Сервис не стартует, убрана важная нам фича, кто-то падает и т.д. Мы хотим откатиться. Но вот, незадача — куда именно мы не знаем, потому что какая была версия до обновления мы не знаем.


Где выяснять что случилось?

apt ведёт очень подробные логи в /var/log/apt. Там есть, в частности, history.log — там будут строчки вида:


Upgrade:  wpasupplicant:amd64  (2:2.6-8, 2:2.6-11)
Install: libcaribou-gtk-module:amd64 (0.4.21-3, automatic)
Remove: libapache2-mod-dnssd:amd64 (0.6-3.2)


Там же будет написано кто это сделал и какой командой.


Start-Date: 2017-12-03  12:14:58
Commandline: apt-get dist-upgrade
Requested-By: amarao (1000)


Чтобы понять, какая версия была предыдущей, придётся посмотреть на лог установки. Он рядом — /var/log/apt/terminal.log. К сожалению, с esc-последовательностями.
Там мы увидим строчку вида:


Unpacking wpasupplicant (2:2.6-11) over (2:2.6-8) ...
Вот 2:2.6-11 - это то, что к нам приехало, а 2:2.6-8 то, что было до этого.


Как чинить

Чтобы поставить обратно пакет по версии, мы указываем её в явном виде:


apt-get install wpasupplicant=2:2.6-8


К сожалению, 90% это не сработает. Почему? Потому что пакета такой версии в репозитории нет.


В этом случае нам надо найти файл для установки. Он может быть в двух местах.


  1. /var/cache/apt/archives. Например, /var/cache/apt/archives/wpasupplicant_2%3a2.6-11_amd64.deb.
  2. snapshots.debian.org (о нём чуть ниже).


Когда мы имеем файл на диске, установка тривиальная:


sudo dpkg -i /var/cache/apt/archives/wpasupplicant_2%3a2.6-11_amd64.deb


… и у меня снова есть интернет. Есть вероятность, что придётся разбираться с зависимостями, но хорошая новость состоит в том, что если пакеты не конфликтовали до обновления, то их можно откатить в тот же набор версий. И какие именно это версии видно в выводе terminal.log.


Если же архива нет (потому что кто-то сделал upgrade, а потом тут же apt-get autoclean), то надо искать версию в интернетах. Для этого есть архив миррора дебиана. http://snapshot.debian.org/


Как его подключать — написано там, хотя чаще проще просто скачать нужный пакет. Важно: когда ищите снапшот, проверяйте по версиям в логах. Если зависимости противные и сложные, то имеет смысл автоматизировать парсинг terminal.log.


Альтернативный путь: можно попробовать apt-cache policy wpasupplicant чтобы посмотреть на доступные версии и выбрать одну их них (тоже через знак равно). В моём случае это было бесполезно, ибо интернетов не было. Важно: как только вы начинаете откатываться на старые версии, вы рискуете сделать себе такую конфигурацию по зависимостям, которую так просто уже не разберёшь, так что я рекомендую при наличии зависимых пакетов в первую очередь пробовать откатиться на предыдущие версии, а не искать себе приключений посредством даунгрейда на антиквариат.


Как с этим жить дальше?

Дальше мы не хотим апдейтиться до исправления проблемы. Чтобы проблему исправили, её надо зарепортить. https://bugs.debian.org — и там, возможно, оно есть. Если нет — надо репортить. reportbug имя_утилиты.


Чтобы случайно снова не проапдейтиться, пакет можно поставить на hold (запретить апдейты):


apt-mark hold wpasupplicant


(unhold снимает hold).


Best practices

Я давно для себя выработал привычку делать «dpkg -l >/var/log/dpkg_date» перед апдейтом. В таком виде его легче парсить, если нужно делать большое количество даунгрейдов.

© Habrahabr.ru