После установки и первоначальной настройки пользователю gentoo linux, кажется, уже не о чем больше беспокоиться. Разве что о такой важной вещи как поддержание своей операционной системы в актуальном состоянии. Собственно, этот вопрос и будет затронут сегодня. Детально разберём особенности обновления gentoo, немного поговорим о командах и программах, с которыми не мешало бы разобраться каждому гентушнику, ну и постараемся предугадать и осветить возможные вопросы начинающих пользователей. Начнём, пожалуй.

В тексте вы можете видеть сноски, выделенные красным цветом и более мелким по сравнению с основным текстом шрифтом. Дело в том, что пост получился довольно таки объёмным и затрагивает не только сам процесс обновления, но и процесс взаимодействия/сосуществования с gentoo, поэтому пришлось вынести некоторые дополнительные материалы в заключение.

Введение

На земле Gentoo обновление понимается иначе, чем в большинстве существующих дистрибутивов linux. Gentoo никогда не был предназначен для “классического” способа обновления программ: дождаться нового релиза, скачать его, прожечь, поместить диск в привод и следовать инструкции по обновлению. Такой процесс вряд ли может удовлетворить опытных пользователей, желающих иметь свежее программное обеспечение. С самого начала, Gentoo был разработан вокруг концепции быстрых последовательных обновлений. В идеале, вы устанавливаете систему один раз, и никогда не беспокоитесь о выпусках: просто следуете инструкциям из Введения в Portage в настольной книге Gentoo, которые объясняют, как сохранить вашу систему в актуальном состоянии. Хотя иногда вносятся изменения в ядро ​​ОС и требуется его ручное обновление.

Но в Gentoo есть и релизы. Новый релиз означает появление нового установочного диска, исправленного и дополненного. Диск содержит актуальные/свежие пакеты для новых установок, иногда реализуются функции, несовместимые с предыдущими выпусками. В таком случае принято говорить о новом профиле. Профиль - набор конфигурационных файлов, хранимых а каталоге /usr/portage/profiles. Профили, устаревающие с появлением новых, хранятся в /usr/portage/profiles наряду с текущими, но они помечены как устаревшие. Portage уведомит вас о необходимости перехода на новый профиль.

Часть 1. Обновление

Как часто следует обновляться?

Не чаще, чем раз в сутки. Более частое обновление просто не имеет смысла. Вообще, обновление сроком до месяца не должно повлечь за собой никаких проблем. Если вы предпочитаете обновлять систему периодом от полугода до примерно восьми месяцев одна проблема будет точно: большое количество пакетов, требующих обновления, и связанные с этим временные затраты. Обновление сроком от года и выше может и, вероятно, потребует вашего пристального внимания.

Процесс обновления системы

Обновление системы состоит из нескольких этапов.

Первый этап: обновление дерева портежей и/или используемых дополнительных оверлеев.

Осуществляется командой emerge --sync (или emerge-webrsync, что позволит сэкономить трафик и время)

Второй этап: обновление пакетов

Обновление установленных программ:

# emerge -pvuND --with-bdeps=y world

Нужно не полениться и прочесть вывод команды. При необходимости устранить блокировки (дополнить/поправить список USE-флагов в /etc/make.conf и /etc/portage/package.use), согласиться с предлагаемой последовательностью действий или исправить её в соответствии со своими представлениями о здравом смысле. После чего выполнить обновление:

# emerge -uND world

Иногда может оказаться полезной опция --with-bdeps=y, которая заставляет обновиться пакеты, требующиеся только во время сборки пакета, даже в том случае, когда пакету, который их вытянул, обновление не требуется.

После вышеуказанных действий также может потребоваться обновление конфигурационных файлов, о чём, впрочем, напомнит portage, если вы не будете игнорировать его сообщения. Для этого используем etc-update или dispatch-conf.

Третий этап: чистка системы

Проверка и пересборка битых зависимостей осуществляется командой revdep-rebuild.

В случае обновления python’а — python-updater.

Для тех, у кого установлен haskell и/или perl: haskell-updater и perl-cleaner в помощь.

Удаление ставших ненужными пакетов:

# emerge -pv --depclean

