Оригинал статьи

В своё время я написал две статьи для Linux.com с советами для пользователей Gentoo (Gentoo Portage secrets и Tips for new Gentoo users), при чём вторая оказалась такой удачной, что не только попала в топ digg’а, но и была в тот же день переведена на русский язык!

Я решил собрать в одной статье всю актуальную информацию из обеих статей (они, в принципе, остались актуальными на 90%), и добавить немного нового материала. Ну и перевести, в конце концов, так, как я считаю нужным :)

Если вы только собираетесь начать работу с Gentoo

Приготовьтесь читать много документации, особенно поначалу. Собственно, вы и установить Gentoo не сможете, не изучив Gentoo Handbook.

Есть, конечно, графический инсталлятор, есть Sabayon, но без понимания основ вы далеко не уйдёте. Да и вообще, при работе с Gentoo не рассчитывайте на графические средства настройки — зато консольные средства настройки и организация конфигурационных файлов в Gentoo весьма удобны.

Handbook освещает установку и основы работы с Gentoo. Когда придёт время настраивать иксы и ALSA, переходите к Gentoo Documentation Resources. Если вы не нашли информации по интересующей вас теме и там, то она скорее всего есть в Gentoo wiki.

Найти что-либо, что не описано в Gentoo wiki довольно сложно, так что не забывайте туда заглянуть, прежде чем посетить официальный форум и IRC-каналы.

Выше я приводил ссылки на англоязычные источники, как и в оригинале статьи. Если у вас нет проблем с английским языком, то лучше их и придерживаться, когда вы что-либо ищите — англоязычная документация практически всегда более актуальная и более полная. Но и документации на русском есть немало: и Handbook, и официальный перевод прочей документации, русскоязычный раздел Gentoo Wiki. Большой русскоязычный форум о Gentoo вы можете найти на Gentoo.ru (там же вы найдёте ссылки на IRC-каналы), ну и крупнейший русскоязычный форум о Linux — LinuxForum.

Основы Portage

Шутка. Тут этот раздел вообще не нужен. Вы ведь прочли Handbook, как это было сказано в предыдущем разделе? Хотя в оригинальную статью этот раздел по настоятельной просьбе редакторов пришлось всё-таки включить.

Настройка Portage

Первое правило Gentoo — внимательно следите за вашими USE-флагами. Множество глупых вопросов снимается, если вы перепроверите свои USE-флаги. Почему Midnight Commander тянет за собой в зависимостях X.org? Потому что у вас установлен флаг X. Почему вместе с KDE не установился KPDF? Потому что вы забыли про флаг pdf. (Почему же всё-таки был установлен KGhostScript? Понятия не имею, да и вообще — KDE4 на носу)

Для того, чтобы увидеть, с какими флагами будет установлен новый пакет, запускайте emerge с параметрами –ask и –verbose (-av) (–ask лучше –pretend тем, что зависимости не пересчитываются лишний раз). Обязательно установите пакет gentoolkit — среди прочих полезностей, он содержит утилиту euse, которая облегчает управление USE-флагами. Запустите euse -i flag, чтобы увидеть описание флага, и узнать, актвирован ли он. Прочитайте man euse, чтобы узнать о всех возможностях этой команды (нет, правда, прочитайте — там немного).

Чтобы установить какую-либо программу с другими USE-флагами, иногда советуют запустить USE="some flags" emerge moo, но ни в коем случае так не делайте: при следующем обновлении пакет будет перекомпилирован со старым набором флагов. Для настройки USE-флагов для отдельных пакетов используйте /etc/portage/package.use (это или файл, или каталог с файлами, см. ниже). То есть если вы хотите установить пакет moo категории category с флагами some flags, то наберите echo "category/moo some flags" >> /etc/portage/package.use перед установкой.

То же самое относится и к ACCEPT_KEYWORD — используйте /etc/portage/package.keywords. Начиная с версии Portage 2.1, вы можете хранить такие настройки не в одном большом файле package.keywords, а создать несколько небольших файлов, и положить их в каталог /etc/portage/package.keywords. Это относится ко всем файлам в /etc/portage.

Когда нужно использовать оверлеи

Иногда бывает нужно установить пакет (или версию пакета), которого ещё (или уже) нет в Portage. На пример, вы можете найти ebuild, который уже был удалён из официального дерева в CVS-репозитории. Или же вы нашли ebuild для нового пакета в Gentoo Bugzilla. А может быть, вас чем-то не устраивает официальный ebuild, и вы решили внести в него свои изменения.

В таком случае, вы должны создать собственный локальный оверлей, и положить свои ebuild’ы туда. Оверлей — это набор ebuild’ов, которые вы хотите «подмешать» к основной базе Portage. Ни в коем случае не храните свои ebuild’ы в /usr/portage — при первой же синхронизации они будут удалены. Создайте каталог для своего оверлея, и создайте в нём структуру каталогов, подобную /usr/portage. Расположите ваши ebuild’ы соответственно. Затем откройте /etc/make.conf, и добавьте строчку PORTDIR_OVERLAY="/path/to/local/overlay".

