У меня есть несколько меза-пакетов, которые я обновил до версии PPA, прежде чем очистить PPA, чтобы я мог обновить свою систему. Различия в версиях незначительны (технически они одинаковы, только один набор библиотек был из git, а остальные - окончательные версии).
Если я попытаюсь понизить рейтинг с помощью Synaptic, apt-get или aptitude, я попаду в ад зависимости.
Есть ли способ понизить пакеты вручную (возможно, один за другим) и пометить их зависимые пакеты как неподвижные (если это имеет смысл), пока я не закончу?
P.S. этот вопрос: Как понизить версию пакета с помощью apt-get? немного отличается и не помогает в этой ситуации.
Я никогда не играл с этим раньше, но я бы предложил вам 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, а затем установить более старую версию. Я не уверен, как именно это будет работать, но проверьте подробности в этой соответствующей теме: Как удалить deb, не удаляя его зависимости .
Сначала вы могли бы использовать 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
Я только что прошел через боль в процессе обновления до версии пакета, выпущенной в апстриме, а затем решил перейти на более раннюю версию. Это было через частный репозиторий сопровождающих. В моем случае это было все о том, чтобы опробовать последнюю версию 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.
(не уверен, что --reinstall был требуется, кстати, но это то, что я сделал)
4) Удалите -s и сделайте это.
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