Запретить обновление пакета debian

Обновлено: 07.07.2024

У меня дома используется 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 — там будут строчки вида:

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

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

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

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

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

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

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

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

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

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

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

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

Вот некоторые из проблем, с которыми сталкивается пользователь FreeBSD:

  • Необходимо следить за /usr/ports/UPDATING и периодически выполнять описанные там действия;
  • Софт во FreeBSD зачастую обновляется не так быстро, как в Linux;
  • Не всякий софт во FreeBSD доступен в виде бинарного пакета, вспомним хотя бы OpenOffice;
  • А некоторого софта вообще нет (из недавнего припоминаю wxFormBuilder);
  • Иногда удивляют опции, с которыми были собраны бинарные пакеты (так бинарный пакет Perl собран без поддержки нитей);
  • Заморочки с лицензиями, например, при установке шрифтов или софта, написанного на Java;
  • Удаление пакетов, ставших ненужными, автоматизировано лишь частично (в утилите pkg_cleanup);

А вот пользователи Debian и основанных на нем дистрибутивах с этими проблемами не сталкиваются. Все управление пакетами в Debian происходит с помощью следующих простых команд.

Обновление базы доступных пакетов:

Пакеты можно искать через веб-интерфейс или с помощь команды:

Просмотр дополнительной информации о пакете:

Получения списка доступных версий пакета:

Даунгрейд или установка определенной версии:

Если не переустанавливается, можно попробовать так (осторожно, временно ломаются зависимости):

sudo dpkg --purge --force-depends имя_пакета
sudo apt-get install имя_пакета

Обновление всех пакетов (с подробностями):

Запретить/разрешить обновление конкретного пакета:

sudo apt-mark hold имя_пакета
sudo apt-mark unhold имя_пакета

Посмотреть список пакетов на холде:

Проверка контрольных сумм установленных пакетов:

Список установленных пакетов и поиск по нему:

Удаление вместе с файлами конфигурации:

Удаление пакетов, которые были установлены в качестве зависимостей и более не требуются:

Чистка кэша deb-пакетов (каталог /var/cache/apt/archives/):

Иногда нужно определить, к какому пакету относится файл. Данную задачу можно решить так:

А еще можно получить список всех файлов, содержащихся в пакете:

В общем, все легко и просто, если не считать пары моментов. Во-первых, иногда требуется установить какой-нибудь экспериментальный пакет (из ветки sid). Для этого нужно открыть файл /etc/apt/sources.list и дописать в него строчку:

Во-вторых, некоторые пакеты тянут за собой слишком много лишнего софта. Например, mail-notifications тянет за собой postfix и требует его настроить. Для решения это проблемы следует прописать в /etc/apt/apt.conf следующее:

После чего все должно пройти как по маслу:

sudo apt-get update
sudo apt-get install mail-notification

Альтернативное решение, не требующее правки apt.conf:

sudo apt-get --no-install-recommends install mail-notification

Бывает еще так, что нужно создать резервную копию уже установленного пакета. Например, если он по каким-то причинам был удален из репозитория. Такое иногда бывает в случае со внутренними репозиториями компании. Решается эта проблема так:

sudo apt-get install dpkg-repack
sudo dpkg-repack имя_пакета

Из приятных фишек Debian/Ubuntu мне особенно хотелось бы отметить умение выводить суммарный размер пакетов при их установке/удалении, а также способность делать так:

$ dia
Приложение 'dia' может быть найдено в следующих пакетах:
* dia-gnome
* dia
Попробуйте: sudo apt-get install <выбранный пакет>

Чтобы такая же фишка появилась в zsh, нужно прописать в

Также вас могут заинтересовать следующие ссылки:

Следует отметить, что активно пользоваться Linux я начал недавно (после многолетнего перерыва), так что если вы видите в заметке какой-нибудь косяк, не постесняйтесь сообщить о нем в комментариях. А ежели косяков не видно, тогда просто поведайте мне, пользуетесь ли вы Linux, если да, то каким, похож ли его менеджер пакетов на APT, и довольны ли вы им.

Как этого достичь?

@hhlp: Но этот вопрос касается пакета, который никогда не устанавливался. @ Джордж Эдисон - есть также удержание пакета, что позволяет вам не обновлять пакет. Таким образом, удержание пакета означает, что вы говорите менеджеру пакетов, чтобы он сохранял текущую версию, несмотря ни на что. Это полезно, если более свежая версия работающей в данный момент программы перестает работать после обновления. (вы не можете держать пакет, который никогда не был установлен, также посмотрите, что мой вопрос такой же) . я проверял это прямо сейчас - смотрите, он сказал disable packages from the auto-update