Обычное место для оверлеев — /usr/local/overlays, так что свой оверлей вы можете сделать в /usr/local/overlays/local. Что ещё может оказаться в /usr/local/overlays?

Есть множество неофициальных оверлеев, с которыми можно синхронизироваться. Для любого из них можно создать оверлей в /usr/local/overlays, и синхронизировать их (по тому же принципу, как вы синхронизируете официальное дерево Portage, когда запускаете emerge --sync). Разные неофициальные оверлеи используют для синхронизации утилиты rsync, svn или git, что оговаривается в описании оверлея.

В прочем, большинство из этих оверлеев вы можете использовать при помощи утилиты layman. В таком случае вам не нужно самомостоятельно создавать каталог для оверлея и запускать rsync/svn/git для получения обновлений — вы просто вводите layman -a название-оверлея, чтобы «подключиться» к оверлею — то есть, чтобы layman сам создал каталог, скачал туда нужные файлы и добавил путь в файл настройки; а затем запускаете layman -S, чтобы обновить все оверлеи.

Подробнее об управлении оверлеями, об установке layman и о том, какие вообще есть полезные оверлеи, можно узнать на Gentoo wiki. Оверлеи, как правило, обсуждаются в разделе Unsupported software официальных форумов Gentoo.

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

Не стоит запускать emerge --sync и layman -S чаще раза в сутки. Да и этого, как правило, более чем достаточно. Вы можете отслеживать появление интересующих вас пакетов на сайтах http://packages.gentoo.org/ или http://gentoo-portage.com/ (или же подписавшись на соответствующие RSS-ленты), и, таким образом, синхронизировать дерево Portage и обновлять пакеты только тогда, когда в официальном дереве появятся новые версии используемого вами ПО.

Держите «мир» в чистоте

Каждый раз, когда вы устанавливаете какой-либо пакет, его название записывается в /var/lib/portage/world. Когда вы обновляете ваши пакеты, вы запускаете что-то вроде emerge --update --deep world — именно тогда этот список и используется. Старайтесь, чтобы он был как можно короче; только программы, которые вы используете напрямую, должны туда попадать. Если какой-либо пакет установлен как зависимость другого, то он скорее всего не должен попадать в world.

На пример, когда вы устанавливаете пакет, использующий библиотеку wxWidgets, то она автоматически устанавливается среди прочих зависимостей этого пакета, но не добавляется в world. Если вы удалите все пакеты, которые зависят от wxWidgets, то она перестанет обновляться при emerge --update (...) world; и будет удалена из системы, если вы запустите emerge --depclean. Только если вы сами разрабатываете программы с использованием wxWidgets, вы захотите, чтобы она входила в world.

Существует скрипт, который может помочь вам удалить лишние пакеты из списка world. Чтобы установить или обновить пакет напрямую, но без добавления его в этот список, используйте опцию –oneshot (-1). Это может быть полезно, на пример, для временной установки какого-либо пакета.

Об удалении пакетов.

Не забывайте, что emerge --uninstall не проверяет, используется ли удаляемый пакет другими пакетами. Также будьте осторожны с emerge --depclean, так как иногда она может удалить пакеты, которые вам нужны.

Иногда при обновлении одного пакета, перестаёт работать другой, который, хоть и не требует для установки первый пакет, но включает его в свои необязательные зависимости. В таких случаях необходимо просто переустановить второй пакет, чтобы он скомпилировался без связей с первым. Чтобы выявить все такие пакеты, вы можете использовать утилиту revdep-rebuild из пакета gentoolkit.

Логи Portage

Все ваши действия с emerge отражаются в /var/log/emerge.log. К примеру, чтобы узнать, какой пакет сейчас компилируется, запустите tail /var/log/emerge.log. Преобразовать временные отметки в читаемый формат поможет простой python-скрипт (с его использованием необходимо запустить tail /var/log/emerge.log | formatlog).

Утилита genlop (emerge genlop) позволяет извлечь статистическую информацию из этого лог-файла. На пример, genlop -c скажет, какой пакет сейчас компилируется и как долго, и оценит количество оставшегося до конца установки времени.

Дополнительно стоит также включить так называемые elog. При установке многих пакетов показываются важные уведомления, которые вы можете пропустить, если не следите за выполнением emerge. Добавьте в make.conf следующие строки:

# This sets what to log
PORTAGE_ELOG_CLASSES="warn error log"
# And this is how to do it
PORTAGE_ELOG_SYSTEM="save"

и создайте каталог /var/log/portage/elog. Теперь уведомления для каждого пакета будут сохраняться в отдельном файле в созданном каталоге. Если вы хотите узнать больше о настройке elog, то изучите файл /etc/make.conf.example. Существуют также графические утилиты для просмотра этих логов.

Удаление временных файлов

Если установка программы прервана ошибкой, в /var/tmp/portage остаётся временный каталог. Он будет автоматически удалён только после успешной установки этой программы, или же вы можете очистить этот каталог сами.

Также через некоторое время довольно много файлов может оказаться в /usr/portage/distfiles. Используйте утилиту eclean из пакета gentoolkit, чтобы удалить дистрибутивы, которые вам больше не нужны. Эта утилита также удаляет старые бинарные пакеты, если вы их создавали (запускайте как eclean-dist и eclean-pkg соответственно). В странице руководства рассказывается о дополнительных параметрах.

Быстрый поиск пакетов

Чтобы найти нужный пакет в локальном дереве Portage (и/или оверлеях), вы можете использовать emerge --search или emerge --searchdesc, но этот способ очень медленный. Поэтому лучше использовать eix. Eix индексирует список пакетов после каждой синхронизации (для этого необходимо набрать update-eix), а затем очень быстро выполняет поиск по пакетам (к примеру, eix moo выдаст список всех пакетов, которые содержат moo в названии). К тому же, вывод eix более информативен, чем вывод emerge.

Eix позволяет искать по названию пакета, категории или описанию, использовать регулярные выражения, неточный поиск, ограничивать область поиска только установленными пакетами и многое другое. Как обычно, читайте man.

Уменьшение использования трафика

Обновление системы может быть связано с тратой большого количества сетевого трафика. Но есть способы уменьшить аппетиты Portage. Наиболее эффективно в этом преуспеет знаменитая утилита Deltup, которая позволяет загружать не весь архив с исходными кодами, а только разность между новой и старой версией. Такой подход экономит до 90% размера загрузок. Установка Deltup описана в Gentoo Wiki.

У Deltup, конечно, есть свои недостатки. Эта утилита не поддерживает докачку, а кроме того, вы зависите от загруженности сервера, генерирующего новые патчи (помнится, были плохие времена у deltup, когда дождаться очереди на генерацию было практически невозможно. Потом стало лучше, а после этого я уже давно deltup не пользуюсь — как там сейчас, не знаю). Также иногда Deltup «путается» в версиях некотрых пакетов, если у них запутанная система нумерации версий. Ну и конечно, пересоздание нового пакета требует процессорного времени. Однако же, никаких катастрофических последствий использование deltup иметь не может, так что если вы нуждаетесь в экономии трафика — обязательно её попробуйте.

Похожий подход, но для синхронизации дерева Portage использует утилита emerge-delta-webrsync: она загружает ежедневные патчи для обновления вашей локальной копии дерева, что гораздо экономнее, чем emerge --sync (особенно если у вас уже есть архив с копией дерева портежей — вроде того, который вы исполоьзовали при установке). Просто запустите emerge emerge-delta-webrsync, а затем emerge-delta-webrsync для синхронизации дерева портежей (мне всё ещё надо напоминать, что подробности — в man’е?).

На Gentoo wiki есть специальный раздел с советами для пользователей с плохим интернет-соединением.

Ещё одна возможность не уменьшит использование трафика, но позволит уменьшить время загрузки пакетов: добавьте parallel-fetch в переменную FEATURES в /etc/make.conf, чтобы emerge скачивал дистрибутив следующего пакета, устанавливая предыдущие в очереди. Это уменьшит время установки, если вы запускаете emerge для установки сразу нескольких пакетов.

Ускорение компиляции

Компиляция из исходных кодов — основной способ установки программ в Gentoo. Неудивительно, что появились средства, позволяющие ускорить этот процесс.

На пример, Distcc позволяет распределить задачи по компиляции на несколько компьютеров в сети. Даже компьютеры с Windows сгодятся для этого!

Ccache кэширует результаты компиляции, таким образом, ускоряя компиляцию одинаковых участков кода. В своё время была также анонсирована утилита Confcache, которая кэшировала результаты проверок ./configure, тем самым ускоряя последущие проверки, но затем эта утилита из дерева была удалена (кто-нибудь может что-то рассказать о её судьбе?).

Упомянутые здесь утилиты можно использовать не только с emerge, но и вообще при любых компиляциях. Подробнее читайте в документации Distcc и Ccache.

Обновление конфигурационных файлов

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

Ну и цитата из bash.org’а напоследок:

<@insomnia> it only takes three commands to install Gentoo
<@insomnia> cfdisk /dev/hda && mkfs.xfs /dev/hda1 && mount /dev/hda1 /mnt/gentoo/ && chroot /mnt/gentoo/ && env-update && . /etc/profile && emerge sync && cd /usr/portage && scripts/bootsrap.sh && emerge system && emerge vim && vi /etc/fstab && emerge gentoo-dev-sources && cd /usr/src/linux && make menuconfig && make install modules_install && emerge gnome mozilla-firefox openoffice && emerge grub && cp /boot/grub/grub.conf.sample /boot/grub/grub.conf && vi /boot/grub/grub.conf && grub && init 6
<@insomnia> that’s the first one