Как предотвратить обновление определенного пакета?

374

Из-за ошибки # 693758 я бы хотел запретить apt-get upgradeи Update Manager обновлять пакет "libgtk2.0-0".

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

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

Ответы:

554

Держа

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

Dpkg

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

echo "<package-name> hold" | sudo dpkg --set-selections

Снять трюм:

echo "<package-name> install" | sudo dpkg --set-selections

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

dpkg --get-selections

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

dpkg --get-selections | grep "<package-name>"

склонный

Держите посылку:

sudo apt-mark hold <package-name>

Снять трюм:

sudo apt-mark unhold <package-name>

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

sudo apt-mark showhold

Dselect

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


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

уместность

Держите посылку:

sudo aptitude hold <package-name>

Снять трюм:

sudo aptitude unhold <package-name>

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

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

Нажмите кнопку поиска и введите имя пакета.

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

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

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

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

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

echo "foo hold" | dpkg --set-selections

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

sudo -i
echo "wine hold" | dpkg --set-selections

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

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

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

Пакет: compiz-plugins-main
Пин: версия 1: 0.9.7.0 ~ bzr19-0ubuntu10.1
Приоритет пин-кода: -1

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

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

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

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

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

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

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

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

Бруно Перейра
источник
7
Пожалуйста, посмотрите на «Блокировка версии не так умна, как кажется. Она должна делать то, что говорит на жестяной коробке, блокировать версию ... Но она блокирует ее только в Synaptic. Все остальное, что делает обновления пакетов (читай: Менеджер обновлений»). , apt-get, aptitude и т. д.) игнорирует это. Возможно, это ошибочное поведение, поэтому я ожидаю, что это будет исправлено вовремя ». от askubuntu.com/questions/9607/what-does-lock-version-do . Каково текущее состояние? Если что-то заблокировано в Synaptic, будут ли другие менеджеры пакетов «соблюдать» блокировку?
2
vasa1: Начиная с версии 0.75.13, до сих пор нет :( Та же проблема с aptitude.
syockit
16

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

echo package_name hold | dpkg --set-selections

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

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

RobotHumans
источник
Отлично, это был ответ. Спасибо.
asoundmove
s/sudo su/sudo -s/g(или sudo -i). ( -iдаст логин оболочки, -sне даст).
Дероберт
6

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

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

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

sudo apt-mark hold firefox firefox-locale-*

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

sudo apt-mark unhold firefox firefox-locale-*
rubo77
источник
4

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

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

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

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

Аллан
источник
3

Смотрите ошибки # 75332 , # 158981 и # 72806 .

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

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

Джаспер
источник
2

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

aptitude reinstall ~i oracle-java8-jre:

Это однократное использование (не сохраняется для будущих переустановок), сохранение определенного переопределения, для переустановки всех пакетов в вашей системе, но не oracle-java8-jre.

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

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

cabonamigo
источник
1

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

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

dinchamion
источник
0

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

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

dpkg --get-selections > current_selections.txt

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

dpkg --get-selections | sed -r "s/\tinstall/hold/" |dpkg --set-selections

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

dpkg --set-selections < current_selections.txt

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

Jvw
источник
0

Добавление подробностей в комментарии @ 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, проблема решена.

Package: va-driver-all
Pin: release *
Pin-Priority: -1
MrPotatoHead
источник