Когда apt-get
решает удалить пакет как часть установки другого пакета, это связано с объявленным конфликтом (который может не отражать фактический конфликт). Пакеты без мультиархитектуры конфликтуют с одним и тем же пакетом из другой архитектуры; как объяснено в ответе на Почему попытка установки 64-битной библиотеки через apt грозит удалением ряда требуемых 32-битных библиотек? Это часто случается с пакетами разработки.
Тем не менее, вы можете принудительно установить конфликтующий пакет, используя dpkg --force-sizes
. Вам нужно будет загрузить затронутые пакеты и установить их вручную, и вы не сможете использовать apt-get
, пока конфликт не будет разрешен (или, скорее, apt-get
будет настаивать на разрешении конфликта). Вы можете сломать пакеты, вовлеченные в конфликт, но, по крайней мере, вы можете попробовать ...
Я не знаю, как отключить обработку конфликтов apt-get
.
Альтернативой является исправление уязвимых пакетов; в большинстве случаев это достаточно просто и позволит избежать любых последующих проблем с apt
. Например, для harfbuzz
в Debian 8:
загрузите исходный код и извлеките его:
dget http://httpredir.debian.org/debian/pool/main/h/harfbuzz/ harfbuzz_0.9.35-2.dsc
cd harfbuzz-0.9.35
отредактируйте debian / control
и добавьте Multi-Arch: то же самое
после строки Architecture
в разделе Пакет: libharfbuzz- dev
добавьте запись в журнал изменений, чтобы ваши пользовательские пакеты не были заменены текущей версией из архива:
dch -n "Включить Multi-Arch в пакете -dev."
скомпилируйте пакет (вам нужно будет сделать это на компоновщике amd64
и компоновщике i386
- здесь pbuilder
или sbuild
)
dpkg-buildpackage -us -uc
Это создаст совместно устанавливаемые пакеты libharfbuzz-dev
. Это работает, потому что пакеты уже можно было установить совместно, им просто не хватало необходимых метаданных. Для harfbuzz
это было исправлено в Debian 9.
Используйте связанное монтирование /
, чтобы сделать оригинал /usr
(, который, вероятно, должен быть пустым, если /usr
был смонтирован поверх него до того, как /usr
был когда-либо заполнен ), и скопируйте смонтированный /usr
над ним.
# mkdir /root/underlyingroot
# mount --bind --make-private / /root/underlyingroot
# cp -ax /usr /root/underlyingroot
# umount /root/underlyingroot
--make-private
предназначен для отмены случая, когда /
монтируется с опциейshared
, что при работеsystemd
. В противном случае все, что смонтировано (, например :автоматическое монтирование вставленного устройства и т. д. )между mount
и umount
выше, будет отражено внутри /root/underlyingroot
и помешает простой umount /root/underlyingroot
работе после.
Теперь, когда копирование завершено, вы можете отредактировать /etc/fstab
и удалить точку монтирования /usr
.
Если вообще ничего не используется /usr
, вы также можете umount
немедленно /usr
и закончить. Но в настоящее время трудно заставить все работать без использования /usr
, если не в однопользовательском режиме или режиме восстановления, а сегодня даже даже не всегда (, например, в более новой CentOS ), поэтому перезагрузка, вероятно, потребуется в любом случае. Вы также можете рассмотреть umount --lazy /usr
, что позволит немедленно избавиться от /usr
и выполнять любые новые обновления /usr
во внутренней памяти, а не во внешней, но внешняя все равно потребуется до следующей перезагрузки.