Обновление Gentoo
Про что идёт речь?
Tips and tricks в одном месте про обновление системы. Новичкам будет полезно, и для себя памятка – то что используется “повседневно”, попробую вербализовать с оглядкой на wiki, будет много wiki.
Этапы обновления
- синхронизация.
- скачивание исходных файлов.
- компилляция и установка.
Синхронизация
Расположение ebuild:
ранее использовалась переменная $PORTDIR сейчас определена в переменной location
/etc/portage/repos.conf/gentoo.conf
location = /var/db/repos/gentoo
про репозитории будет чуть пониже…
есть различные варианты синхронизации ебилдов
- rsync
- git
- svn
- webrsync
- cvs
- laymansync (в истории)
из коробки rsync (см /usr/share/portage/config/repos.conf
)
когда появилась синхронизация дерева по git все остальные перестали существовать (для меня). Из плюсов очень удобно управлять репозиториями, очень просто добавить свой локальный гитхабовский репозиторий с ебилдами, указать приоритет и т.д. все плюсы git
Пересказывая вики настройки синхронизации по git:
файл /etc/portage/repos.conf/gentoo.conf
приобретает черты
[DEFAULT]
main-repo = gentoo
[gentoo]
location = /var/db/repos/gentoo
sync-uri = git://anongit.gentoo.org/repo/sync/gentoo.git
sync-depth = 1
auto-sync = yes
sync-git-verify-commit-signature = true
sync-openpgp-key-path = /usr/share/openpgp-keys/gentoo-release.asc
sync-openpgp-keyserver = hkps://keys.gentoo.org
sync-openpgp-key-refresh-retry-count = 40
sync-openpgp-key-refresh-retry-overall-timeout = 1200
sync-openpgp-key-refresh-retry-delay-exp-base = 2
sync-openpgp-key-refresh-retry-delay-max = 60
sync-openpgp-key-refresh-retry-delay-mult = 4
Свой репозитарий можно добавить в этот же конфиг, или (лучше) создать отдельно в /etc/portage/repos.conf/your.conf
минимально
[aweal]
location = /var/db/repos/aweal
sync-type = git
sync-uri = https://github.com/aweal/overlay.git
auto-sync = yes
priority = 10
layman
в истории, использовался ранее для настройки оверлеев и их синхронизации - layman-updater -R
На смену пришел eselect repository
итак, синхронизация.
В самом запущенном варианте, например, когда еще не настроены вышеуказанные конфиги (в хендбуке именно этот вариант): emerge-webrsync
Остальные:
- eix-sync
- emerge --sync
- emaint sync
Разница минимальная, если используется git и eselect repository то emaint -a sync, остальные тоже работают если все настроено, короче вскусовщина
fetch
Скачивание исходников…
Это лишний шаг т.к. после обновления дерева ebuld-ов можно запускать обновление:
emerge --sync && emerge -uDN @world
здесь и далее в качестве параметра указан set world, но можно и emerge -uDN world
Если же нужно скачать или вытащить URL для закачивания.
Актуально если лимитирован трафик (или если нет интернета), сейчас все больше:
SN 1054 ~ # emerge -pf discord
These are the packages that would be fetched, in order:
Calculating dependencies... done!
Dependency resolution took 6.88 s (backtrack: 0/20).
https://dl.discordapp.net/apps/linux/0.0.76/discord-0.0.76.tar.gz
Ну и здесь же, нужно указать про FEATURES parallel-fetch, которая определена в /usr/share/portage/config/make.globals, в редких случаях (если distfiles в сетевой папке) можно попасть в race conditions; решение – переменная переопределяется в make.conf
Сборка
Подготовка, различная дополнительная информация.
Для вывода информации какие пакеты будут обновлены – флаг --pretend, -p (хорошо комбинируется с --tree, -t - вывод в виде дерева зависимостей)
emerge -uDUpt @world
[ebuild FU #] sys-block/partitionmanager-24.12.0 [24.08.3]
[ebuild FU #] net-p2p/ktorrent-24.12.0 [24.11.90]
[ebuild U ] net-im/discord-0.0.76 [0.0.75]
[ebuild FU #] media-gfx/kio-ps-thumbnailer-24.12.0 [24.11.90]
[ebuild FU #] kde-misc/markdownpart-24.12.0 [24.11.90]
[ebuild FU #] kde-misc/kio-gdrive-24.12.0 [24.11.90]
[ebuild FU #] kde-misc/kdeconnect-24.12.0 [24.11.90]
[ebuild FU #] app-editors/ghostwriter-24.12.0 [24.08.3]
[nomerge ] net-p2p/ktorrent-24.12.0 [24.11.90]
[ebuild FU #] net-libs/libktorrent-24.12.0 [24.11.90]
[nomerge ] sys-block/partitionmanager-24.12.0 [24.08.3]
[ebuild FU #] sys-libs/kpmcore-24.12.0 [24.08.3]
[ebuild FU #] kde-misc/kio-gdrive-common-24.12.0 [24.08.3]
легенда из man emerge:
N new (not yet installed)
S new SLOT installation (side-by-side versions)
U updating (to another version)
D downgrading (best version seems lower)
r reinstall (forced for some reason, possibly due to slot or sub-slot)
R replacing (remerging same version)
F fetch restricted (must be manually downloaded)
f fetch restricted (already downloaded)
I interactive (requires user input)
B blocked by another package (unresolved conflict)
b blocked by another package (automatically resolved conflict)
Если нужно полюбопытствовать какие есть флаги / версии пакета перед установкой.
SN 1054 ~ # eshowkw dev-qt/qtwebengine
Keywords for dev-qt/qtwebengine:
| | u |
| a a p s a l r | n |
| m r h p p l o m i s m | e u s | r
| d a m p p c a x p o i s 3 6 | a s l | e
| 6 r 6 p p 6 r 8 h n p c 9 8 | p e o | p
| 4 m 4 a c 4 c 6 a g s v 0 k | i d t | o
------------------+-----------------------------+----------------+-------
5.15.14_p20240510 | + o + o o o o o o o o o o o | 8 o 5/5.15 | gentoo
5.15.16_p20241115 | ~ o ~ o o o o o o o o o o o | 8 o | gentoo
------------------+-----------------------------+----------------+-------
6.7.2 | + o + o o o o o o o o o o o | 8 o 6/6.7.2 | gentoo
------------------+-----------------------------+----------------+-------
6.7.3 | + o ~ o o o o o o o o o o o | 8 o 6/6.7.3 | gentoo
------------------+-----------------------------+----------------+-------
[I]6.8.1 | ~ o ~ o o o o o o o o o o o | 8 o 6/6.8.1 | gentoo
------------------+-----------------------------+----------------+-------
6.8.9999 | o o o o o o o o o o o o o o | 8 o 6/6.8.9999 | gentoo
------------------+-----------------------------+----------------+-------
6.9999 | o o o o o o o o o o o o o o | 8 o 6/6.9999 | gentoo
про лайф сборки
обычно именуются 9999 и собираются из исходников git репозитория (обновлять их придётся отдельно: emerge @smart-live-rebuild) или “нестабильные” ебилды (например нестабильные nvidia-drivers).
Размаскироваются знаком ** см вики:
cat /etc/portage/package.accept_keywords/nvidia.accept_keywords
x11-drivers/nvidia-drivers **
ну и здесь же про USE флаги, подробное их описание
equery u x11-drivers/nvidia-drivers
equery u x11-drivers/nvidia-drivers
[ Legend : U - final flag setting for installation]
[ : I - package is installed with flag ]
[ Colors : set, unset ]
* Found these USE flags for x11-drivers/nvidia-drivers-565.77:
U I
+ + X : Add support for X11
+ + abi_x86_32 : 32-bit (x86) libraries
- - dist-kernel : Enable subslot rebuilds on Distribution Kernel upgrades
+ + kernel-open : Use the open source variant of the drivers (Turing/Ampere+ GPUs only, aka GTX 1650+ -- recommended with >=560.xx drivers if usable)
+ + modules : Build the kernel modules
- - modules-compress : Install compressed kernel modules (if kernel config enables module compression)
- - modules-sign : Cryptographically sign installed kernel modules (requires CONFIG_MODULE_SIG=y in the kernel)
- - persistenced : Install the persistence daemon for keeping devices state when unused (e.g. for headless)
- - powerd : Install the NVIDIA dynamic boost support daemon (only useful with specific laptops, ignore if unsure)
+ + static-libs : Install the XNVCtrl static library for accessing sensors and other features
+ + strip : Allow symbol stripping to be performed by the ebuild for special files
+ + tools : Install additional tools such as nvidia-settings
+ + wayland : Enable dev-libs/wayland backend
время сборки
app-portage/genlop мастхев (можно узнать время сборки пакета
genlop -t firefox
или что собирается в настоящее времяgenlop -c
ну и другие примеры есть в man genlop)
emerge -uDUp @world | genlop --pretend
These are the pretended packages: (this may take a while; wait...)
Estimated update time: 11 hours, 17 minutes.
Насколько точно? очень и очень приблизительно, но это и логично, ведь например тот же ff на моей машине собирается с большим разбросом:
SN 1054 ~ # genlop -t firefox | grep time
merge time: 14 minutes and 57 seconds.
merge time: 17 minutes and 21 seconds.
merge time: 31 minutes and 36 seconds.
merge time: 15 minutes and 55 seconds.
merge time: 17 minutes and 39 seconds.
merge time: 17 minutes and 48 seconds.
merge time: 15 minutes and 47 seconds.
merge time: 14 minutes and 32 seconds.
merge time: 1 hour, 25 minutes and 13 seconds.
merge time: 1 hour, 3 minutes and 39 seconds.
merge time: 27 minutes.
merge time: 5 hours, 32 minutes and 8 seconds.
merge time: 27 minutes and 51 seconds.
merge time: 27 minutes and 44 seconds.
merge time: 21 minutes and 45 seconds.
merge time: 1 hour, 3 minutes and 7 seconds.
ну и сама сборка
emerge -uDU @world
что может пойти не так?
- Прерывается сборка
-
если это один пакет и нет багрепорта (и/или не хочется разбираться) то проще будет его пропустить: emerge –resume –skip-first
-
Если нужно постоянно “докомпиливать” при прерывании то есть FEATURES=“keepwork”
-
В ряде случаев когда обрывается на нехватки памяти или места на диске в процессе сборки (после решения проблемы) можно вручную “докомпилить”, так же как и во время попыток исправления исходников (хотя все же проще вытащить проблемную команду из лога):
SN 1054 ~ # emerge dev-qt/qtwebengine
Calculating dependencies... done!
Dependency resolution took 1.52 s (backtrack: 0/20).
>>> Verifying ebuild manifests
>>> Running pre-merge checks for dev-qt/qtwebengine-6.8.1
* Checking for at least 24 GiB RAM ... [ ok ]
* Checking for at least 9 GiB disk space at "/tmp/portage/dev-qt/qtwebengine-6.8.1/temp" ... [ ok ]
* Checking for at least 360 MiB disk space at "/usr" ... [ ok ]
>>> Emerging (1 of 1) dev-qt/qtwebengine-6.8.1::gentoo
>>> Jobs: 0 of 1 complete, 1 running Load avg: 12.7, 12.3, 8.6^C
Exiting on signal 2
SN 1054 ~ # ebuild /var/db/repos/gentoo/dev-qt/qtwebengine/qtwebengine-6.8.1.ebuild merge
>>> Existing ${T}/environment for 'qtwebengine-6.8.1' will be sourced. Run
>>> 'clean' to start with a fresh environment.
>>> Checking qtwebengine-6.8-patchset-7.tar.xz's mtime...
>>> Checking qtwebengine-everywhere-src-6.8.1.tar.xz's mtime...
>>> WORKDIR is up-to-date, keeping...
* Checking for at least 24 GiB RAM ... [ ok ]
* Checking for at least 9 GiB disk space at "/tmp/portage/dev-qt/qtwebengine-6.8.1/temp" ... [ ok ]
* Checking for at least 360 MiB disk space at "/usr" ... [ ok ]
>>> It appears that 'setup' has already executed for 'qtwebengine-6.8.1'; skipping.
>>> Remove '/tmp/portage/dev-qt/qtwebengine-6.8.1/.setuped' to force setup.
>>> It appears that 'unpack' has already executed for 'qtwebengine-6.8.1'; skipping.
>>> Remove '/tmp/portage/dev-qt/qtwebengine-6.8.1/.unpacked' to force unpack.
>>> It appears that 'prepare' has already executed for 'qtwebengine-6.8.1'; skipping.
>>> Remove '/tmp/portage/dev-qt/qtwebengine-6.8.1/.prepared' to force prepare.
>>> It appears that 'configure' has already executed for 'qtwebengine-6.8.1'; skipping.
>>> Remove '/tmp/portage/dev-qt/qtwebengine-6.8.1/.configured' to force configure.
>>> Compiling source in /tmp/portage/dev-qt/qtwebengine-6.8.1/work/qtwebengine-everywhere-src-6.8.1 ...
- Если родитель запустивший emerge -uDN @world пропал (часто бывает при обновлении по ssh с разрывом соединения или если ошибочно закрыть konsole).
- первое золотое правило app-misc/screen
если ты на автомате владеешь навигацией ^p ^n ^b ^f etc то наверно не раз пытался перескочить на начало строки по ^a и вызывал shift screen (с матами), но есть годный лайфхак как перейти на начало строки в screen - ^a a. очень логично, и потом на автомате если ^a не сработало добавляешь a. Ну и еще наверно хот-кей C-a F (fit) важен – т.к. разные размеры консоли на VDS и локалхосте. Все хоткеи доступны через ^a ?
- второй вариант - nohup - вывод если не перенаправлен будет в nohup.out, подробнее смотри man nohup он очень краткий.
-
если хочется странного из оверлея kde то рано или поздно получится
Fetch instructions for kde-frameworks/kglobalaccel-6.9.0: * _ _ _ _ ____ _____ _ _____ _ ____ _____ ____ * | | | | \ | | _ \| ____| | | ____| / \ / ___|| ____| _ \ * | | | | \| | |_) | _| | | | _| / _ \ \___ \| _| | | | | * | |_| | |\ | _ <| |___| |___| |___ / ___ \ ___) | |___| |_| | * \___/|_| \_|_| \_\_____|_____|_____/_/ \_\____/|_____|____/ - * ____ _ ____ _ __ _ ____ _____ * | _ \ / \ / ___| |/ / / \ / ___| ____| * | |_) / _ \| | | ' / / _ \| | _| _| * | __/ ___ \ |___| . \ / ___ \ |_| | |___ * |_| /_/ \_\____|_|\_\/_/ \_\____|_____| - * kde-frameworks/kglobalaccel-6.9.0 has not been released to the public yet * and is only available to packagers right now. - * This is not a bug. Please do not file bugs or contact upstream about this. - * Please consult the upstream release schedule to see when this * package is scheduled to be released: * https://community.kde.org/Schedules/Frameworks
во-первых нужно размаскировать весь сет
sed -r 's/.{,1}/=/' /var/db/repos/kde/profiles/package.mask/kde-gear-24.12.0
перенаправлять с осторожностью там еще комментарии есть.
во вторых … подождать релиза google calendar
в ожидании релиза можно спокойно обновляться
emerge -uDN @world --exclude 'kde-frameworks/* kde-apps/*'
или переходить на live-версии (для обновлении которых есть сет @smart-live-rebuild)
-
Неявные ошибки.
в большинстве случаев проще перезапустить обновление, но для понимания и для частных случаев разбор
-
смотрите логи:
-
- обычно есть в выводе: /var/log/portage/net-im:discord-0.0.76:20241208-182707.log
Downloading 'https://dl.discordapp.net/apps/linux/0.0.76/discord-0.0.76.tar.gz' --2024-12-08 21:27:07-- https://dl.discordapp.net/apps/linux/0.0.76/discord-0.0.76.tar.gz Resolving dl.discordapp.net... 188.114.98.225, 188.114.99.225, 2a06:98c1:3122:e000::1, ... Connecting to dl.discordapp.net|188.114.98.225|:443... connected. OpenSSL: error:0A000126:SSL routines::unexpected eof while reading Unable to establish SSL connection. !!! Couldn't download 'discord-0.0.76.tar.gz'. Aborting.
- обычно есть в выводе: /var/log/portage/net-im:discord-0.0.76:20241208-182707.log
-
-
если нет то build.log
cat /tmp/portage/net-im/discord-0.0.76/temp/build.log Downloading 'https://dl.discordapp.net/apps/linux/0.0.76/discord-0.0.76.tar.gz' --2024-12-08 21:27:07-- https://dl.discordapp.net/apps/linux/0.0.76/discord-0.0.76.tar.gz Resolving dl.discordapp.net... 188.114.98.225, 188.114.99.225, 2a06:98c1:3122:e000::1, ... Connecting to dl.discordapp.net|188.114.98.225|:443... connected. OpenSSL: error:0A000126:SSL routines::unexpected eof while reading Unable to establish SSL connection. !!! Couldn't download 'discord-0.0.76.tar.gz'. Aborting.
-
переменная PORTAGE_TMPDIR в моем случае была переопределена. The PORTAGE_TMPDIR variable defines the location of the temporary files for Portage. The value defaults to /var/tmp, resulting in /var/tmp/portage for the build location. В моем случае (tmpfs) PORTAGE_TMPDIR=”/tmp”, у вас может быть другой!
-
- /var/log/emerge-fetch.log
-
-
/var/log/emerge.log
дале гугл и https://bugs.gentoo.org/
-
медитативный вуайеризм.
-
legacy (снова) раньше тот же emerge -uDN world выводил все содержимое build.log в первый файловый дескриптор, но можно и вернуть:
emerge --ignore-default-opts --jobs=1 --quiet-build=n uDN @world
хотя, если честно, проблем с многопоточной компиляцией сейчас нет.
-
quiet-build=y имеет вывод типа
>>> Emerging (1050 of 100500) dev-qt/qtwebengine-6.8.1::gentoo >>> Jobs: 10 of 100500 complete, 1005 running Load avg: 3.09, 1.56, 1.32
и не просто понять какой из пакетов сейчас устанавливается (хотя какая разница, если честно), но все же, вместо того чтобы искать что там сейчас компилится есть
genlop -ci
для особо долгих процессов можно почекать сколько там осталось (минуя ETA из genlop) что-то типа:
tail -f /tmp/portage/dev-qt/qtwebengine-6.8.1/temp/build.log | grep -o '^[^]]*'
можно устроить вывод в строку используя цикл: что-то типа
SN 1054 ~ # while true; do echo -en $(genlop -c | grep ETA) && echo -en "\033[1A\n" ; sleep 2; done
-
- или же
watch "tail -n 1 /tmp/portage/dev-qt/qtwebengine-6.8.1/temp/build.log | grep -o '^[^]]*'"
Остановлюсь поподробнее – полезные опции:
-c, --color – цветной вывод (по умолчанию нет).
-n, --interval 2 – аналог sleep 2 если выводить в цикле (пример выше)
-q, --equexit 10 – если 10 циклов нет изменений в выводе – выход
-g, --chgexit – если поменялся вывод то выход.
можно отслеживать длительные процессы и по завершению выводить статус выхода в файл $? > /tmp/exit_status_file и устраивать межскриптовые гонки
watch -g /tmp/exit_status_file
как только изменится содержимое файла watch прервётся.
можно “следить” сразу выводом за нескольких программ
watch -n 1 --no-title "genlop -ci; echo; echo; tail -v -n 2 /var/log/emerge.log"
так же можно передать функцию в watch:
fn_watch{ genlop -ci echo tail -n1 -v "$1" echo ""; tail -n1 -v /var/log/emerge.log } export -f fn_watch watch q1 -c -x bash -c "fn_watch"
После установки…
обновление конфигурационных файлов.
dispatch-conf или etc-update
от себя рекомендую вручную каждый конф обновлять, т.к. большинство изменений просто затрется…
еще момент. Если пропустить слияние и оставить старый (-9 to discard all updates AND not use ‘rm -i’), после повторной переустановки пакета dispatch-conf не будет пытаться обновить конфигии, т.к. он уже помечен как “обработанный”, я так попался с bash. Ну и решение:
emerge bash --noconfmem
автоматизация обновления ядра
идея проста – при обновлении gentoo-sourses автоматически обновлять ядро (однотипные действия же: старый конфиг скопировать в /usr/src/linux, make oldconifg make make_modueles install и make install). Реализуется созданием /etc/portage/env/sys-kernel/gentoo-sources с переопределнием post_pkg_postinst
есть нюанс – если вызвать по очереди в скрипте на старте обновления создается lock файл Во время обновления (например собралось несколько пакетов, начинает устанавливаться gentoo-sources) и вызов нового инстанса, например, emerge @module-rebuild приведет к race condition.
Я решил строчкой touch /tmp/.kerupdate
cat /etc/portage/env/sys-kernel/gentoo-sources
function post_pkg_postinst() {
touch /tmp/.kerupdate
}
и уже по завершении обновления в конце скрипта проверять на наличие файла – если в наличии запускается скрипт обновления ядра. Велосипед? Да, но есть и
другой вариант virtual/dist-kernel
(он мне нравится гораздо меньше, как и сборка ядра не “вручную”), в этом кайф gentoo – день потратил на создание конфига ядра сидишь урчишь до глобального обновления железа…
user patches
Крайне удобная вещь. Особенно если нужно каждый раз исправлять в исходниках одну и туже строчку, мне например хочется каждый раз изменять поведение gwenview в режиме spotlight и выходить не из режима а из программы -
cat /etc/portage/patches/kde-apps/gwenview/spotlightmode-quit.patch
--- a/app/spotlightmode.cpp 2024-05-17 01:09:07.000000000 +0300
+++ b/app/spotlightmode.cpp 2024-06-03 13:01:16.137964554 +0300
@@ -9,6 +9,7 @@
#include "spotlightmode.h"
// Qt
+#include <QApplication>
#include <QHBoxLayout>
#include <QPushButton>
@@ -53,7 +54,7 @@
void SpotlightMode::emitButtonQuitClicked()
{
GwenviewConfig::setSpotlightMode(false);
- d->mActionCollection->action(QStringLiteral("view_toggle_spotlightmode"))->trigger();
+ qApp->quit();
}
} // namespace
или в моем случае есть баг который из версии в версию не дает собраться qtcreator - (ошибка в именах типах которая решается cmake переменной -fext-numeric-literals)
SN 1054 ~ # cat /etc/portage/patches/dev-qt/qt-creator/files/qt-creator-float-suffix-q.patch
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -59,6 +59,9 @@
set(IMPLICIT_DEPENDS Qt::Test)
endif()
+# float suffix error:
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fext-numeric-literals")
+
# suppress bogus warning
# warning C4573 requires the compiler to capture 'this' but the current default capture mode does not allow it
# when using QObject::connect in lambda without capturing 'this' - which would lead to warnings
так же можно использовать к определённой версии пакета тогда путь будет вида /etc/portage/patches/${CATEGORY}/${P}-${PR}
/etc/portage/patches/dev-qt/qt-creator-15.0.0-r1/files/qt-creator-float-suffix-q.patch
Ну, и если, ты нагирался написанием bash скриптов (обновление явно такой > 400 строчек выходит), можно посмотреть в сторону:
https://blogs.gentoo.org/gsoc/2023/08/27/final-report-automated-gentoo-system-updater/