LRs: вариации на тему «Linux’а с нуля»

2002 г
Первая версия статьи о LRs была написана летом 2002 г. С тех пор этот проект то глох, то реанимировался заново. И нынче, по данным Distrowatch, числится в мертвых — так что все сказанное ниже следует воспринимать в прошедшем времени. Затем LRs лег в основу еще одного дистрибутива — MyGeOs, который, правда, тоже можно считать прочно мёртвым. Тем не менее, свою роль в истории Source Based дистрибутивов он сыграл.

Как известно, существует множество дистрибутивов Linux, хороших и, иногда, разных. Одни из них являют собой полные коллекции всего и вся. Воплощаясь, в итоге, в метадистрибутивы, лучшим примером чему служит всем известный Sisyphus. Иные идут по пути самоограничения, претворяясь в итоге в нечто вроде Linux на одной дискете (примером чему — mulinux, (почти) функциональный дистрибутив, правда, на двух дискета, вторая — система X). Третьи же, в поисках баланса между этими путями, обращаются к идее пользовательской наращиваемости, впервые появившейся во FreeBSD. Что еще последовательно проводится в дистрибутиве Gentoo Linux.

Однако существует радикальное решение этого диалектического противоречия — отказ от дистрибутива вообще. То есть сборка функциональной системы из отдельных компонентов, начиная с ядра, компилятора, glibc и кончая пользовательскими приложениями. Что нашло свое воплощение в проекте Linux from Scratch.

Конечно, нельзя сказать, что в этом случае Linux собирается из совсем уж ничего. Хотя на первых же страницах своего руководства (LFS Book — очень увлекательное чтиво для любого линуксоида) разработчик, Герард Бикманс (Gerard Beekmans) заявляет о принципиальном отказе не только от любых прекомпилированных пакетов, но и от всякого рода CD ROM и загрузочных дисков при сборке базовых компонентов.

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

Тем не менее сама по себе идея сборки дистрибутива из исходников с нуля — очень заманчива. И потому мое внимание привлек проект, развивающий принципы LFS. Он носит имя LRs-Linux и в значительной степени основан на LFS. Однако, в отличие от прототипа, это — все же дистрибутив, хотя и своеобразный. Он доступен в виде iso-образа загрузочного CD, на котором помещаются все необходимые для функционирования системы компоненты. И, следовательно, является самодостаточным. О нем и пойдет речь в настоящей заметке.

Итак, загружаемся с CD — в квазитекстовой моде, то есть Frame Buffer. Причем в весьма своеобразном режиме — монитор тут же приходится перенастраивать, равнение — по голове пингвина с заставки. Далее — выбор клавиатурной раскладки, это становится общим местом загрузочных Linux-CD. Предупреждаю, что выбирать раскладку, отличную от английской американской, не рекомендуется — эффект может быть весьма странным (хотя и US-клавиатура не спасет от неожиданностей после инсталляции, но — каждому овощу свой фрукт). А потом дело доходит и до языка установки. Список обширен (включая русский), но доступные для выбора пункты — только английский, французский и немецкий.

Сразу замечу, что диск, согласно описанию, служит трем целям — как rescue-носитель, для т.н. salvage installation, и для установки просто. Так вот, если не выбрать никакого языка, мы тут же оказываемся в rescue-режиме, сиречь просто в shell’е, запустить установку из которого возможным не представляется (по крайней мере, я такой возможности не нашел). Так что английский американский, хотя и отмеченный по умолчанию, выбрать все-таки необходимо.

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

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

А в остальном в инструкции по установке особой необходимости нет — инсталлятор почти что за руку проведет по всем ее этапам, сопровождая свои (и наши) действия в нужных местах комментариями и предупреждениями, а то и просто напоминаниями.

Так, первое из таких напоминаний — перед первым же серьезным деянием, разбиением диска. Предваряющий текст (так и хочется назвать его сопроводиловкой) гласит, что под корневой раздел нужно отвести 1,8 Гбайт, под swap-раздел — 64-128 Мбайт, и отдельно можно сделать boot-раздел в 20 Мбайт. А заодно напоминает нам, что ATA-диски в Linux называются /dev/hda, /dev/hdb и т.д., файловая система Linux маркируется шестнадцатеричным кодом 83, а система для раздела подкачки — кодом 82. Пустячок, а приятно — можно не ошибиться даже в последнем градусе склероза.

