В начало → Полное обновление системы → ??? |
Запустить emerge -uDpv --newuse world и проверить что USE-флаги для всех пакетов выставлены корректно, и при необходимости скорректировать
USE-флаги выставляются в /etc/make.conf и /etc/portage/package.use
Запуск обновления системы (если не нужно обновлять toolchain)
Если
emerge -uDav --newuse world
показывает что будет обновляться пакет входящий в toolchain (linux-headers, glibc, binutils или gcc), то крайне рекомендуется полностью перекомпилировать всю систему — см. следующий пункт — а иначе можно вместо следующего пункта просто запустить:
emerge -uDav --newuse world
Некоторые причины не использовать emerge -U вместо -u
Причина 1: Проблемы со SLOT
Это, к примеру, происходит потому, что некоторые люди хотели gimp-2 вместо gimp-1.2. Представьте ситуацию, где gimp-1.2 помечен stable и находится в SLOT 1, gimp-2 помечен unstable и находится в SLOT 2. Теперь при выполнении ACCEPT_KEYWORDS=~x86 emerge gimp получите gimp-2.
Позже, когда вы посчитаете, что наступило время обновить свою систему чем-либо похожим на "emerge -U world", эта команда установит gimp-1.2, потому, что gimp находится в world-файле, и флаг "-U" не обрабатывает SLOT должным образом.
Причина 2: Проблемы, в случае удаления ebuild-ов с Portage-дерева.
Допустим, в Portage находятся 2 версии пакетов foo, foo-1.4 (помеченный как stable) и foo-1.6 (помеченный как unstable). Вы хотите вариант unstable и делаете emerge, как с вышеуказанным gimp. Позже обновляете world как было сказано выше, но в промежутке этого времени вышло критическое обновление для foo-1.6 — foo-1.6.1. Теперь появляется несколько возможностей обработки.
foo-1.6 был удален из Portage. Будет установлен foo-1.4, несмотря на "снижение" версии вместо флага "-U"
Ситуация будет еще хуже, если foo-1.6 не был удалён из Portage по какой-либо причине: foo-1.6 (тот, что с критической уязвимостью) будет оставаться на вашей системе до тех пор, пока не будет помечено stable что-либо выше чем foo-1.6.
Обновление одного из пакетов входящих в toolchain
Если обновляется хотя-бы один из linux-headers, glibc, binutils или gcc, то рекомендуется пересобрать их дважды, после чего весь system, после чего весь world.
Примечание: Цель двойной компиляции toolchain — получить гарантированно стабильный и корректный toolchain не зависящий от предыдущего. Перекомпилировать system/world после этого жёсткой необходимости нет, по крайней мере если остальной софт продолжает работать (возможно даже используя библиотеки из старого toolchain — см. предыдущие пункты об апгрейде).
Цель перекомпиляции system/world — чтобы весь софт получил потенциальное преимущество от установки нового toolchain. system перекомпилируется перед world из тех-же соображений, т.к. при компиляции программ из world используются утилиты из system.
Если увеличивается первая или вторая цифра версии gcc, то перед второй сборкой нужно переключиться на новую версию через gcc-config — иначе новый gcc просто установится параллельно со старым в "новый слот", но по умолчанию использоваться будет старый.
При сборке system после двойной перекомпиляции toolchain нет необходимости опять компилировать toolchain как часть system. Аналогично при сборке world после system нет небходимости опять компилировать пакеты из system как часть world. Это можно попробовать обойти либо вручную, либо используя скрипты [1], либо через бинарные пакеты и `emerge -k` (я предпочитаю последний вариант).
Итак, рекомендованный набор команд:
# для того, чтобы безопасно использовать `emerge -k` нужно очистить
# каталог с текущими бинарными пакетами
# (напр., переместить его в /tmp/portage-packages)
pkgdir=$(portageq pkgdir)
mv $pkgdir /tmp/portage-packages1
install -d -o portage -g portage $pkgdir
# первая сборка toolchain
emerge linux-headers glibc binutils gcc-config gcc
# выбрать новый gcc если он установился в новый слот
gcc-config имя_или_номер_нового_gcc
# см. `gcc-config -l`
source /etc/profile
# компиляция toolchain с созданием бинарных пакетов
emerge -b glibc binutils gcc portage
# не компилить glibc, binutils и gcc
emerge -bke system
# не компилить предыдущие пакеты (включая system)
emerge -bke world
Примечание: Чисто теоретически существует пакет binutils-config, который когда-нибудь может потребоваться использовать аналогично gcc-config.
В начало → Полное обновление системы → ??? |