CRUX, или еще раз о Base Linux

Алексей Федорчук
[email protected]

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

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

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

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

Из Contributed-версий интерес представляет еще одна - crux-xfs, которая, как можно догадаться из названия, позволяет работать с файловой системой XFS. А поскольку все мои 70 Гбайт данных живут именно на xfs-разделе, к этой-то версии я и обратился для повторного знакомства с CRUX.

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

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

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

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

Основной установочный этап начинается запуском скрипта 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 также не возникает.

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

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

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

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

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

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

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

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

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

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

Однако это еще не предел самостоятельности пользователя. Потому что у CRUX'а я вижу еще одно призвание - быть материнской системой для полностью самостройного Linux'а. Ибо его можно скачать не только в виде iso-образа, но и как тарбалл исходников всех составляющие его программ (всего-то 300 Мбайт). И потому достаточно установить с CD на небольшой раздел только то, что необходимо для компиляции (правда, это большая часть категории base), после чего выполнить полный самострой по заветам Герарда Бикманса или Джонатана Торна (как это описывается в цикле Самостройный Linux.

К сожалению, заняться с самостроем непосредственно с инсталляционного CD СRUX'а не удастся - вся его пользовательская база ограничивается утилитами пакета busybox. Однако ничто не мешает изготовить из оригинального CRUX'а настоящий LiveCD с полным набором инструментария, руководствуясь при этом теми же принципами, которые положены в основу дистрибутива Knoppix или установочного диска Gentoo, о чем только что было написано Владимиром Поповым.

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