Для разбиения дисков рекомендован cfdisk (в инструкции сказано, что можно и графической утилитой, но, видимо, это — еще в проекте). Однако не возбраняется и метод «для крутых», именуемый hard way. Под чем, как легко догадаться, подразумевается обыкновенный fdisk.

Вне зависимости от того, избрали ли вы путь трудный или легкий (кстати, никогда не мог понять, почему cfdisk считается легче в использовании — по мне, так fdisk много проще, гибче, а главное — прозрачнее), следующий шаг — выбор точек монтирования созданных разделов. С параллельным назначением им файловых систем. Среди последних доступны ext2fs (ну еще бы!), ее журналируемый отпрыск ext3fs и ReiserFS — ни программного RAID, ни XFS в списке нет. И вручную их также определить нельзя…

Определение точек монтирования требует некоторой аккуратности. Так, если был создан специальный раздел под /boot, его обязательно следует смонтировать раньше, чем корневую файловую систему — иначе он просто пропадет из списка. И при выборе пунктов меню (а делается это цифрами, по номерам) лучше не ошибаться — клавиша Delete ничего не удаляет, а ошибка приводит к выбросу в командную строку. После чего единственный выход, если есть желание продолжить эти игры — перезагрузка, и все с начала.

По завершении разметки диска предлагается вчерне выбрать то, что будет устанавливаться. Варианты — пуристический набор LFS, набор собственно LRs (это — не пересекающиеся множества), LRs+XFree86, LRs+XFree86+KDE (к сожалению, в текущей версии только 2.2.2). В качестве стандартного рассматривается вариант LFS+все остальное. Устрашаться такому не нужно — на следующем этапе можно будет детализировать выбор до отдельных пакетов (причем не только из выбранного набора, но и из любого невыбранного).

Тем не менее на самом деле степеней свободы не так и мало. Потому что в состав LFS входят базовые компоненты системы (мало без чего можно обойтись в этом наборе), в состав LRs — основные пользовательские приложения и утилиты (тут, конечно, кое от чего, а то и от многого, можно отказаться). В набор XFree, кроме собственно X’ов, включены несколько менеджеров окон (WindowMaker, Blackbox, XFce) и абстрактно-иксовые приложения и утилиты (далеко не все из них видятся мне необходимыми, так что простора для вычеркивания хоть отбавляй). А с KDE — все понятно, если есть желание использовать эту среду, придется ставить практически все из ее набора.

К вычеркиванию пакетов из наборов следует подходить вдумчиво. Ни малейшего контроля завивисмостей не осуществляется, как не предлагается и никакой подсказки. Так что можно спокойно заказать установку kdebase без библиотеки Qt — и узнать о невозможности этого только при компиляции (причем — далеко не сразу, но об этом позже). Однако при понимании взаимосвязи пакетов и библиотек можно (сверяясь при этом с LFS-Book, без нее тут не обойтись) собрать компоненты системы очень точно, как в рюкзаке хорошего туриста — где, как известно, не должно быть ничего лишнего, но все необходимое должно быть.

В плюс системе, пакеты собираются без излишеств — ну кому, скажите на милость, нужна сборка Midnight Commander с поддержкой GNOME, как это бывает (точнее — бывало в те времена — А.Ф..) по умолчанию в большинстве дистрибутивов? И, что лично мне понравилось, консольные меню-ориентированные программы компилируются без поддержки gpm — на мой взгляд, щелканье мышью по менюшкам не искупает усложнения использования традиционного консольного cut&paste.

Но я забежал вперед — пока мы только начинаем подготовку к сборке пакетов. Для чего перво-наперво выбираем компилятор, gcc-2.95 или gcc-3.0.3. Сопроводиловка гласит, что второй генерит более быстрый код, но может не собрать старые исходники. Последнее в общем случае верно, но, опять же предвосхищая события, скажу, что все выбранное мной (почти весь LFS, LRs без большей части сетевого инвернтаря и минимальнейшие X’ы с голимым Blackbox’ом) скомпилировалось без проблем. Вернее, проблемы, конечно же, были, но к компилятору они отношения не имели.