Тут не надо полагаться на продвинутость emerge целиком и полностью. Лучше посмотреть не тащит ли depclean лишних пакетов. Особенно актуально для X Window System. У автора в результате её беспечности depclean однажды снёс нужную иксам, но необязательную по мнению emerge библиотеку libXinerama, после чего, как и следует предположить, иксы не запустились. Итак, если depclean хочет удалить нужный пакет - установите этот пакет явно или пропишите в world, дабы больше его не дёргали. Если удаляет что-то из существенного (gcc, python, возможно xorg) - реконфигурйте систему в соответствии с руководствами с gentoo.org. Разобравшись с этим, можно избавиться от пакетов, которые больше не требуются:

# emerge --depclean

Ещё раз проверить на предмет сломанных зависимостей с помощью revdep-rebuild.

Удалить неиспользуемые исходники:

# eclean-dist

Обновление ядра

Ядро — особый пакет. И отношения к себе заслуживает особого. Portage удаляет только те файлы, который сам установил. Поэтому после обновления в /usr/src/ остаёся каталог kernel-$VERSION, содержащий оставшиеся после сборки ядра временные файлы.

Его (как и /lib/modules/$VERSION) можно удалить ручками (но только когда они совсем не нужны, до получения подтверждения полной работоспособности нового ядра категорически рекомендуется оставить возможность загрузки со старым ядром!).

Если нет желания каждый раз конфигурировать ядро с нуля, то можно взять за основу существующий конфигурационный файл. Берём из /proc/config.gz.

Символьная ссылка /usr/src/linux/ должна указывать на каталог, содержащий исходники ядра, которое предполагается собирать. Чтобы это условие выполнялось, потребуется произвести следующие манипуляции:

Сразу переключиться на новое ядро с помощью eselect.

$ eselect kernel list
Available kernel symlink targets:
    [1]   linux-3.6.11-gentoo*
    [2]   linux-3.7.7-gentoo
# eselect kernel set 2

Проверяем создалась ли автоматически символьная ссылка на новое ядро:

$ ls -l /usr/src/linux
lrwxrwxrwx 1 root root  /usr/src/linux -> linux-3.7.7/

Отлично! Если это не так, создаём вручную:

# ln -sfn /usr/src/linux-3.7.7 /usr/src/linux

Собственно, сборка нового ядра:

# cd /usr/src/linux
# zcat /proc/config.gz > .config
# make oldconfig
# make menuconfig
# make && make modules_install
# cp arch/$ARCH/boot/bzImage /boot/linux-$VERSION

После сборки нужно подправить в /boot/grub/menu.lst строки с версией ядра (справедливо для загрузчика grub-legacy).

Теперь вы сможете загрузиться с новым ядром.

Примечание: Возможно, придётся пересобрать некоторые программы, если они используют свои модули. В частности это относится к virtualbox-modules. Вы можете сделать это вручную или использовать module-rebuild:

# cd /usr/src/linux
# make modules_prepare
# emerge --ask @module-rebuild

Если обновился gcc

Согласно методическому руководству при обновлении gcc достаточно переключиться на его новую версию и пересобрать с ним только sys-devel/libtool:

# gcc-config -l
# gcc-config 2
# env-update && source /etc/profile
# emerge --oneshot libtool

Если система долго не обновлялась

Во избежание проблем лучше последовательно выполнить данные ниже рекомендации.

Внимательно прочесть новости, которые любезно предоставляет нам emerge при синхронизации

Согласно рекомендации обновить portage командой

# emerge -1 portage

Обновить gcc:

# emerge -1 gcc

Переключиться на новый компилятор и пересобрать libtool

Новым компилятором пересобрать system:

# emerge -ave system

Пересобрать драйвера иксов.

Дообновить оставшееся, после чего можно переходить к чистке системы.

Часть 2. Основы сосуществования с gentoo

Теперь стоило бы рассмотреть вещи, к обновлению не относящиеся, но оттого не менее нужные

Использование оверлеев

Не помешает установить утилиту app-portage/eix для поиска по неустановленным оверлеям. После чего следует сформировать базу пакетов. В последующем эта команда позволит обновлять созданную базу:

# eix-remote update

