CRUX

Алексей Федорчук
2003-2007

От 2008-07-26. Более пяти лет прошло со дня написания первой версии этой заметки. Сменялись версии CRUX’а. Появлялись, исчезали, чтобы подчас возродиться вновь, проекты по его переносу на архитектуры PPC, и AMD64, варианты дистрибутива, рассчитанные на более слабые, нежели i686, процессоры, сборка, использующая библиотеку uClibc вместо glibc… А сам CRUX всё такой же — компактный, быстрый, простой. Только меняются версии пакетов, да поклонники этого дистрибутива добавляют новые программы в коллекцию портов. Такого концептуального постоянства в мире Linux’а не видели со времен Slackware.

От 2009-02-11. Ныне, похоже, дистрибутив переживает не лучшие дни. Правда, в конце минувшего года, после большого перерыва, вышла наконец свежая версия дистрибутива — 2.5. А вслед за ней — и его сборка для 64-битных машин, которая долгое время казалась совсем заброшенной. Однако особой активности комьюнити вокруг этого дистрибутива не наблюдается. А жаль…

Эта заметка была написана по данным знакомства с CRUX версий 1.1-1.2 (и даже работы в оных). Однако обращение к версиям 2-й ветки показало, что в этом дистрибутиве с точки зрения установок и настроек ничего не изменилось (хотя сам по себе он стал еще лучше).

С дистрибутивом CRUX я по первости познакомился в начале 2002 г., в пору, когда был очарован FreeBSD. И единственной целью этого знакомства было сравнение так называемых портов из CRUX’а с их BSD-прототипом. Должен сразу сказать — клон оригинала выглядел тогда как плотник супротив столяра. И хотя в целом CRUX произвёл на меня хорошее впечатление своей современностью, компактностью и быстродействием, долгое время у меня не было ни случая, ни, честно говоря, желания к нему обращаться.

Поводом для возврата к этой теме послужила переписка с Владимиром Поповым, который взялся за этот дистрибутив в поисках современного Linux’а, способного нормально функционировать на ноутбуке о 166-м Pentium’е с 64 Мбайт памяти. Собственно, переписка эта и явилась непосредственным толчком для написания этой статьи, в которой учтены многие соображения, высказанные Владимиром (за что я и хотел бы, пользуясь случаем, выразить ему свою признательность).

Итак, CRUX. Проживает он на crux.nu, где можно а) получить о нем общее впечатление, б) ознакомиться с новостями проекта, в) почитать о нем в документации (к ней я еще вернусь особо) и, наконец, г) скачать его с одного из зеркал.

Сам по себе CRUX характеризуется его разработчиком, Пером Лиденом (Per Liden), как легковесный, оптимизированный под «шестерки» дистрибутив Linux, нацеленный на опытных пользователей (вернее, experienced user я в данном контексте перевел бы как «много повидавшие»). Распространяется он в виде iso-образа диска (объем образа стабилен от версии к версии — около 200 Мбайт), собранного под архитектуру i686. Соответственно, на машинах младше Pentium Pro он как бы работать не должен. Однако, кроме основной, или официальной, версии, есть еще и несколько Contributed-вариантов (собираемых сообщниками Пера), в том числе и под i586, и под AMD64, и даже под PowerPC. Забегая вперед, должен заметить, что CRUX для AMD64 — визуально самая быстрая система, которую я видел в своей жизни (на соответствующем «железе», разумеется).

Сам по себе диск представляет собой обычный загрузочный LiveCD без продвинутых возможностей, обеспечиваемых модулем cloop.o. То есть, смонтировав его обычным образом, через

$ mount -o loop /path2/crux-x86_64-2.1.iso

можно просмотреть все его содержимое. Тем не менее, он способен выступать в роли rescue-системы, предоставляя в распоряжение пользователя ограниченный, но достаточный для ремонтных целей набор busybox’а.

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

Подготовительный этап начинается после загрузки системы и беспарольной авторизации от лица root’а. Он — стандартен: создание дисковых разделов, файловых систем на них и монтирование оных в LiveCD-иерархию (в каталог /mnt). Останавливаться на этом я не буду — все это уже было многократно описано для многих других дистрибутивов. Замечу только, что в CRUX’е задействована файловая система устройств, devfs, причем задействована по полной программе, с автомонтированием ее в каталоге /dev при загрузке, на стадии установки, без обратной совместимости со старой номенклатурой устройств. И потому при монтировании вновь созданных на разделах файловых систем следует пользоваться только полной или сокращенной номенклатурой из devfs (типа /dev/discs/disc?/part?).

К слову сказать — CRUX был в числе пионеров при использовании devfs в варианте без обратной совместимости, эта особенность имела место быть в нем еще года три назад. Хотя, думаю, что к следующей версии devfs сменится современным udev.