Существует четыре способа удержания пакетов: с помощью dpkg, apt, aptitude или dselect.

Поставить пакет на удержание:

Показать статус ваших пакетов:

Показать статус одного пакета:

склонный

Показать все пакеты в ожидании:

Dselect

С помощью dselect войдите в экран [S] elect, найдите пакет, который вы хотите сохранить в его текущем состоянии, и нажмите = или H . Изменения вступят в силу сразу после выхода из экрана выбора [S].

Следующие подходы ограничены тем, что блокировка / удержание пакета в aptitude или synaptic не влияет на apt-get / apt.

уместность

Блокировка с помощью Synaptic Package Manager

Перейдите в Менеджер пакетов Synaptic (Система> Администрирование> Менеджер пакетов Synaptic).

Найдя пакет, выберите его, перейдите в меню « Пакет» и выберите « Заблокировать версию» .

Синаптическое меню

Этот пакет теперь не будет отображаться в диспетчере обновлений и не будет обновляться.

Это также работает для предотвращения установки пакета. При установке devscripts многие упакованные тянутся как рекомендуемые пакеты. Поскольку мне не нужен почтовый сервер (postfix), я мог бы отключить его установку, запустив его echo postfix hold | sudo dpkg --set-selections перед запуском sudo apt-get install devscripts . Это действие удержания сохраняется только для этой установки, после установки выбранные значения сбрасываются. Также стоит отметить, что пакетные блокировки иногда ломают обновления и исправления, создавая ситуацию, когда нет легального решения, которое может вычислить зависимость. Если пакет foo имеет зависимость == <или <= от libbar, то apt откажется обновлять libbar так же, как и foo. Со временем эти каскадные зависимости могут вырасти, блокируя большое количество обновлений, включая важные обновления безопасности. Вам нужно будет либо снять блокировку и позволить обновлению произойти, либо перестроить пакеты, которые вы держите, под новые версии его зависимостей, если это произойдет. Просто примечание: apt-mark не поддерживается hold в версии 0.7.25 (Ubuntu Lucid) Это особенно полезно при попытке сдержать графические драйверы. Для пользователей ATI apt-mark hold fglrx fglrx-amdcccle fglrx-dev && aptitude hold fglrx fglrx-amdcccle fglrx-dev . В настоящее время синаптические и aptitude блокируют только пакеты в этих программах. «Все остальное, что делает обновления пакетов (читай: Менеджер обновлений, apt-get, aptitude и т. Д.) Игнорирует это». Из этого вопроса .

Чтобы поставить пакет "foo" на удержание:

В вашем случае мы собираемся приостановить производство вина:

Чтобы снять трюм:

Также обратите внимание, что пока пакет находится в режиме ожидания, вы можете установить определенную версию с помощью apt-get install wine=1.2.3 . Находясь на удержании, не может apt-get (dist-)upgrade изменить его. @rcoup Если у вас на удержании старая версия, а затем вы вручную обновляетесь до новой версии, не снимая удержание, как вы описали, будет ли старая версия сохранена в кэше, чтобы вы могли вернуться к ней? @cxrodgers локальный кеш (обычно /var/cache/apt/archives ) не зависит от удержаний, обновлений и прочего, поэтому все загруженные вами версии будут там до тех пор, пока вы не запустите apt-get [auto]clean

Я искал то же самое, и после многих исследований я обнаружил, что используя следующий синтаксис, вы можете запретить одну конкретную версию, но разрешить следующее обновление:

Это идет в файл / etc / apt / preferences.

Это гораздо лучший способ, чем предотвращать обновления на неопределенный срок С этим методом, я думаю, больше шансов не допустить переустановки «рекламного ПО» Ubuntu, такого как Ubuntu One или значка Amazon, при следующем обновлении релиза .

Установите synaptic с помощью sudo apt-get install synaptic .

Запустите используя gksudo synaptic и в окне поиска найдите пакет, который вы хотите заблокировать, а именно: gedit

введите описание изображения здесь

В меню пакета выберите Lock version :

введите описание изображения здесь

И это все, версия, установленная на момент блокировки, останется установленной даже во время обновлений.

