Як запобігти оновленню конкретного пакету?


374

Через помилку # 693758 Я хотів би запобігти apt-get upgradeта оновити менеджер оновлення пакету "libgtk2.0-0".

Як цього можна досягти?


@hhlp: Але це питання ставить питання про пакет, який ніколи не встановлювався.
Натан Осман

1
@George Edison - Існує також зберігання пакету, що дозволяє не оновлювати пакет. тож утримування пакету означає, що ви повідомляєте менеджеру пакунків зберігати поточну версію, незважаючи ні на що. Це корисно, якщо після оновлення перервана остання версія поточно працюючої програми. (Ви не можете утримувати пакет, який ніколи не був встановлений, також дивіться моє запитання те саме) .... Я перевірив це зараз - дивіться, він сказавdisable packages from the auto-update
hhlp

Відповіді:


554

Холдинг

Існує чотири способи стримування пакунків: з dpkg, apt, aptitude або dselect.

дпкг

Покладіть пакет на затримку:

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] обрання, знайдіть пакунок, який ви хочете утримати в його теперішньому стані, і натисніть =або H. Зміни набудуть чинності відразу після виходу з екрана [S] обранця.


Наступні підходи обмежені тим, що блокування / утримання пакету в межах здатності чи синаптики не впливає на apt-get / apt.

здатність

Тримайте пакет:

sudo aptitude hold <package-name>

Видаліть утримування:

sudo aptitude unhold <package-name>

Блокування з Synaptic Package Manager

Перейдіть до Synaptic Package Manager (Система> Адміністрація> Synaptic Package Manager).

Натисніть кнопку пошуку та введіть назву пакета.

Коли ви знайдете пакет, виберіть його та перейдіть до меню пакета та виберіть Lock Version .

Синаптичне меню

Цей пакет тепер не відображатиметься в диспетчері оновлень і не оновлюватиметься.


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
Наразі пакети блокують лише синаптичні та піддатливі програми в межах цих програм. "Все, що робить оновлення пакету (читання: Менеджер оновлень, apt-get, здатність тощо), ігнорує це." З цього питання .
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
Pin: версія 1: 0.9.7.0 ~ bzr19-0ubuntu10.1
Пріоритет: -1

Це переходить у / etc / apt / файл налаштувань.


9
Це набагато кращий спосіб, ніж попередження оновлень на невизначений термін
Eero Aaltonen

Я думаю, що за допомогою цього методу шанси більше, щоб запобігти перевстановленню наступного оновлення версії ubuntu, наприклад, ubuntu one чи піктограми Amazon ...
Даніел Алдер

19

Встановити synapticза допомогою sudo apt-get install synaptic.

Запустіть за допомогою gksudo synapticта у вікні пошуку знайдіть пакет, який ви хочете заблокувати, тобто:gedit

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

У меню пакета виберіть Версія блокування :

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

І це все, версія, яка зараз встановлена ​​на момент блокування, буде встановлена ​​навіть під час оновлення.


7
Будь ласка, подивіться на "Блокована версія не така розумна, як здається. Вона повинна робити те, що написано на бляшанці, блокувати версію ... Але це блокується лише в межах Synaptic. Все, що робить оновлення пакета (читайте: Оновлення менеджера оновлень) , apt-get, здатність тощо) це ігнорує. Це, ймовірно, помилкова поведінка, тому я б очікував, що це буде виправлено вчасно ". від askubuntu.com/questions/9607/what-does-lock-version-do . Який сучасний стан? Якщо щось заблоковано в Synaptic, чи будуть інші менеджери пакунків шанувати замок?

2
vasa1: Станом на версію 0.75.13, досі немає :( Та сама проблема з придатністю.
syockit

16

Запобігання встановленню пакету називається "зберігання пакету", і це зробити дуже просто:

echo package_name hold | dpkg - набір-вибір

... де * ім'я пакета * - це ім'я пакету, який ви хочете запобігти встановленню.

Примітка: наведена вище команда передбачає привілеї root. Іншими словами, вам, ймовірно, потрібно буде набрати, sudo suперш ніж запустити його.


Досконалий це була відповідь. Дякую.
asoundmove

s/sudo su/sudo -s/g(або sudo -i). ( -iдасть оболонку входу, -sне буде).
дероберт

6

Оскільки деякий час apt-getзамінюється на apt, я, наприклад, хочу запобігти оновлення Firefox до версії понад 56, тому що багато нових доповнень, таких як "Групи вкладок", більше не працюють з новим Firefox 57 (див. "Веб-розширення Оновлення ").

Можна зберігати кілька пакетів за допомогою однієї команди та використовувати символи.

Запобігати оновленню Firefox

sudo apt-mark hold firefox firefox-locale-*

Якщо ви вирішите зняти їх згодом, це буде команда:

sudo apt-mark unhold firefox firefox-locale-*

4

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

Щоб заморозити пакет, виберіть його синаптично, потім відкрийте меню пакунка та виберіть версію заморожування.

Сподіваюсь, це допомагає

редагувати: Це питання 16668 стосується подібної ситуації



3

Дивіться про помилки №75332 , №158981 та № 72806 .

Підсумок полягає в тому, що утримання на рівні apt-get / aptitude не викликає статусу утримування в dpkg (особливо див. Помилку 72806), а менеджер оновлень зчитує стан з dpkg.

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


2

Ви можете використовувати на здатності "специфічне переосмислення", як це:

aptitude reinstall ~i oracle-java8-jre:

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

Якщо ви використовуєте специфічне перевизначення для зберігання, пакет на мить перебуває у стані збереження придатності, не намагається його встановити.

Дуже гарна річ, якщо ви думаєте, що ваша система була порушена якось.


1

Якщо у вас встановлений Synaptic, ви можете вибрати пакет і скористатися меню Package -> Lock Version, щоб запобігти його оновленню.

Ви можете встановити Synaptic за допомогою sudo apt-get install synaptic. Мені особисто здається, що це корисніше, ніж Програмний центр ... тоді, знову ж таки, я досить стара школа. :)


0

Інколи, можливо, захоче стримувати всі встановлені пакети. Ось як.

Спочатку збережіть поточний стан, щоб ви могли скасувати:

dpkg --get-selections > current_selections.txt

Потім, щоб стримати всі пакунки:

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

Нарешті, коли ви хочете повернутись до попереднього стану:

dpkg --set-selections < current_selections.txt

Один з випадків використання для цього може бути під час створення знімка VM або Amazon AMI для міграції з QA у виробниче середовище.


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. Я вніс цей текст у файл налаштувань і підмив підхоплення, проблему вирішено.

Package: va-driver-all
Pin: release *
Pin-Priority: -1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.