— Из ничего и выйдет ничего.
Как это понимать?
Под псевдонимом Шекспира
Король Лир
Как известно, существует множество дистрибутивов Linux, хороших и, иногда, разных. Одни из них являют собой полные коллекции всего и вся. Воплощаясь, в итоге, в метадистрибутивы, лучшим примером чему служит всем известный Sisyphus. Иные идут по пути самоограничения, претворяясь в итоге в нечто вроде Linux на одной дискете [1]. Третьи же, в поисках баланса между этими путями, обращаются и идее пользовательской наращиваемости, впервые появившейся во FreeBSD.
Однако существует радикальное решение этого диалектического противоречия – отказ от дистрибутива вообще. То есть сборка функциональной системы из отдельных компонентов, начиная с ядра, компилятора, glibc и кончая пользовательскими приложениями. Что нашло свое воплощение в проекте Linux from Scratch.
Конечно, нельзя сказать, что в этом случае Linux собирается из совсем уж ничего. Хотя на первых же страницах своего руководства [2] разработчик, Герард Бикманс (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, без нее тут не обойтись) собрать компоненты системы очень точно, как в рюкзаке хорошего туриста – где, как известно, не должно быть ничего лишнего, но все необходимое должно быть.
Правда, я, честно говоря, ожидал большего – а именно, возможности индивидуального выбора всех системных компонентов. А так в наборе LFS они фигурируют в виде обобщенных пакетов binutilites, nettools и т.д. И понять, что скрывается за ними, можно только из внимательного чтения все той же LFS-Book, а уж от чего-то внутри пакета отказаться – так и вовсе нельзя.
Однако, в плюс системе, пакеты собираются без излишеств – ну кому, скажите на милость, нужна сборка Midnight Commander с поддержкой GNOME, как это бывает по умолчанию в большинстве дистрибутивов (даже система портов FreeBSD этим грешит). И, что лично мне понравилось, консольные меню-ориентированные программы компилируются без поддержки 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-режима (в singl-user mode система грузиться почему-то отказалась), монтирования корневой файловой системы и искоренения (в /etc/shadow, разумеется) паролей.
Наконец, еще одна перезагрузка, авторизация без пароля – и я, наконец, в командной строке (bash, не иначе). И тут все стало мучительно ясно: по умолчанию была загружена немецкая раскладка. И не просто немецкая, а еще и qwertz – это почти что qwerty, только y и z поменялись местами, и все спецсимволы не там, где надо – потому и ни один пароль не проходил. Конечно, все равно раскладку следовало менять на qwerty/ru4, но ведь предупреждать нужно…
В комплекте, кстати, qwerty/ru4 нет, как нет и любой другой ru; консольные кириллические шрифты есть, mapscreen для koi2alt есть, русская locale есть, а раскладки нет. Прямо по Венечке Ерофееву – «вымя есть, а хересу нет». Помнится, с другим дистрибутивом «от германьцев» (вернее, австрияков) – RockLinux, уже было что-то подобное. Хорошо, цельно-потибреный комплект всего кириллического от Altlinux – всегда под рукой, прямо палочка-выручалочка (низкий за что поклон всем на www.altlinux.ru).
В общем, на русификации мои приключения по сборке Linux'а из ничего и закончились. Конечно, то, с чем я развлекался – далеко не «from Scratch». В сущности, обычный дистрибутив, с обычным меню-ориентированным, хотя и чисто текстовым, инсталлятором, предоставляющим не большую (хотя и не меньшую) свободу выбора, чем другие (из тех, конечно, что не под лозунгом «Linux с user'ом братья навек»). Единственное отличие – абсолютно все собирается, а не устанавливается из прекомпилированных пакетов. И это, конечно, плюс – можно влиять на условия сборки – ту же оптимизацию, например.
Впрочем, последнее в моем случае практических результатов не имело. Не смотря на новый компилятор и оптимизацию, система получилась не особо торопливой. По крайней мере визуально, за Gentoo Linux (собранной посредством gcc-3, но с более новым ядром) ей еще гнаться и гнаться. Даже ReiserFS (я забыл сказать, что выбрал именно эту файловую систему) не показала себя в полном блеске на любимой операции (копировании большого количества мелких файлов).
Все это – не в упрек. Все равно, идея хорошая, ну а исполнение не на высшем уровне – так на то и версия-то 0.2.6. Важнее, что ориентация дистрибутива, особенно его сопроводиловок, не очень понятна. Повторюсь, что вряд ли тот, кто знает о связи mc и glib, нуждается в напоминании кода swap-раздела. А вот в нетривиальных случаях подсказки могли бы быть и подробнее. И главное – еще бы больше свободы выбора…
[1] Примером чему – mulinux, (почти) функциональный дистрибутив, правда, на двух дискетах (вторая – система X). [обратно к тексту]
[2] Которое так и называется – LFS-Book. Должен сказать, чтение очень увлекательное и полезное для любого пользователя Linux, даже если он и не намерен собирать собственный дистрибутив. [обратно к тексту]