Як я можу знижувати пакети, не знімаючи їх залежних?


17

У мене є кілька пакунків з mesa, які я оновив до версії PPA, перш ніж очистити PPA, щоб я міг оновити свою систему. Відмінності у версіях незначні (технічно вони однакові, лише один набір бібліотек був із git, а інші - остаточні версії).

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

Чи є спосіб знизити пакети вручну (можливо, один за одним) і позначити їх залежні пакети як нерухомі (якщо це має сенс), поки я не закінчу?

PS це запитання: Як поновити пакет через apt-get? дещо інше, і це не допомагає цій ситуації.


Чому ви не ppa-purgeспочатку?
landroni

Ви можете перевстановити synapticпакет . Наприклад, якщо ви використовуєте , коли ви вибираєте пакет xyz, всі залежності будуть вибрані за замовчуванням. Але ви завжди можете скасувати вибір усіх залежностей і просто встановити основний пакет. Пізніше ви можете встановити всі залежності. Але знову ж таки, це працює лише в тому випадку, якщо ви готові перевстановити.
Зареєстрований користувач

@landroni якщо я очищую, він видалить пакунки, які я не хочу видаляти.
RolandiXor

Відповіді:


13

Я ніколи раніше з цим не грав, але я б запропонував вам hold(або lock) версію залежностей, які створюють вам проблеми. Цей спосіб aptмає більш обмежену кількість можливих рішень, і, можливо, не заплутається при спробі знецінити інші пакети.


Якщо нічого іншого не працює, ви можете скористатись ручним підходом, запропонованим у цій відповіді: Як знизити пакет через apt-get? . В основному, скачати необхідні .debпакети вручну, а потім встановити їх по одному з допомогою більш низького рівня dpkgі один з його аргументів насильницьких: --ignore-depends, --force-depends, --force-depends-version, або навіть --force-all.

У тому ж дусі, що і вище, ви маєте --force-downgradeаргумент:

          downgrade(*): Install a package, even if newer version of
          it is already installed.

          Warning:  At  present  dpkg  does  not  do any dependency
          checking on downgrades and therefore will not warn you if
          the  downgrade  breaks the dependency of some other pack‐
          age. This can  have  serious  side  effects,  downgrading
          essential system components can even make your whole sys‐
          tem unusable. Use with care.

Але це передбачає, що ви читали man dpkg, і що ви розумієте, що ви робите:

          Warning: These options are mostly intended to be used  by
          experts  only.  Using  them  without  fully understanding
          their effects may break your whole system.

Див. Помилка: номер версії не починається з цифри та Як встановити старішу версію Java та Як встановити старішу версію пакета, як рідкий 2.2.2? для прикладів:

sudo dpkg --force-downgrade -i your_mesa_package.deb

І дивіться Як я можу встановити пакет без встановлення деяких залежностей? для прикладу (разом із відповідним попередженням):

sudo dpkg --force-all -i your_mesa_package.deb

Ще один підхід полягатиме в тому, щоб створити макетний .debпакет, використовуючи equivsпакет (і, можливо, трохи інше ім'я). Тоді встановлення макетного пакету повинно дозволяти вам видалити "справжній" пакет, зберігаючи відповідні deps, а потім встановити старішу версію. Я не впевнений, як саме це працювало б, але перевірте цю релевантну тему для деталей: Як видалити борд, не знімаючи його залежностей .


4

Ви можете спочатку використати apt-markдля позначення всіх залежностей цільового пакету (а може бути і рекомендованих / запропонованих), встановлених у системі як встановлення вручну . Після цього встановіть попередні версії програмного забезпечення із apt-getчіткою згадкою версії.

  • Щоб перелічити залежність, рекомендовані та запропоновані пакети для цільового пакету:

    apt-cache show <target-package-name>
    
  • Позначення пакунків як встановлених вручну :

    sudo apt-mark manual <package-name(s)>
    

    (використовуйте це для всіх залежностей, рекомендацій та пропозицій.)

  • Видаліть цільовий пакет:

    sudo apt-get remove <target-package-name>
    
  • Щоб побачити список версій пакета, до яких ви можете зменшити / оновити, скористайтеся:

    apt-cache policy <target-package-name>
    
  • Встановіть цільову версію необхідного пакету:

    sudo apt-get install <target-package-name>=<target-package-version-number> 
    

    або

    sudo apt-get -t=<target release> install <target-package-name>
    

PS. Якщо список залежностей / рекомендованих / запропонованих пакетів, тобто тих, які слід позначати apt-mark, великий, збережіть призначений список упакованого виводу apt-cache show <target-package-name>в будь-який файл скажіть /path/to/fooі використовуйте apt-markв комбінації, як це:

cat /path/to/foo | xargs -imarkthese sudo apt-mark manual markthese

Цей метод може працювати, але замість позначення понад 100 пакунків я просто пішов з іншою відповіддю.
RolandiXor

@RolandiXor, ви можете використати apt-cache policy <target-package-name>список списку версій пакету, який ви можете зменшити / оновити до ..
точно

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

Я не думаю, що ти мене розумієш. У будь-якому випадку, я це виправив, і я видав щедрості (не можу переключити).
RolandiXor

1

Я щойно пережив больовий біль від оновлення до версії пакету, а потім вирішив знизити версію. Це відбувається через приватне сховище технічного обслуговування. У моєму випадку це стосувалося випробування останньої версії systemd 233 (ще не випущеної).

Ключовим є розуміння того, що вам потрібно вказати всі пакунки, які слід знизити. Якщо ви отримаєте це право, швидше за все, вдасться зробити те, що ви хочете. Якщо ви щось пропустите, apt скаже вам, що дія призведе до видалення багатьох пакетів. Щоб переконатися, що ми використовуємо прапор '-s', щоб спробувати знизити версію, перш ніж це зробити.

Кроки, які ви повинні зробити таким чином:

1) Перерахуйте всі залежності, які були модернізовані до висхідного потоку (використовуйте якесь інше ключове слово, якщо ваша ситуація відрізняється):

dpkg -l|grep upstream

Це дає вам список пакетів із номером версії за поточною версією.

2) Перерахуйте, яка правильна стабільна версія для кожного пакету:

for i in libnss-resolve:amd64 libsystemd0:amd64 libpam-systemd:amd64 libsystemd0:i386 libudev1:amd64 libudev1:i386 systemd systemd-sysv udev; do apt-cache show $i; done|grep Version

3) Перевірити все добре:

apt -s --allow-downgrades --no-remove --reinstall install libnss-resolve:amd64=232-21ubuntu5 libsystemd0:amd64=232-21ubuntu5 libpam-systemd:amd64=232-21ubuntu5 libsystemd0:i386=232-21ubuntu5 libudev1:amd64=232-21ubuntu5 libudev1:i386=232-21ubuntu5 systemd=232-21ubuntu5 systemd-sysv=232-21ubuntu5 udev=232-21ubuntu5

0 to upgrade, 0 to newly install, 9 to downgrade, 0 to remove and 0 not to upgrade.

(не впевнений, що для перевстановлення потрібно було btw, але це я зробив)

4) Вийміть -и і зробіть це.

apt --allow-downgrades --no-remove --reinstall install libnss-resolve:amd64=232-21ubuntu5 libsystemd0:amd64=232-21ubuntu5 libpam-systemd:amd64=232-21ubuntu5 libsystemd0:i386=232-21ubuntu5 libudev1:amd64=232-21ubuntu5 libudev1:i386=232-21ubuntu5 systemd=232-21ubuntu5 systemd-sysv=232-21ubuntu5 udev=232-21ubuntu5
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.