Не было печали, апдейтов накачали
У меня дома используется 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% это не сработает. Почему? Потому что пакета такой версии в репозитории нет.
В этом случае нам надо найти файл для установки. Он может быть в двух местах.
- /var/cache/apt/archives. Например,
/var/cache/apt/archives/wpasupplicant_2%3a2.6-11_amd64.deb
. - 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
» перед апдейтом. В таком виде его легче парсить, если нужно делать большое количество даунгрейдов.