Кстати, найти нужный пакет и посмотреть в каком оверлее тот находится можно здесь.

Теперь нам потребуется layman:

# emerge -av app-portage/layman

Указываем настройки в /etc/portage/make.conf:

source /var/lib/layman/make.conf
PORTDIR_OVERLAY="${PORTDIR_OVERLAY} /usr/local/portage"

Далее следует обновление списка оверлеев и их просмотр:

# layman --fetch
# layman --list

Добавить нужный оверлей:

# layman -L | grep my_overlay
# layman --add my_overlay

Обновить все оверлеи:

# layman -S

Удалить оверлей, ставший ненужным:

# layman --delete my_overlay

Перед поиском программ из только что установленного оверлея, следует обновить базу eix:

# eix-update

Просмотреть все пакеты оверлея (в том числе и установленные вами) также представляется возможным. Для этого будем использовать команду:

$ eix --in-overlay $OVERLAY_NAME

Блокировки

Блокировки можно условно разделить на два типа: просто блокировки (их называют жёсткими) и “недоблокировки” (а эти — мягкими). Первые обозначаются заглавной B и требуют к себе предельного внимания. Тут без вашего вмешательства обновление или же установка пакетов не произойдёт. Иначе говоря, emerge сигнализирует, что не может без вас разобраться. Вообще, жёсткие блокировки возникают, когда два (и почти никогда больше) пакета не могут быть установлены вместе. Либо вы хотите установить программу, которая требует в зависимотсях более новый пакет, чем тот, что у вас установлен, либо программы выполняют одинаковые функции и вместе сосуществовать не могут. Например, udev и eudev.

  • Как можно поступить:
    • замаскировать один из пакетов
    • удовлетворить требования emerge. Применительно к вышеуказанным udev/eudev: удалить один из них и поставить другой.
    • устанановить, наплевав на предупрежение. Не стоит этого делать (правда не стоит), но если не послушаетесь, ставьте конфликтующий пакет с ключиком -O

На мягкие блокировки даже не надо тратить своего времени - portage сам разрулит. Обозначаются они bстрочной.

make.conf

Не держись указа аки стенки. К каждому указу надобно и голову приложить. © Пётр I

Сие предупреждение к тому, чтобы читатель не рвался слепо копировать всё из примера в свой make.conf. Это не убунту, думайте и расширяйте этот файл по мере необходимости. Значений может быть меньше, чем в примере, а может быть намного больше.

Пример настройки make.conf