Основной установочный этап начинается запуском скрипта setup, назначение которого легко понятно из названия. Это — собственно установка пакетов, выполняемая в псевдографическом меню в стиле FreeBSD или Slackware. И сводится она к выбору пакетов из двух категорий — base и opt (основной, то есть, и опциональной).

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

Важное предупреждение: в CRUX’е на стадии установки не предусмотрено никаких средств контроля зависимостей пакетов — ни для категории base, ни для категории opt. Что, казалось бы, возлагает на пользователя непосильное бремя отслеживания оных. Однако не случайно назван он дистрибутивом для «много повидавших»: ведь каждый из таковых давно уяснил для себя, что многие из так называемых зависимостей определяются не необходимостью (как, например, зависимость практически любой программы от библиотеки glibc), а представлениями разработчика (или, паче того, сборщика дистрибутива) о роскошном. То есть: часто при сборке пакеты конфигурируются по умолчанию с предоставлением дополнительных, но необязательных опций, которые кому-то могут просто мешать (мой излюбленный пример — сборка links и mc с поддержкой gpm, затрудняющей, ИМХО, использование в них мыши традиционным для консольного режима образом).

Так вот, все пакеты в CRUX собраны именно по принципу минимализма, без подключения дополнительных опций. И потому зависимости между пакетами — это именно необходимые (а не роскошные) зависимости, которые любой из «много повидавших» юзеров знает наизусть, по крайней мере, для категории base. И потому возможность изъять из нее некоторые подернутые мхом компоненты видится очень ценной.

Пример таких компонентов — пакет bin86 и строчный редактор ed. Первый требуется, фактически, только для начального загрузчика Lilo (и, насколько я знаю, ни для чего более). И если предполагается использование, например, GRUB (а это я настоятельно рекомендую вслед за многими резонными людьми), необходимости в нем, скорее всего, не возникнет никогда.

Редактор ed также мало кем используется сам по себе. Его присутствие в любой Linux-системе вызвано тем, что когда-то он требовался для наложения патчей на исходники. Ныне же все (вероятно) патчи составляются как diff-файлы, и необходимости в ed также не возникает. Хотя, in contrario, давеча мне пришлось прибегнуть к этой древней программе — и я убедился, что для решения некоторых задач она подходит просто идеально… Хотя, скажем, sed не менее удобен для массированной замены фрагментов в текстовых файлах, обеспечивая всю функциональность ed — и множество других возможностей.

Нужно сказать, что сами разработчики CRUX пошли на весьма радикальный шаг: вам не удастся увидеть в нем документации в формате info (и, соответственно, из категории base исключен также пакет texinfo), в установленной системе обнаруживаются только man-страницы. Что я лично только приветствую (поскольку пользовался info считанные разы, да и то не от хорошей жизни), но учитывать такую комплектацию придется в дальнейшем.

И еще одно проявление аскетизма — отсутствие в базовой системе gettext и, соовтветственно, поддержки национальных языков (NLS, довольно странный шаг со стороны разработчика-шведа). Впрочем, полноценной работе в кириллическом окружении это отнюдь не препятствует…

