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