командаописание, которое можно изменить
*CFLAGS="-march=native -O2 -pipe"*в большинстве случаев лучше поставить `-march=native`, исключением можно считать использование вами `distcc`. Ключ `-pipe` позволит меньше обращаться к жёсткому диску при компиляции. Его можно опустить, если вы намерены подключать `/var/tmp/portage` в `tmpfs`
CXXFLAGS="${CFLAGS}"-
CHOST="x86_64-pc-linux-gnu"-
USE="bindist mmx sse sse2 unicode pdf djvu gtk2 -gnome -qt4 -kde cleartype truetype jpeg jpeg2k png gif encode"используемые USE-флаги
MAKEOPTS="-j3"ускорение процесса компиляции. Рекомендуется устанавливать значение равное количеству ядер +1. Так, пример, данный выше, подойдёт для двухъядерного процессора без поддержки Hyper-threading
INPUT_DEVICES="evdev synaptics"указание на имеющееся оборудование для ввода данных. Synaptics указывается при наличии тачпада
VIDEO_CARDS="intel i915"здесь проживают драйверы для видеокарт/видеокарты. К видеокарте от intel, скорее всего, нужно будет дописать и её модуль. В данном случае для Intel HD 3000 это i915
ALSA_CARDS="hda-intel"а это наша звуковая карта (по состоянию на 2014 год опцию можно не указывать, главное выбрать карту в ядре)
GENTOO_MIRRORS = "rsync://gentoo.bloodhost.ru/gentoo-distfiles"зеркало, откуда будем тянуть исходники
LINGUAS="ru en"выбранные языковые настройки
PORTAGE_TMPDIR="/var/tmp"расположение временных файлов
BUILD_PREFIX="/var/tmp/portage"каталог сборки
PORTDIR="/usr/portage"где хранится дерево портежей
DISTDIR="${PORTDIR}/distfiles"исходники приложений
PKGDIR="${PORTDIR}/packages"расположение прекомпилированных пакетов. Для создания такого пакета (например, чтобы установить его на другую машину) следует запустить команду emerge --buildpkgonly или включить buildpkg в FEATHURES, чтобы создавать бинарный пакет каждый раз
FEATURES="parallel-fetch userfetch -distcc -buildpkg ccache"`userfetch` повысит безопасность, позволив скачивать исходники не от рута; `parallel-fetch` нужен для параллельной загрузки пакетов
CCACHE_SIZE="10G"размер кэша
CCACHE_DIR="/var/tmp/ccache"`ccache` способен заметно ускорить перекомпиляцию одних и тех же программ. Ccache сначала нужно установить. В `CCACGE_SIZE` задайте максимальный размер используемого дискового пространства
PORTAGE_BINHOST="ftp://buildhost/gentoo"установка пакетов из какого-либо бинарного репозитория. Для установки готового пакета следует ввести команду `emerge --usepkgonly --getbinpkgonly my_package_name`
source "/var/lib/layman/make.conf"использование оверлеев layman
PORTDIR_OVERLAY="${PORTDIR_OVERLAY} /usr/local/portage"для оверлеев, это оговаривалось выше
PORTAGE_NICENESS="16"если при сборке пакетов машина потребляет слишком много системных ресурсов, можно понизить приоритет процесса компиляции, что замедлит сборку, но позволит спокойно работать с другими приложениями во время компиляции. Вы можете изменить значение в диапазоне от -20 до 19, более высокие значения означают меньший приоритет. В примере приоритет = 16

Дополнительные сведения можно найти в блоге, курсируя по тегу gentoo, или открыть man make.conf (особое внимание уделите блоку FEATURES, вам понравится).

USE-флаги

Тут всё достаточно тривиально. Большинство флагов определяет выбранный вами профиль. Посмотреть список доступных профилей можно командой

$ eselect profile list:

Available profile symlink targets:
[1]   default/linux/amd64/10.0 *
[2]   default/linux/amd64/10.0/selinux
[3]   default/linux/amd64/10.0/desktop
[4]   default/linux/amd64/10.0/desktop/gnome
[5]   default/linux/amd64/10.0/desktop/kde
[6]   default/linux/amd64/10.0/developer
[7]   default/linux/amd64/10.0/no-multilib
[8]   default/linux/amd64/10.0/server
[9]   default/linux/amd64/10.0/x32
[10]  default/linux/amd64/13.0
[11]  default/linux/amd64/13.0/selinux
[12]  default/linux/amd64/13.0/desktop
[13]  default/linux/amd64/13.0/desktop/gnome
[14]  default/linux/amd64/13.0/desktop/kde
[15]  default/linux/amd64/13.0/developer
[16]  default/linux/amd64/13.0/no-multilib
[17]  default/linux/amd64/13.0/x32
[18]  hardened/linux/amd64
[19]  hardened/linux/amd64/selinux
[20]  hardened/linux/amd64/no-multilib
[21]  hardened/linux/amd64/no-multilib/selinux
[22]  hardened/linux/uclibc/amd64

Можно выбрать дефолтный профиль, а затем задать необходимые USE-флаги. Или выбрать наиболее подходящий вам профиль и дополнять его. Перед тем, как установить пакет, просмотрите с какими USE-флагами он может быть собран и впишите свои значения в /etc/portage/package.use. Пример:

$ emerge -av mirage

This action requires superuser access...
Would you like to add --pretend to options? [Yes/No] y
These are the packages that would be merged, in order: Calculating dependencies... done!
[ebuild   R    ] media-gfx/mirage-0.9.5.1  0 kB jpeg png gif jpeg2k -gnome

Допустим, нам нужно, чтобы mirage умел просматривать файлы .png и .jpeg, а .gif и гном игнорировал. В соответствии с этим пропишем:

# nano /etc/portage/package.use
media-gfx/mirage jpeg png -gif jpeg2k -gnome

