- Вопрос или проблема
- Ответ или решение
- Проблема с блокировкой пакетов
- Анализ вывода команды emerge
- Шаги для решения проблемы
- 1. Резервное копирование
- 2. Синхронизация дерева портежей
- 3. Установите актуальный профиль
- 4. Поэтапное обновление Portage и Python
- 5. Установка дополнительных утилит
- 6. Восстановление файла world и окончательное обновление
- 7. Дополнительные команды
- Заключение
Вопрос или проблема
У нас на работе есть старый сервер разработки, работающий на Gentoo. Я хотел бы обновить эту систему, но постоянно сталкиваюсь с проблемами системы упаковки. Мне кажется, что есть зависимости от нескольких версий различных пакетов, и я не могу понять, как это исправить.
Самая большая проблема, скорее всего, связана с Python и Portage. Мне нужен более новый Portage, но, похоже, существуют циклические зависимости.
Я пробовал различные решения, но не совсем уверен, как действовать дальше. Есть ли идеи, которые могут помочь мне решить эту проблему?
Дополнительная информация
Вот (соответствующая часть) вывод, полученный при запуске emerge --update --newuse --deep @world
(много обычного вывода ....)
[ebuild U ] app-misc/mc-4.7.0.3 [4.6.1-r4] USE="edit%* -slang*"
....
[blocks B ] >=dev-lang/python-2.6.6 (">=dev-lang/python-2.6.6" блокирует sys-apps/portage-2.1.6.7)
[blocks B ] <sys-apps/portage-2.1.7.16 ("<sys-apps/portage-2.1.7.16" блокирует app-shells/bash-4.1_p9)
[blocks B ] <sys-apps/portage-2.1.9 ("<sys-apps/portage-2.1.9" блокирует dev-lang/python-2.7.1-r1)
* Ошибка: Список пакетов выше содержит пакеты, которые не могут быть
* установлены одновременно на одной и той же системе.
(dev-lang/python-2.7.1-r1, ebuild запланирован для слияния) вытащен
=dev-lang/python-2* требуется (dev-vcs/mercurial-1.7, ebuild запланирован для слияния)
=dev-lang/python-2*[threads] требуется (dev-vcs/mercurial-1.7, ebuild запланирован для слияния)
=dev-lang/python-2* требуется (dev-libs/glib-2.28.6, ebuild запланирован для слияния)
(и ещё 1)
(app-shells/bash-4.1_p9, ebuild запланирован для слияния) вытащен
>=app-shells/bash-3.2_p17 требуется (sys-apps/portage-2.1.9.42, ebuild запланирован для слияния)
app-shells/bash требуется (sys-block/di-4.18, ebuild запланирован для слияния)
app-shells/bash требуется (app-admin/perl-cleaner-2.7, ebuild запланирован для слияния)
(и ещё 2)
(dev-lang/python-3.1.3-r1, ebuild запланирован для слияния) вытащен
dev-lang/python требуется (app-admin/python-updater-0.9, ebuild запланирован для слияния)
>=dev-lang/python-3 требуется (sys-apps/portage-2.1.9.42, ebuild запланирован для слияния)
=dev-lang/python-3.1* требуется (dev-java/java-config-2.1.11-r3, ebuild запланирован для слияния)
Вот соответствующая часть вывода при запуске emerge --pretend --depclean
Подсчет зависимостей... готово!
* Зависимости не могут быть полностью разрешены из-за
* следующих требуемых пакетов, которые не установлены:
*
* >=dev-lang/python-2.4 вытащен:
* sys-apps/portage-2.1.6.7
*
* dev-lang/python вытащен:
* dev-java/java-config-2.1.7
*
* dev-lang/python вытащен:
* dev-libs/libxml2-2.6.31
*
* <dev-lang/python-2.6.6 вытащен:
* sys-apps/portage-2.1.6.7
*
* >=dev-lang/python-2.2 вытащен:
* dev-libs/beecrypt-4.1.2-r1
*
* virtual/python вытащен:
* dev-python/pycrypto-2.0.1-r6
*
* >=dev-lang/python-2.3 вытащен:
* dev-vcs/mercurial-1.0.2
*
* >=dev-java/java-config-2.1.9-r1 вытащен:
* dev-libs/beecrypt-4.1.2-r1
*
* virtual/python вытащен:
* dev-lang/swig-1.3.34
*
* dev-lang/python вытащен:
* net-fs/samba-3.0.28a-r1
*
* >=dev-lang/python-2.2 вытащен:
* app-arch/rpm-4.4.6-r6
*
* >=virtual/python-2.2.1 вытащен:
* sys-libs/libcap-1.10-r11
*
* dev-lang/python вытащен:
* sys-libs/cracklib-2.8.9-r1
*
Я столкнулся с той же проблемой всего пару дней назад. У меня нет точного способа, как это сделать, но вот общий порядок действий:
Сначала посмотрите на /var/lib/portage/world
. Сделайте резервную копию и оставьте только пакеты, необходимые вашей системе для загрузки. Вот немного содержания, чтобы помочь вам начать:
app-admin/syslog-ng
net-firewall/iptables
net-misc/dhcpcd
sys-apps/pciutils
sys-apps/slocate
sys-apps/usbutils
sys-boot/grub
sys-kernel/gentoo-sources
sys-power/acpid
sys-process/vixie-cron
virtual/inetd
Все остальное будет обновлено позже.
Самая критическая часть — это обновить portage и python до последних версий, поэтому давайте сосредоточимся на этом.
-
Синхронизируйте директорию portage:
emerge --sync
или:
emerge-webrsync
-
Установите правильный профиль
eselect profile list eselect profile set <x>
-
Обновляйте python / portage шаг за шагом.
Посмотрите на вашу текущую установленную версию portage. Обновите portage до следующей версии выше вашей текущей (даже если она помечена как ~x86), затем сделайте то же самое для python. После обновления python убедитесь, что вы запустили
python-updater
.Повторяйте этот процесс до тех пор, пока python/portage не будут обновлены до актуальных версий. (Некоторые незначительные обновления версий можно пропустить. Вы сами увидите, какие версии вызывают ошибки компиляции, а какие нет.)
-
Как только они начнут работать, попробуйте установить несколько других пакетов, так как они могут помочь вам в вашей задаче.
app-portage/ufed app-portage/autounmask app-portage/gentoolkit
-
Как только python/portage будут обновлены, вы можете восстановить свой старый файл world и обновить систему.
emerge -pvauDN world
Вам может понадобиться вызвать:
emerge ... emerge --depclean revdep-rebuild
несколько раз в процессе сборки.
Если проблема в python, попробуйте запустить python-updater
. Обратите внимание, что вы можете выбрать текущую версию python с помощью команды eselect
.
Ответ или решение
Когда вы сталкиваетесь с проблемами блокировки пакетов при обновлении системы Gentoo с помощью команды emerge
, это может стать настоящей головной болью, особенно на старых серверах. Давайте разберем проблему и найдем возможные решения.
Проблема с блокировкой пакетов
На основании представленных вами данных, основная проблема заключается в циклических зависимостях между версиями Python и Portage. Это делает невозможным одновременную установку нескольких нужных пакетов, что приводит к блокировке.
Анализ вывода команды emerge
Имеется несколько конфликтующих зависимостей:
-
Python:
>=dev-lang/python-2.6.6
блокирует установкуsys-apps/portage-2.1.6.7
.app-shells/bash
также имеет свои ограничения.
-
Portage:
- Версия
sys-apps/portage-2.1.7.16
конфликтует с некоторыми установленными пакетами.
- Версия
Эта ситуация часто возникает, когда системные пакеты уже устарели, и современная версия Portage требует более новых версий Python, тогда как уже установленные пакеты требуют более старых.
Шаги для решения проблемы
Ниже предложен план действий, который поможет вам пройти через этот процесс и восстановить работоспособность вашей системы.
1. Резервное копирование
Перед началом любых изменений, сделайте резервную копию файла /var/lib/portage/world
. Этот файл содержит список всех установленных вами пакетов, и вы можете в дальнейшем восстановить его, чтобы не потерять нужные вам пакеты.
cp /var/lib/portage/world ~/world-backup
2. Синхронизация дерева портежей
Для обновления списка доступных пакетов и исправления возможных ошибок, выполните синхронизацию:
emerge --sync
или
emerge-webrsync
3. Установите актуальный профиль
С помощью команды eselect
убедитесь, что вы используете актуальный профиль:
eselect profile list
eselect profile set <номер_профиля>
4. Поэтапное обновление Portage и Python
- Пробуйте одновременно обновлять Portage и Python поэтапно, начиная с минимально возможных версий для следующего обновления.
- Убедитесь, что у вас установлены версии, безопасные для вашей системы, даже если они находятся в состоянии "тестирования" (
~x86
). - Запускайте
python-updater
после каждого обновления Python.
Примерная последовательность команд:
emerge sys-apps/portage-<следующая_версия>
emerge dev-lang/python-<следующая_версия>
python-updater
5. Установка дополнительных утилит
Как только Python и Portage обновлены и работают корректно, рекомендуется установить несколько утилит для дальнейшего управления пакетами:
emerge app-portage/ufed
emerge app-portage/autounmask
emerge app-portage/gentoolkit
6. Восстановление файла world и окончательное обновление
После того как обновления пройдены и система стабилизировала свои пакеты, можно восстановить первоначальный файл world и выполнить повторное обновление:
mv ~/world-backup /var/lib/portage/world
emerge -pvauDN world
7. Дополнительные команды
Во время процесса вы можете столкнуться с неполными зависимостями или конфликтами, требующими исправлений. Используйте следующие команды, чтобы помочь в этом:
emerge --depclean
revdep-rebuild
Заключение
Решение проблем с зависимостями в Gentoo требует терпения и аккуратности. Следуя вышеописанным шагам и обращая внимание на вывод команд emerge
, вы сможете успешно обновить вашу систему. Не забывайте всегда делать резервные копии и тщательно изучать вывод сообщений, чтобы избежать повторных ошибок. Удачи в обновлении!