Расправившись с базовыми компонентами, можно перейти к категории opt. Здесь также виден здоровый, почти спартанский минимализм — набор утилит для работы с файловыми системами, отличными от ext2fs, сетевые утилиты, средства работы с пакетами, cdrtools и прочее, нужное почти всем и почти всегда. Далее — голые Иксы (в текущей версии задействован их вариант от Xorg и средства их поддержки (типа freetype), из оконных менеджеров — только WindowMaker, ни малейшими KDE или GNOME здесь не пахнет. Плюс Mozilla как универсальный браузер и почтовый клиент, да еще emacs (в базовом наборе из редакторов — только vim, собранный без возможности использования langmap — то есть подлежащий пересборке для полноценной работы в кириллическом окружении).

В общем, все это хозяйство после установки (а занимает она считанные минуты) укладывается в 200-500 Мбайт — по нынешним временам просто смешно. Но зато эти мегабайты заняты лишь тем, что действительно нужно, и к тому же — в наиболее современном исполнении. И, как будет показано дальше, при необходимости их можно легко нарастить, причем — различными способами.

Пока же перейдем к следующей стадии установки — начальному конфигурированию. Абсолютно необходимый шаг здесь один — редактирование файла /mnt/etc/fstab. В умолчальном виде он содержит множество закомментированных строчек с примерами на разные случаи жизни (и разные файловые системы). Остается только внести в него коррективы соответственно собственным реалиям. Правда, делать это придется в редакторе vim.

Этим же vim’ом можно внести изменения и в другие конфигурационные файлы, типа /mnt/etc/hosts и /mnt/etc/resolv, для настройки сетевого соединения. Ну и конечно, неплохо подредактировать главный стартовый файл, именуемый, в соответствие с BSD-традицией, /mnt/etc/rc.conf. В нем можно включить/выключить стартовые сервисы (по умолчанию — только net и crond), задать имя хоста (при отсутствии такового — HOSTNAME=localhost) и, наконец, указать раскладку клавиатуры (в том числе и русскую, о чем скажу позже).

Общий минимализм дистрибутива проявляется и в его настройках. Мало того, что в CRUX принят BSD-стиль стартовых файлов, сам по себе более компактный, так и дается лишь самый необходимый их набор. Достаточно сказать, что все содержание каталога /etc занимает (при стандартной плотности знаков 80×25) около четверти экрана.

Завершив конфигурирование (или отказавшись от оного — все, кроме настройки монтирования в /etc/fstab, можно сделать в дальнейшем), следует перезагрузить машину с того же CD и в ответ на приглашение загрузчика задать имя файла раздела, на котором расположена корневая файловая система:

boot > CRUX root=/dev/discs/disc?/part?

обращая внимание на регистр метки записи загрузчика — именно CRUX, а не, скажем, crux. После чего, опять авторизовавшись как root (и опять без пароля), перейти к завершающему этапу — конфигурированию и сборке ядра. Задерживаться на этом я обратно же не собираюсь, отметив только, что при этом обязательно включение опции поддержки файловой системы устройств и ее автоматического монтирования при старте.

Теперь остается только обеспечить загрузку системы. Штатно это предлагается сделать через Lilo (с соответствующим редактированием файла /etc/lilo.conf и запуском команды lilo). Однако если до сих пор стоял GRUB (как это было у меня) — никто не запретит воспользоваться и им (хотя в комплект дистрибутива он не входит).

Свежеустановленный CRUX обладает, как можно было понять из предыдущего изложения, базовой функциональностью полноценной Linux-системы, но для специальных задач (или специфических предпочтений) его может оказаться недостаточно. Так, в нем не увидишь gpm, без которой я не мыслю консольного существования, mc, милого сердцу любого выходца из «черного» DOS’а, а список редакторов, как я уже говорил, исчерпывается vim и emacs.

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

Подробности устройства системы портов CRUX’а я опускаю. Потому что главная функция его видится мне в другом: CRUX — идеальная основа для самостоятельной (то есть ручной) сборки всего, что выходит за рамки понятия Base Linux. Идеальная — потому что изначально не отягощена никакими a priory заданными зависимостями, базами данных пакетов и тому подобной бижутерии, призванной облегчить жизнь т.н. обычного пользователя, но только мешающая при ручной, штучной, установке программ. В этом отношении CRUX можно сравнить, пожалуй, только со Slackware.

При самостоятельной сборке программ следует учесть следующее. Я уже говорил, что никакой иной документации документации, кроме man-страниц, в CRUX не предусмотрено. Нет даже каталогов типа /usr/share/doc и /usr/share/info. И, соответственно, многие программы, сопровождающиеся doc- или info-страницами, просто вываливаются при компиляции.

Бороться с этим в ряде случаев, вероятно, можно какими-то опциями скрипта ./configure. Однако есть совсем элементарный способ, обнаруженный Владимиром Поповым — просто удалять каталог docs из дерева исходников программы после выполнения ее конфигурирования. Ну а флаги оптимизации можно опять же задать как переменные окружения в профильном файле используемой командной оболочки.

Однако это еще не предел самостоятельности пользователя. Потому что у CRUX’а я вижу еще одно призвание — быть материнской системой для полностью самостройного Linux’а — по заветам Герарда Бикманса или Джонатана Торна.

Завершения картины для, скажу несколько слов о базовой (то есть консольной) русификации системы. Она — очень проста, так в комплекте CRUX’а имеются все необходимые для этого компоненты — кириллические шрифты, клавиатурные раскладки, таблицы соответствия, вариации локалей ru_RU (особо отмечу локаль UTF8). Так что достаточно определить русские клавиши в /etc/rc.conf, а загрузку шрифта и mapscreen’а — в файле, например, /etc/rc.local. В котором вполне найдется место и для сценария активации mapscreen’а на всех наличных виртуальных консолях. Ну а локаль уж никто не запретит определить или в пользовательском, или в общесистемном профильном файле (типа /etc/profile).

И последнее. Для CRUX существует официальная документация — CRUX Handbook, весьма лаконичное сочинение, содержащее, однако, все необходимые дистрибутив-специфичные сведения (а за сведениями общего характера предлагается обращаться к общим же источникам информации). Этот документ существует в нескольких русских переводах, только их придется поискать в сети (ранее известные мне ссылки мертвы).