vasa1: Начиная с версии 0.75.13, до сих пор нет :( Та же проблема с aptitude.

Запрет установки пакета называется «удержанием пакета», и это очень просто сделать:

. где * имя_пакета * - это имя пакета, который вы хотите запретить установку.

Примечание: приведенная выше команда предполагает права суперпользователя. Другими словами, вам, вероятно, нужно будет набрать текст sudo su перед запуском.

s/sudo su/sudo -s/g (или sudo -i ). ( -i даст логин оболочки, -s не даст).

Поскольку некоторое время apt-get заменяется на apt , например, я хочу запретить обновление Firefox до версии выше 56, потому что многие надстройки, такие как «Группы вкладок», больше не работают с новым Firefox 57 (см. «Расширения WebExtensions». Обновить").

Можно удерживать более одного пакета одной командой и использовать подстановочные знаки.

Запретить обновление Firefox

Если вы захотите отменить их позже, это будет команда:

Я синаптически могу заморозить версию определенного пакета. Я не уверен на 100% в том, что это изменит apt-get, но это определенно остановит менеджер обновлений.

Чтобы заморозить пакет, выберите его в synaptic, затем откройте меню пакета и выберите «заморозить версию».

Надеюсь это поможет

редактировать: этот вопрос 16668 имеет дело с аналогичной ситуацией

В итоге, удержание на уровне apt-get / aptitude не вызывает состояние удержания в dpkg (особенно см. Ошибку 72806), а менеджер обновлений считывает состояние из dpkg.

Обходной путь запускается от имени пользователя root: echo "package hold" | dpkg --set-selections

Вы можете использовать на aptitude «конкретное переопределение», например так:

Если вы используете специальное переопределение keep, пакет на мгновение будет в состоянии keep aptitude не будет пытаться установить его.

Очень хорошая вещь, если вы думаете, что ваша система была скомпрометирована каким-то образом.

Если у вас установлен Synaptic, вы можете выбрать пакет и использовать меню Package -> Lock Version, чтобы предотвратить его обновление.

Вы можете установить Synaptic с помощью sudo apt-get install synaptic. Я лично нахожу это более полезным, чем Центр программного обеспечения . опять же, я довольно старая школа. :)

Иногда может потребоваться скрыть все установленные в данный момент пакеты. Вот как.

Сначала сохраните текущее состояние, чтобы вы могли отменить:

Затем, чтобы сдержать все пакеты:

Наконец, когда вы хотите вернуться к предыдущему состоянию:

Одним из вариантов использования этого может быть создание моментального снимка виртуальной машины или Amazon AMI для миграции из QA в производственную среду.

Добавление подробностей в комментарии @ soger относительно Ubuntu 16.04.

Ubuntu 16.04 по умолчанию не имеет существующего файла / etc / apt / preferences. Если у вас его нет, просто создайте новый файл и заполните его разделом, как @soger описывает выше, чтобы исключить данный пакет и его зависимости из обновлений.

После беги apt update и ты GTG. : 0)

Например, у меня есть сервер Ubuntu 16.04.5 LTS со встроенной видеокартой Intel и картой NVidia. Карта NVidia используется только одна. Сервер также использует драйверы CUDA. У меня была проблема где apt настаивал

(Драйверы Intel) требовали обновления, но не могли определить, какую версию установить. Это сводило меня с ума, и мне все равно не нужны были драйверы Intel. Я ввел этот текст в файл настроек и очистил apt, проблема решена.

КАЮСЬ! Я ламер! Гуглил, нет ответа. Только aptitude hold transmission-daemon, но не помогло.
В тестинге обновился 1.74 транс до глючного 1.75. А может и не он глючит =) Откатил до 1.74 через архив пакетов в кэше.

Кстати у меня ещё вопросы:
1. как сделать даунгрейд пакета, если нет кэша пакетов?
2. как сделать даунгрейд пакета без удаления и установки старого пакета (ругалось на конфликт. transmission-daemon зависит от transmission-common и transmission-cli).
3. в каких дистрибутивах линукса можно легко установить предыдущую версию пакета? желательно указать какую конретно.


aptitude hold нифига не блокирует. И это считается почетным, эталонным и неприкосновенным багом дебиана (см. их багтрекер).
Посему пакеты нужно блокировать через dpkg --get-selections/--set-selections.

Что касается дополнительных вопросов — вот цитаты из man apt-get
>A specific version of a package can be selected for installation by following the package name with an equals and the version of the package to select

>Alternatively a specific distribution can be selected by following the package name with a slash and the version of the distribution or the Archive name (stable, testing, unstable)

>Both of the version selection mechanisms can downgrade packages and must be used with care.

>.

>Finally, the apt_preferences(5) mechanism allows you to create an alternative installation policy for individual packages

Что касается других дистров, то yum, емнип, тоже позволяет указать нужную версию, и можно подключать и отключать репозиртарии для отдельной транзакции (--enablerepo, --disablerepo).


> 3. в каких дистрибутивах линукса можно легко установить предыдущую версию пакета? желательно указать какую конретно.
Gentoo :-) Можно установить что угодно и каких угодно версий (даже те пакеты и тех версий, которых нет в стандартном portage).
Кстати, "Запретить обновление определенного пакета" тоже делается запросто.

Читайте также: