Алексей Федорчук
2002 г
За годы, прошедшие со времени перворазмещения этой заметки, проект портирования портежей Gentoo на FreeBSD то умирал, то гальванизировался вновь. Нынче проект вроде как развивается, хотя и временно заморожен по лицензионным соображениям. Тем не менее, эта заметка в основном достояние истории.
Разговоры о переносе инфраструктуры портежей Gentoo Linux на иные операционки идут достаточно давно. В списке претендентов на портежирование (не путать с протезированием) портежей — и MacOS с ее свободным аналогом Darwin, и вечно эмбриональный Hurd, и BSD-системы в разных своих ипостасях. И вот — свершилось, на GWN от 1 сентября прошло сообщение о первом работоспособном переносе портежей на Open- и FreeBSD, осуществленном Grant Goodyear (транскрибировать фамилию не рискну).
За подробностями предлагается обратиться на страницу Гранта. Но прежде, чем это сделать, подумаем — а за каким вообще нужно переносить портежи в Open- или, тем более, во FreeBSD?
Действительно, каждая из этих систем имеет свою систему портов, основанную на тех же принципах, что и портежи Gentoo (вернее — как раз наоборот, идея портежей в Gentoo была заимствована из BSD-мира). И если коллекция портов OpenBSD выглядит несколько ограниченной, то во FreeBSD она недавно достигла 10000 — то есть включила в себя почти весь открытый и свободный софт, когда-либо созданный человечеством.
Спору нет — порты FreeBSD (а именно в недрах этой ОС зародилась концепция сборки программ из исходников, а не инсталляции прекомпилированных их пакетов) очень удобны, просты в обращении (так как основаны на универсальном механизме make-файлов) и, главное, проверены временем. Единственное, чего в них недостает — возможности глобальной настройки взаимозависимостей пакетов.
Описанные в make-файлах системы портов зависимости определяются майнтайнером данного порта, исходящим из своих представлений о том, какие дополнительные опции нужны (или — не нужны) данной софтине по умолчанию. И если его представления не совпадают с таковыми пользователя — последнему придется выполнить индивидуальное конфигурирование каждой собираемой программы. Последнее — не сложно, и выполняется теми же стандартными with
/without
и enable
/disable
, что и при ручной сборке. Однако, согласитесь, при большом количестве устанавливаемых программы весьма скучно было бы в командной строке запрещать для всех изначально консольных приложений поддержку Иксов…
В системе же портов Gentoo этой цели служит специальная переменная USE
, определяемая в нескольких файлах конфигурации, каждый из которых имеет определенный приоритет по отношению в другому (подробнее — в документации на Gentoo.ru. И если в файле /etc/make.conf
(наиболее приоритетном) явным образом задать
USE="-X -gnome -kde"
то можно быть уверенным в том, что впредь все программы, не требующие использования Иксов и не предназначенные для запуска исключительно в KDE или GNOME, будут собираться без поддержки этих систем. Разумеется, если поддержка эта для данного пакета опциональна — понятно, что на жесткие зависимости никакие значения переменной USE
влияния не оказывают.
Вторая важная особенность портежей Gentoo — то, что она пронизывает систему насквозь, от ядра и системных утилит его обрамления до распоследнего пользовательского приложения. То есть установка (или обновление) базовых компонентов (того, что во FreeBSD именуется Distributions) осуществляется точно тем же методом, что и установка, скажем, Иксов или KDE. Во FreeBSD же процесс «перестройки мира» (make world
) оторван от инсталляции портированных программ (хотя и то, и другое контролируется механизмом make-файлов).
Система портежей имеет еще несколько отличий от своего прототипа. Например, там есть возможность включения в единый портеж нескольких, в том числе и несовместимых, версий одного пакета (например, Gtk-1.x и Gtk-2.x, первая и вторая линии freetype, и так далее), для чего предназначен механизм слотов (SLOTS). Во FreeBSD же в таких случаях приходится создавать отдельные порты. Сказанного, думаю, достаточно, чтобы поверить в осмысленность процесса переноса портежей в BSD-системы вообще и во FreeBSD в частности. Хотя чисто для эксперимента — заработает ли?
Нужно заметить, что это — не первая попытка переноса инфраструктуры какого-либо Linux-дистрибутива в BSD-мир. Не так давно аналогичное действо было предпринято в рамках проекта Debian (сколько бы не говорили про то, что Debian GNU/Linux — это операционка GNU проекта Debian на ядре Linux, на сей момент практически Linux’ом она и исчерпывается). А именно, механизм apt-get, вместе с многочисленным инструментарием проекта GNU, был портирован на ядра Free- и NetBSD.
Смысл этого деяния для меня (и, судя по обсуждению на Opennet.ru, для многих других) остался не совсем ясным. Ну, о достоинствах или недостатках самого apt’а распространяться не буду: если по сравнению с чистым rpm
‘ом это действительно прогресс, то порты FreeBSD все равно (это сугубо личное мнение) много более универсальны, гибки, удобны и, не в последнюю очередь, прозрачны для пользователя.
Однако главная сила всех BSD-систем всегда была в неразрывном единстве ядра, системных и пользовательских утилит — то есть того же Distributions. И подменять в нем юзер-уровень FreeBSD аналогичным Linux’овым кажется, как минимум, опрометчивым (тем паче, что низкоуровневые утилиты неизбежно наследуются от материнской системы).
Однако вернемся к Гранту и его детищу. В отличие от Debian’овского портирования, он не пытается подменить BSD-инструментарий Linux’овым. Разумеется, для функционирования механизма портежей ему пришлось инкорпорировать в дерево файловой системы *BSD кое-какие GNU-утилиты. Однако, во-первых, он сам классифицирует это как хак и рассматривает в качестве временной меры. Во-вторых, утилиты эти не замещают одноименные BSD’шные, мирно с ними сосуществуя.
В упомянутом выше GWN содержался призыв протестировать детище капитана Гранта. Пройти мимо этого призыва я не смог, так что делюсь своими впечатлениями. Для чего отправился на его страницу и, после прочтения сопроводительных текстов, скачал файл gentoo-fbsd.tgz. Попутно рядом можно увидеть несколько собранных бинарных пакетов GNU-утилит и BSD-специфичных портежей (включая ядро и libc
), но о них мы пока говорить не будем.
Далее, понятное дело, потребовался достаточно свежий тарбалл дерева портежей (я воспользовался версией portage-20030822.tar.bz2). Курочить свою установленную FreeBSD с не вполне предсказуемым результатом мне не хотелось, так что я инсталлировал ее заново — на отдельном слайсе (к сожалению, выделить под это хозяйство диск не получилось).
Установлена была FreeBSD 5.1 RELEASE с мини-диска (то есть не содержащего Иксов и packages). Устанавливал я ее, понятно, в минимальной комплектации — только Base и Crypto из Distributions (меньше некуда), и не особо утруждая себя настройками. Затем, перезагрузившись, в соответствие с рекомендациями Гранта, создал группу portage и одноименного пользователя (хотя, похоже, это не обязательно). Далее — переход в корневой каталог и распаковка скачанного архива:
$ cd / ; $ tar xzvf /path/gentoo-fbsd.tgz
После этого можно видеть, что в файловое древо FreeBSD добавились (в каталоги /bin
и /usr/bin
) оболочка bash
и кое-какие утилиты — GNU-версии sed
, tar
, make
, patch
. Причем, дабы они не путались с одноименными программами изначальной FreeBSD, все они получили в своем имени префикс g
— /bin/gsed
, /bin/gtar
, /usr/sbin/gmake
и так далее.
Собственно система управления портежами — программы emerge
, ebuild
и прочие, — локализовались в каталоге /usr/lib/portage/bin
(символические на них ссылки оказались и в /usr/sbin
). Что немаловажно, в каталог /etc
добавились профильные файлы /etc/make.conf
(подменивший оригинальный Free’шный), /etc/make.globals
и прочие, описывающие условия сборки.
Теперь можно было дать команду
$ emerge info
и убедиться, что условия сборки программ из портежей волшебным образом встроились во FreeBSD.
Настало время развернуть собственно дерево портежей. Перейдя предварительно в каталог /usr
, даю команду
$ tar xjvf /path/portage-20030822.tar.bz2
Грант рекомендует выполнить вместо этого процедуру
$ emerge sync
с целью получения наиболее свежего снапшота (благо соответствующий инструментарий в лице rsync
сотоварищи также устанавливается при развертывании его тарбалл). Однако мне показалось ленивым качать по модему 10 Мбайт. И, как оказалось в последствие, сошло и так…
Последнее подготовительное действие — дополнение базы данных портежей (/var/cache/edb
) сведениями о виртуальной библиотеке glibc
(в реальности она не устанавливается):
$ echo virtual/glibc sys-libs/glibc >> /var/cache/edb/virtuals; $ emerge inject sys-libs/glibc-2.3.2
Все, можно начинать установку портежей. Для начала неплохо бы отредактировать файл /etc/make.conf
в соответствие со своими пожеланиями. Чтобы проделать это с максимальным комфортом, я решил установить свой любимый joe — чисто для эксперимента, не развалится ли все:
$ ebuild usr/portage/app-editors/joe/joe-2.9.8.ebuild merge
Разумеется, дабы не качать исходники из сети, они предварительно должны быть помещены в /usr/portage/distfiles
. Все прошло замечательно — команда
$ joe /etc/make.conf
позволила выполнить настройку в привычной среде.
В умолчальном файле /etc/make.conf
, предлагаемом Грантом, заслуживают внимания следующие момент. Значение переменной USE
дано в форме
USE="-*"
то есть все опциональные зависимости при сборке пакетов исключаются. Далее, дается только общее описание хоста:
CHOST="i686-pc-linux-gnu"
а флаги C и C++ закомментированы. Тем не менее я рискнул дать их в рекомендуемой для Gentoo Linux (но не FreeBSD) форме:
CFLAGS="-march=pentium4 -O3 -pipe" CXXFLAGS="${CFLAGS}"
Наконец, переменная FEATURES
имеет значение -sandbox
. Грант объясняет это тем, что пакет это в BSD-системах не собирается.
После этого я навскидку попробовал установить несколько пакетов, не отягощенных излишними зависимостями (тех, исходники которых я смог уместить на свой небольшой экспериментальный BSD-раздел). Одни (например, zsh
) установились с полпинка, другие (типа links
) устанавливаться отказались. Однако в первом приближении система показала себя работоспособной. По крайней мере, ошибок компиляции из-за завышения флагов оптимизации отмечено не было.
Таковы первые впечатления о первом опыте инкорпорации Gentoo-портежей во FreeBSD. И — краткий предварительный итог. Проект переноса портежей во FreeBSD, не смотря на сугубо экспериментальный характер, кажется мне весьма значимым. Во-первых, это один из реальных примеров влияния Linux’овых идей на BSD-мир (до сих пор, как мне кажется, воздействие шло в основном в обратном направлении).
Во-вторых, в случае успеха этого проекта мы получаем прототип универсальной системы управления пакетами (согласно Гранту, инкорпорация портежей в OpenBSD проходит столь же безболезненно), которая может настраивать любую ОС Unix-клана (вплоть до MacOS). Что даст дополнительный стимул для развития свободного софта вообще.