Еще раз про любовь, или что же такое дистрибутивы Linux

Алексей Федорчук, февраль 2005 г.

На сочинение этой заметки меня побудила недавняя статья Виктора Костромина “Периодическая таблица дистрибутивов Linux”, в которой была сделана попытка разработать классификацию дистрибутивов Linux. Или, скорее, обсудить принципы подхода к такой классификации.

Преамбула

Вообще говоря, попытки классификации дистрибутивов Linux предпринимались неоднократно - наверное, с того момента, как впервые оформились три первых генеральных линии их развития. Однако времена меняются, и дистрибутивы меняются вместе с ними. И та самая, первая, классификация их на линии Slackware, Red Hat, Debian давно уже не отвечает реалиям текущего момента. Применительно в которому Виктор и написал свою статью. Сама по себе ее форма служит предлогом к обсуждению, тяга к коему лишь частично была реализована на Linuxforum'е. И потому ниже находит свое естественное продолжение.

Однако сначала - несколько вводных замечаний. Первое касается самого термина дистрибутив (Distributions). Как-то на том же Linuxforum'е возник вопрос об адекватном русском его эквиваленте. И, после обсуждения и обмена мнениями выяснилось, что таковым будет слово дистрибутив:-). Почему? Да потому, что английское Distributions приобретает весьма разный смысл (как в оригинале, так и в переводе) в зависимости от контекста. Для доказательство чего достаточно сравнить три словосочетания: Windows Distrinutions, FreeBSD Distributions, Linux Distributions.

Действительно, какие ассоциации вызывает у нас словосочетание дистрибутив Windows? Перед глазами сам собой возникает образ CD-бокса с голограммой, подтверждающей подлинность, приобретаемый за 100 примерно американских рублей в респектабельном компьютерном салоне. Или, чаще, его купленная за 100 рублей уже пост-советских "базарная" копия, подчас более или менее точно воспроизводящая и внешний вид оригинала.

В то же время FreeBSD Distributions - понятие не материальное, а скорее идейное. Оно включает в себя ядро и комплекс самодостаточных средств для его функционирования и использования. То есть собственно и является операционной системой FreeBSD.

И, наконец, слова дистрибутив Linux (а дальнейшем речь пойдет именно о нем) рождают в уме самые различные образы. Здесь будут и красивые коробки с книжками документации толщиной в десятки сантиметров, и аскетические CD-боксики с тонкой брошюркой, и сотни мегабайт качаемых из Сети ISO'шников, и даже наборчики из двух дискет - все это дистрибутивы Linux. Главное же в том, что вслед за словами дистрибутив Linux практически неизбежно следует имя собственное - Red Hat или Debian, Slackware или Gentoo, - имя им легион. Так чем же завлекательно-таинственный Sorcerer отличается от фундаментального Arch'а, неопределенная аббревиатура ASP - от вполне прозрачной LFS, крестоносный CRUX - от легкомысленного Rubyx'а?
Пара слов о Base Linux

Чтобы ответить на этот вопрос, нужно для начала определиться с тем, что же такое все-таки дистрибутив Linux (или, как говорят в народе, Linux-дистро)? Что для начала требует определения для самого понятия Linux. Попробуем ответить на поставленные вопросы последовательно - начиная с самого общего.

Широко распространенное мнение о том, что Linux - это не более чем ядро операционной системы, видится мне несколько ограниченным. Ибо само ядро - вещь в себе, и не пригодно не только к использованию, но даже не способно загрузить само себя. И потому, с точки зрения любого пользователя этой операционки (а таковыми являются все, кто ее использует: от конечного пользователя до собственно разработчика ядра), она представляет собой некий минимально самодостаточный комплекс утилит и приложений, обеспечивающих функционирование и использование ядра ОС, который можно назвать Base Linux.

Понятие Base Linux неоднократно рассматривалось ранее - последнее по времени изложение этой концепции можно найти здесь. Должен, однако, заметить, что ныне мои представления на сей предмет несколько изменились - не без влияния статьи Тихона Тарнавского. И ныне в этот комплекс я включил бы следующие компоненты:

ядро Linux (ну еще бы:-));

средства его загрузки (собственно загрузчик и сценарии инициализации) и обеспечения функциональности (то есть утилиты, реализующие поддерживаемые ядром функции - работу с устройствами, файловыми системами, сетевыми протоколами; согласитесь, мало радости пользователю от поддержки ядром некоей файловой системы, если он не располагает инструментами для работы с ней);

минимальный набор системных и пользовательских утилит (преимущественно, но не обязательно происходящих из недр проекта GNU) и интегрирующую их командную оболочку;

средства обеспечения работы утилит и приложений - общесистемные библиотеки.

Сравнение этого списка с ранее приведенным показывает, что из него исключены компилятор и прочие средства разработки (точнее в данном контексте - средства сборки) программ, именно на это меня подвигла упомянутая выше статья Тихона. Почему - ответить не сложно: некоторые дистрибутивы, как будет показано ниже, в принципе способны обходиться без таковых.

А вот перечисленные компоненты можно обнаружить в любом дистрибутиве Linux, однако состав их может различаться. Конечно, ядро Linux будет безальтернативно присутствовать всегда - иначе это был бы не Linux, а другая операционная система. Да и утилиты поддержки будут одни и те же - очевидно, что для обеспечения работы с файловой системой Ext2fs (для примера) потребуется соответствующий пакет (e2fsprogs). Однако дальше возможны варианты: конечно, на практике во всех дистрибутивах Linux в качестве общесистемной командной оболочки используется bash, а в роли общесистемной библиотеки выступает glibc. Однако теоретически никто не мешает заменить первую любым POSIX-совместимым шеллом, а вторую - каким-либо аналогом, и реально такие случаи известны. Например, в Linux для встроенных систем в качестве главной Си-библиотеки выступает eClibc, bash в небольших дистрибутивах подменяется ash'ем, и так далее. В принципе, при статической линковке, можно обойтись и без общесистемной библиотеки вообще, хотя на практике такое встречается крайне редко, и только в узкоспециализированных системах.
О дистрибутивах

Base Linux, обеспечивая исходную функциональность системы, далеко не способен удовлетворить запросы большинства пользователей. И потому нуждается в наращивании самыми разнообразными программами - от оконной системы X и менеджеров окон до редакторов, браузеров, серверных и офисных приложений, и так далее. Которые, в свою очередь, связаны зависимостями с самыми разнообразными библиотеками и иными разделяемыми компонентами. Разрешение таких зависимостей - задача нетривиальная, и требует определенной системы. И тут, наконец, мы приходим к определению дистрибутива Linux. Каковое я сформулировал бы так:

Дистрибутив Linux - это система комплектации ядра ОС и комплекса его окружения утилитами и приложениями.

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

Как известно, по сей день человечество придумало лишь два способа управления программным обеспечением - сборку их непосредственно из исходных текстов и установку из прекомпилированных бинарных пакетов. В соответствие с чем мы и разделяем изобилие дистрибутивов Linux на два больших класса.

Первый класс - дистрибутивы пакетные: все их компоненты, от ядра и базовых утилит и до самого распоследнего пользовательского приложения, устанавливаются из заранее собранных (прекомпилированных бинарных) пакетов. Соответственно и распространяются они в виде прекомпилированных пакетов. А неотъемлемым компонентом такого дистрибутива будет система пакетного менеджмента.

За вторым классом закрепилось название Source Based дистрибутивов. На мой взгляд - не самое удачное, и по двум причинам. Во-первых, пакетные дистрибутивы в конечном счете также собираются из исходников (потому что больше их просто не из чего собирать:-). А главное - дистрибутивы эти не просто собираются посредством трех сакральных слов (./configure, make, make install), а собираются по вполне определенным правилам, обеспечивающим регистрацию установленных компонентов и удовлетворение их взаимных зависимостей. Набор таких правил испокон века носит имя системы портов, пришедшее из мира BSD. И потому второй класс правильнее было бы величать дистрибутивами портируемыми: какая-либо из портообразных систем оказывается столь же непременной их составляющей, как система пакетного менеджмента - для пакетных дистрибутивов.

В отличие от пакетных дистрибутивов, дистрибутивы портируемые распространяются обычно в виде некоего базового прекомпилированного комплекта, более или менее соответствующего по составу выделенному выше Base Linux - с той лишь разницей, что тут компилятор и утилиты для сборки оказываются уже непременной его составляющей. Плюс - собственно система правил для получения и сборки всех остальных необходимых приложений. Причем правила эти распространяются и на компоненты базового комплекта - средства пересборки его (bootstrapping) практически обязательны для любого портируемого дистрибутива. Впрочем, некоторые из портируемых дистрибутивов распространяются преимущественно в прекомпилированном виде, почему это понятие не тождественно понятию дистрибутива Source Based (собственно, последние можно рассматривать как подмножество портируемых дистрибутивов).

Четкую грань между пакетными и портируемыми дистрибутивами провести нелегко. С одной стороны, развитые системы пакетного менеджмента подразумевает возможность построения пакета непосредственно из исходников, хотя обычно эта возможность не является "сквозной" (то есть распространяемой на систему в целом). С другой стороны, ряд портируемых дистрибутивов распространяется преимущественно в прекомпилированном виде, а система портирования выступает в качестве опции. С третьей же - системы пакетного менеджмента являются столь же неотъемлемой часть портируемых дистрибутивов, как и дистрибутивов пакетных. Другое дело, что, как правило, они оказываются вторичными (и производными) от системы портирования. То есть разделить портируемые и пакетные дистрибутивы можно по субтрактивному принципу: первые имеют и систему портов, и систему пакетного менеджмента, тогда как вторые - только последнюю.
О пакетах и пакетных дистрибутивах

Возможна ли более дробная классификация дистрибутивов каждого класса? Возможна, причем по независимым критериям. Так, для пакетных дистрибутивов напрашивается разделение по формату пакетов. Которые можно разделить на две группы - те, что содержат внутри себя мета-информацию (в частности, информацию о зависимостях пакетов), и таковой лишенные.

К первой группе относятся широко распространенные форматы пакетов rpm (Red Hat Packages Manager, характерный для одноименного дистрибутива и его многочисленных потомков) и deb (свойственный дистрибутиву Debian и на нем основанным). И тот, и другой, помимо собственно архива бинарных файлов и путей к ним, содержат данные о зависимостях, хотя и представленные в разной форме (впрочем, детали описания мета-информации в аспекте классификации не важны).

Пакеты без метаданных - это обычные тарбаллы, то есть компрессированные tar-архивы типа *tar.gz/*tar.bz2 (часто фигурирующие в форме tgz и tbz). Важно, что сами по себе tgz и tbz - это форматы вовсе не пакета, а именно архива (то есть определяются используемой утилитой компрессии - gzip или bzip2, соответственно). А важно это потому, что те же самые tgz/tbz архивы могут прекрасно содержать в себе и мета-информацию, оказываясь более сходными с пакетами rpm или deb (и ниже мы столкнемся с примерами этого). Примеры из Linux-мира мне на ум не приходят, однако packages FreeBSD показывают, что ничего невероятного в этом нет.

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

Программы пакетного менеджмента - еще один из критериев классификации. Правда, собственно средства установки пакетов жестко привязаны к их формату - для установки rpm-пакетов служит одноименная утилита (rpm), пакеты deb устанавливаются посредством утилиты dbpkg, для пакетных тарбаллов предусмотрены собственные средства, в зависимости от их формата (и обычно - дистрибутив-специфичные, не смотря на похожие, и даже подчас одинаковые, имена). Конечно, существуют средства взаимной трансформации пакетов разных форматов (типа rpm2cpio, rpm2tgz или почти универсальной утилиты alien), однако возможности их применения ограничены - очевидно, что из rpm-пакета (и тем более "чистого" тарбалла) получить полноценный deb-пакет невозможно.

Однако существуют еще и средства пакетного мета-менеджмента, если так можно выразиться (собственно, только они-то и заслуживают названия систем управления пакетами). Наиболее известное и распространенное из них - apt. Появившийся сначала в Debian'е и рассчитанный, соответственно, на deb-пакеты, он очень быстро стал универсальным кросс-пакетным механизмом установки, удаления и обновления программ, успешно работая с пакетами rpm (дистрибутивы Connectiva, Altlinux), тарбаллами Slackaware (механизм slapt-get). И в принципе не видно препятствий к прикручиванию его к тарбаллам любого формата - от "чистых" до сколь угодно насыщенных метаинформацией.

Под явным влиянием apt возникли и иные системы пакетного менеджмента - yum, urpmi и так далее. Однако они ориентированы только на rpm-пакеты (вероятно, их можно использовать и для иных форматов, но кому это нужно при наличии apt?) и потому не получили столь широкого распространения, оставаясь принадлежностью "родительских" дистрибутивов и более-менее точных их клонов (yum, насколько мне известно, используется только в Red Hat/Fedora и ASPlinux).
Порты и портируемые дистрибутивы

Обратимся теперь к дистрибутивам портируемым. Их также можно разделить на две группы - дистрибутивы, распространяемые преимущественно в виде исходников (то есть собственно Source Based) и дистрибутивы, распространяемые главным образом в прекомпилированной форме.

Самым известным и распространенным представителем первой группы является Gentoo, меньшей популярностью пользуются Sorcerer и его потомки - SourceMage и Lunar. Все они образованы из базового тарбалла (или набора взаимоисключающих тарбаллов, как Gentoo) и системы получения, компиляции, установки, учета и контроля зависимостей сторонних (то есть выходящих за пределы Base Linux) пакетов. Не смотря на их принципиальное сходство (обусловленное наследованием идейных традиций портов FreeBSD), двух одинаковых среди них мы не обнаружим - система portage из Gentoo отличается от "заклинаний" (sorcery) из Sorcerer как реализацией, так и приемами использования.

Преимущественно "исходнячное" распространение Source Based дистрибутивов не исключает их пакетирования (так, Gentoo распространяется и в прекомпилированном варианте). Соответственно, имеют они и средства управления пакетами - однако они не образуют самостоятельной целостности, а являются составной частью системы портов.

Представителями прекомпилированных дистрибутивов, обладающими системой портов, являются CRUX и Archlinux. В отличие от предыдущей группы, в них портообразные системы (ports и ABS, соответственно) мирно сосуществуют с самостоятельными (и весьма развитыми) средствами пакетного менеджмента: так, pacman из Archlinux, если еще и не достиг мощи Debian'овского apt'а, то стремительно движется в этом направлении. Тем не менее, сами пакеты, распространяемые в составе дистрибутива, генерируются за счет портообразной системы, которая позволяет также легко выполнить и пересборку базовой системы в соответствии с запросами пользователя (подробности об Archlinux можно прочитать здесь).

К слову говоря, пакеты Archlinux, представляющие собой (как и пакеты большинства дистрибутивов этой группы) "чистые" тарбаллы, являют пример эффективного контроля зависимостей за счет внешних баз данных - базы пакетного репозитория (на установочном диске и на сервере проекта) и базы пакетов, установленных на локальной машине. Гибкость такого "внешнего" метода пакетного менеджмента определяется тем, что пользователь может легко создать собственный пакетный репозиторий в базой данных, в которой описаны только нужные ему зависимости.
О предназначении

Я столь подробно остановился на системах пакетного менеджмента потому, что полагаю их основополагающим критерием классификации дистрибутивов Linux, вытекающим из самой их природы. Однако и остальные критерии классификации игнорировать не след. И одним из таких критериев традиционно выступает назначение дистрибутива. В этом аспекте обычно выделяется три их группы - дистрибутивы серверные, десктопные и системы специального (подчас узкоспециализированного) назначения. Давайте посмотрим, насколько это обоснованно.

Для начала отметаем различие между серверными и десктопными системами. Действительно, Mandrake Linux, со дня своего возникновения позиционируемый как типичный user-ориентированный дистрибутив, даже в своей установочной программе имеет опцию - установки в качестве сервера. С другой стороны, серверные редакции Red Hat или Suse ничем (технологически) не отличаются от своих младших десктопных родственников, и вполне могут быть использованы в качестве последних. Правда, никто, скорее всего, делать этого не будет - при изобилии существенно более дешевых альтернатив, однако это уже относится к сфере ценовой политики...

Конечно, существуют и чисто серверные разновидности дистрибутивов, просто не содержащие в комплекте поставки никаких пользовательских приложений, вплоть до отсутствия оконной системы X. В качестве характерного примера тут можно упомянуть Altlinux Castle. Однако такие системы правильнее было бы отнести к разряду узкоспециализированных.

Так что мы опять-таки приходим к бинарной классификации - на дистрибутивы общего назначения (или универсальные) и назначения специального, не так ли? Не совсем. Потому что специализированные системы, как правило, самостоятельного значения не имеют. Создаваясь на базе систем универсальных - за счет сознательного урезания их функций. А универсальность дистрибутива именно в том и состоит, что из него можно выкроить и сетевой роутер, и ftp- или http-сервер, и даже игровую станцию (вспомним game-CD проекта Gentoo) или некий аналог бытового телевизора (MoviX).

С другой стороны, разделение на универсальные и специализированные дистрибутивы на практике имеет некоторое значение. В первую очередь - из-за расплодившихся в последнее время LiveCD - Linux-систем, способных не только запуститься, но и функционировать с компакт-диска, без установки на винчестер. Правда, большинство из них - производные "нормальных" дистрибутивов: из того же Gentoo их можно печь, как блины. А самостоятельные разработки - типа Knoppix'а - играют сугубо демонстративную роль. Если же они используются как рабочие, то превращаются в самый обычный Debian (применительно к примеру Knoppix'а).

Тем не менее, разделить дистрибутивы по назначению можно иначе, именно: дистрибутивы "для себя" и дистрибутивы "для всех". Первый представляют собой скорее конструкторские наборы для построения индивидуальной системы, отличаясь более-менее простыми инсталляторами слабо развитыми средствами конфигурирования (с выраженной тенденцией к ручным настройкам). Самый характерный пример этой группы - Gentoo, вообще не имеющий ни инсталлятора, ни конфигуратора (точнее, в нем в этом качестве выступают командная оболочка и текстовый редактор).

Дистрибутивы "для всех" - это системы, работающие "из коробки", такие, как Red Hat, Suse, Mandrake. Отличаются красивыми графическими инсталляторами и средствами сквозного конфигурирования, делающими установку и настройку легкой и простой. Оборотная сторона чего - недостаточная гибкость того и другого, а также сложность глубокой индивидуализации системы: очевидно, что представления об идеале у всех разные, и попытка создать идеал для всех приводит к тому, что он не достигается ни для кого...

Очевидно, что к категории дистрибутивов "для себя" относятся все системы портируемого класса, тогда как среди пакетных дистрибутивов преобладают системы "для всех". Однако в последнем случае исключений не намного меньше, чем правил. Так, типично пакетный дистрибутив Slackware, безусловно, нужно отнести к системам "для себя". А Debian, в зависимости от стратегии инсталляции, может быть превращен в систему и той, и другой категории.

Говоря о дистрибутивах "для себя", я отнюдь не подразумеваю их малой распространенности: так Gentoo за последние годы прочно обосновался среди лидеров по популярности (а ранее в этом качестве стабильно пребывала Slackware). И не отрицаю, опять же, что система "для всех" может быть также весьма индивидуализирована - просто устройство Red Hat или Mandrake пользователя к тому отнюдь не подталкивает. А, скажем, Yast из Suse так просто препятствует "ручному" вмешательству в настройки (видимо, полагая это разновидностью рукоблудия:-)). С другой стороны, готовые решения на базе портируемых дистрибутивов часто приближаются по своим качествам к системам "для всех" - и тут можно вспомнить CRUX Evolution.

Есть и другой критерий аналогичного разделения - на дистрибутивы, дружественные к пользователю, и дистрибутивы, дружественные, по выражению Клиффорда Вольфа (создателя Rocklinux - одного из первых Source Based дистрибутивов), к администратору. Причем последнее отнюдь не предполагает серверной ориентации дистрибутива: ведь на десктопе каждый пользователь сам себе root. И, позаботившись о своем удобстве в первом качестве, не лишним было бы вспомнить и о собственных же интересах - во втором.

И тут встает вопрос о предмете общесистемного конфигурирования, что в значительной своей части сводится к (почти по товарищу Мао) стилям стартовых сценариев. Конечно, разделение дистрибутивов по этому признаку на две группы (стиль System V и BSD-подобный стиль) - объективная реальность, весьма важная для пользователя в ипостаси администратора (и, тем более, для собственно администратора). И тут можно наблюдать интересную закономерность: практически все дистрибутивы "для всех" придерживаются схемы инициализации в стиле System V, тогда как среди дистрибутивов "для себя" доминируют вариации на тему BSD-подобного стиля. Наводит на размышления, не так ли?
Подведение итогов

Итак, дистрибутивы Linux можно разделить по двум независимым критериям на две пары частично перекрывающихся по составу групп. С одной стороны, по способу комплектации обособляются дистрибутивы пакетные и портируемые, с другой, по назначению - дистрибутивы "для всех" и "для себя". Что можно выразить в табличной форме примерно таким образом (таблица).

Способ комплектации


Пакетные дистрибутивы

Портируемые дистрибутивы

Назначение

"Для всех"

Red Hat/Fedora, Suse, Mandrake, Altlinux, ASPlinux, отчасти Debian

CRUX Evolution


"Для себя"

Slackware, отчасти Debian

Rocklinux, Gentoo, CRUX, Archlinux, Sorcerer, SourceMage, Lunar

Примечание: в таблице перечислены только те дистрибутивы, которые мне довелось устанавливать и видеть в работающем состоянии.

Можно ли дать более дробную классификацию дистрибутивов? Как было показано выше, в принципе можно. Например, по типам пакетов - для первого класса, по соотношению портируемых и прекомпилированных компонентов - во втором. Нужно ли? Мне кажется, нет. Потому что выделенные четыре перекрывающиеся группы дают вполне достаточное (для пользователя) представление о потребительских, так сказать, качествах их представителей. А потом - в конечном счете все дистрибутивы мы поделим всего на две группы - те, которые нам нравятся, и те, что мы не любим. Причем каждый сделает это по-своему...

Сайт управляется системой uCoz