Теперь emerge не потянет ненужных нам зависимостей в следствие чего сократится время сборки да и места на диске больше останется ;) Для пересборки пакета с новыми флагами следует добавить ключ --newuse. Если вы не знаете или не уверены в том, какие флаги выставить, можно получить о каждом из них более подробную информацию. Установите gentoolkit и используйте команду equery uses нужный_пакет:

$ equery uses python

--- вывод сокращён --
* Found these USE flags for dev-lang/python-3.2.3:
- - build        : !!internal use only!! DO NOT SET THIS FLAG YOURSELF!
- - doc          : Adds extra documentation (API, Javadoc, etc)
- - examples     : Install examples, usually source code
- - ipv6         : Adds support for IP version 6
+ + ssl          : Adds support for Secure Socket Layer connections
+ + tk           : Adds support for Tk GUI toolkit
- + wide-unicode : Enable wide Unicode implementation which uses 4-byte Unicode characters.
- - wininst      : Install Windows executables required
+ + xml          : Add support for XML files

Кстати:

  • если набрать команду equery depends пакет, будут указаны все пакеты, зависящие от выбранного
  • когда вы желаете использовать версию программы, отличную от используемой по-умолчанию, воспользуйтесь командой eselect. Например:
  • исходники установленных приложений можно найти по пути /usr/portage/distfiles/
  • если нужно лишь загрузить исходники, но не устанавливать программу, используйте флаг --fetchonly
  • если у вас установлен python3, пересоберите portage с соответствующим флагом (+python3) для увеличения производительности portage в среднем на 15%.

Пример с eselect:

# eselect python list
Available Python interpreters:
    [1]   python2.7
    [2]   python3.2 *
# eselect python set 1

Зачем нужны ebuild’ы

Иногда какого-то нужного пакета может не оказаться ни в официальном репозитории gentoo, ни в каком-либо из оверлеев. В таком случае можно установить готовый ( или написать свой ) ebuild. Найти готовые ebuild’ы можно на https://bugs.gentoo.org/, воспользовавшись строкой поиска. Давайте рассмотрим пример установки плагина save for web для графического редактора gimp.

Итак, мы скачали необходимый ebuild. Теперь хорошо бы проверить наличие переменной PORTDIR_OVERLAY в make.conf:

PORTDIR_OVERLAY="${PORTDIR_OVERLAY} /usr/local/portage"

Структура любого оверлея копирует структуру официального дерева Portage: (категория/программа/название_программы-версия.ebuild). Проверьте наличие директории /usr/local/portage, и если её нет — создайте:

# mkdir -p /usr/local/portage

Для того, чтобы Portage мог установить наш пакет, требуется digest-файл. Создайте его:

# ebuild /usr/local/portage/category/program/program.ebuild digest

Применительно к save-for-web это будет выглядеть так:

# ebuild /usr/local/portage/media-gfx/gimp-save-for-web/gimp-save-for-web-9999.ebuild

При установке такого пакета потребуется внести его в /etc/portage/package.keywords:

=media-gfx/gimp-save-for-web-9999 **

** - разрешит поставить любую версию пакета, независимо от того, в какой ветке тот находится (в тестовой или стабильной). И после этого установить:

# emerge -av save-for-web

Что такое слоты

В большинстве других дистрибутивов устанавливается лишь одна версия пакета, в то время как в gentoo используется технология слотов. Пакет просто присваивает определенный слот своей версии. При установке подобных приложений emerge выведет вам информацию, в которой будет указано какие новые пакеты будут установлены как зависимость устанавливаемого пакета (метапакеты), какие пакеты будут обновлены и какие будут установлены в другой слот. Последние обозначены как [NS]. Наиболее простой пример - обновление ядра:

[ebuild NS] sys-kernel/gentoo-sources-3.8.3:3.8.3 [3.8.2:3.8.2]

В принципе изложенной информации должно хватить для работы без экспериментов и неожиданностей. Хотя рекомендуется ещё пройтись по форуму на предмет вопроса: что читать после handbook. На этом сегодня всё. Безоблачной жизни в gentoo, дамы и господа! ⤧  Следующая запись Udisks, udev и все-все-все