Далее вопрошается, включать ли оптимизацию при сборке. Варианты — от i386 до Athlon (последний — лишь при выборе gcc-3). Или — установить тип процессора мануально, для любых поддерживаемых gcc процессоров. Я, грешным делом. не озаботился узнать заранее, есть ли в gcc-3 оптимизация под P-4 (а ставилась система именно на него), и никаких сопроводительных замечаний на сей предмет сообщено не было. Хотя это было бы полезнее, чем напоминание о коде файловой системы Linux. И потому ограничился оптимизацией под абстрактный i686.

Следующий вопрос также потребовал напряжения мысли — об уровне оптимизации, 1-м или 2-м. Что понимается под цифрами — a priory ясно не было, и комментарии отсутствовали. Возможно, для Linux-разработчика ответ очевиден (но он вряд ли нуждается и в напоминании о номенклатуре дисков). Я же методом дедукции, индукции и интуиции решил, что 2-й уровень означает CFLAGS="-march=i686" etc., тогда как 1-й — CFLAGS="-mcpu=i686". И, что приятно, оказался прав, соответствующие строчки замелькали на экране с началом сборки.

Правда, недолго — минут через 15-20 мелькание прекратилось, хотя и погасания экрана не было — строки просто застыли на месте. Я сначала подумал, что машина зависла насмерть — однако о каких-то процессах жизнедеятельности напоминали индикаторы винчестера и CD ROM. Сверился с инструкцией — и вычитал ту самую главную в ней истину, о которой говорил в начале: что сборка системы может занять от 2 до 14 часов. Для примера указывалось, что полная исталляция на P-III/800 требует часов аж 10.

У меня был не P-III/800 (а P-4/1,9), и полной инсталляции я не заказывал, так что, по прикидке, часа в два уложиться должен был, так что выпил крепкой кавказской водки кислярки и лег на досадную укушетку перечитывать LFS-Book (двести страниц чистого текста 10-м кеглем). В итоге процедура заняла 2 часа 25 минут.

Но это было еще не все. Впереди предстояла сборка ядра — если, конечно, не воспользоваться предлагаемым ядром LRkernel. Что я с негодованием отверг, хотя, в свете дальнейших событий, это было бы лучшим выходом. Конфигурирование ядра делается (безальтернативно) посредством make menuconfig, вызываемой автоматически.

Ядро в комплекте оказалось не из наипоследних (2.4.17), без поддержки XFS (почему она и не предлагалась при монтировании разделов). Так что много внимания этому я не уделил — все равно прийдется скоро переставлять. А вот дальше мне совсем не понравилось. По выходе из меню конфигурирования процесс сборки начался автоматически, причем я даже не успел рассмотреть, что там происходило — bzImage ли собирался, или еще какой zdisk (судя по дальнейшему, именно последний).

А затем, без всякого перехода, задание пароля для root’а (причем система не один раз предупредила меня о чрезмерной простоте использованного для этого матерного ругательства на одном из экзотических языков), задание пользователя и, сразу же, конфигурирование LILO. От последнего можно отказаться, если выбрать загрузку с дискеты — но «это, говорят, не современно».

А вот LILO конфигурится в простом текстовом редакторе (к слову — я так и не понял, в каком, нечто вроде jed без меню). И это оказалось для меня камнем преткновения. То, что по умолчанию оно было настроено на загрузку с дискеты, исправить было несложно. А вот указать образ для загрузки — неколько затруднительно, ведь файла его я в глаза не видел. Пожалел, что не выбрал умолчальный вариант с ядром LR и загрузкой с дискеты, но увы — как я уже упоминал, никакого отката не предусмотрено, только выход и перезагрузка. И нет второй консоли, чтобы посмотреть, что же там у меня собралось…

Прописал образ ядра по наитию (ошибочно, но потом выяснилось, что ни один из обычных все равно не подошел бы). И перешел к последнему пункту программы — очистке бинарников от отладочной информации (так я перевел оригинал). После чего предлагалось на выбор — перезвагрузка или активизация консоли. Тут бы мне, конечно, выбрать последнее, посмотреть, что там с ядром и при необходимости поправить /etc/lilo.config, но зуд в трех намозоленных пальцах оказался сильнее.

Словом, вы понимаете — из перезагрузки ничего не вышло. Взгрустнув, приготовился грузиться в rescue-режиме и бороться с LILO и ядром, как вдруг вспомнил о той самой salvage-инсталляции и решил ее попробовать — бороться-то особо было не за что.

Оказалось — не зря вспомнил, вещь хорошая. Быстро проскакиваешь выбор раскладки и языка — и оказываешься в стадии выбора пакетов. Тут в списках наборов уже отмечено, что установлено ранее (оказалось, оно регистрировалось в базе данных, где-то в /var). И можно не только добавить что-то, но и удалить. Я воспользовался обеими возможностями (плоды чтения LFS-Book на досадной укушетке в ходе инсталляции).

Удаление прошло безболезненно, а вот с установкой вышел облом. Решил было добавить Midnight Commander, но забыл отметить glib, без коей тот отказался собираться. Причем сообщил об этом не сразу, а довольно долго делал вид, что что-то там компилирует. Ну, тут-то не страшно, всего несколько минут потеряно. А вот представьте, каково было бы при нормальной инсталляции устанавливать KDE без чего-нибудь нужного: часов этак пять развлечений — и все начинай сначала.

В общем, выбрал в итоге «умолчальное» ядро и загрузку с дискеты, перезагрузился нормально — и не смог авторизоваться. Ни как root, ни как user. Тут дошло дело до rescue-режима (в single-user mode система грузиться почему-то отказалась), монтирования корневой файловой системы и искоренения (в /etc/shadow, разумеется) паролей.

Наконец, еще одна перезагрузка, авторизация без пароля — и я, наконец, в командной строке (bash, не иначе). И тут все стало мучительно ясно: по умолчанию была загружена немецкая раскладка. И не просто немецкая, а еще и qwertz — это почти что qwerty, только y и z поменялись местами, и все спецсимволы не там, где надо — потому и ни один пароль не проходил. Конечно, все равно раскладку следовало менять на qwerty/ru4, но ведь предупреждать нужно…

В комплекте, кстати, qwerty/ru4 нет, как нет и любой другой ru; консольные кириллические шрифты есть, mapscreen для koi2alt есть, русская locale есть, а раскладки нет. Прямо по Венечке Ерофееву — «вымя есть, а хересу нет». Помнится, с другим дистрибутивом «от германьцев» (вернее, австрияков) — RockLinux, уже было что-то подобное. Хорошо, цельно-потибреный комплект всего кириллического от Altlinux — всегда под рукой, прямо палочка-выручалочка (низкий за что поклон всем на http://www.altlinux.ru).

В общем, на русификации мои приключения по сборке Linux’а из ничего и закончились. Конечно, то, с чем я развлекался — далеко не «from Scratch». В сущности, обычный дистрибутив, с обычным меню-ориентированным, хотя и чисто текстовым, инсталлятором, может быть, предоставляющим чуть большую свободу выбора, чем другие (SB-системы, конечно, а не из тех,что под лозунгом «Linux и user братья навек»). Единственное отличие — абсолютно все собирается, а не устанавливается из прекомпилированных пакетов. И это, конечно, плюс — можно влиять на условия сборки — ту же оптимизацию, например. Хотя установка идет очень долго — и это, безусловно, минус…

Впрочем, последнее в моем случае практических результатов не имело. Не смотря на новый компилятор и оптимизацию, система получилась не особо торопливой. По крайней мере визуально, за Gentoo Linux (собранной посредством gcc-3, но с более новым ядром) ей еще гнаться и гнаться. Даже ReiserFS (я забыл сказать, что выбрал именно эту файловую систему) не показала себя в полном блеске на своей любимой операции (копировании большого количества мелких файлов).

Сказанное выше — отнюдь не в упрек. Все равно, идея хорошая, ну а что исполнение не на высшем уровне — так на то и версия-то всего 0.2.6. Важнее, что ориентация дистрибутива, особенно его сопроводиловок, не очень понятна. Повторюсь, что вряд ли тот, кто знает о связи mc и glib, нуждается в напоминании кода типа раздела под своппинг. А вот в нетривиальных случаях подсказки могли бы быть и подробнее.

Дальнейшая судьба дистрибутива LRs сложилась несколько странно. Вскоре после описанных событий проект как-то заглох и одно время на Distrowatch был даже помечен как мертвый. Однако потом гальванизировался, и время от времени выходили новые версии этого дистрибутива. Но я с ним больше дела не имел — руки не дошли…

А с некоторых пор (с 2005 г.) LRs в списках Distrowatch вообще не значится. Как, впрочем, и его потомок — MyGeOs.