2010-06-15

Your distro, your rules

По работе пришлось решать попутную задачу сборки собственного дистрибутива Devil Linux aka DL: так я познакомился с Linux From Scratch (существует онлайновая книга, где концепция LFS изложена довольно подробно). После apt-get и dpkg несколько непривычно, но что-то в этом есть. Основная идея: "твой дистрибутив - твои правила". Я бы добавил сюда "...и твои проблемы" ;) Конечно, если есть документация - просто следуйте ей и будет все ОК. На момент написания статьи документация на последнюю версию DL пребывала в состоянии дописывания, поэтому пришлось поразбираться самостоятельно, благо не очень сложно. Основными ресурсами, которыми пришлось запастись, оказались терпение и свободное место на жестком диске ;)



Хотя с сайта и скачивается дистрибутив 1.4RC4,  в CVS такого тэга я не обнаружил, и поэтому сначала ошибочно взял за основу своих экспериментов 1.4RC3. Однако, очень скоро я понял - при самостоятельной сборке надо брать всё самое последнее (более подробно об этом см. ниже) и собирать с самого начала.

Строим рабочее окружение

Выбираем какой-нибудь каталог (советуют /usr/src, но реально-то надо там, где хватит свободного места - после компиляции у меня оказалось занято около 8,5 Гиг).

Перво-наперво, убедитесь, что у вас есть утилита lftp - если нет, поставьте пакет (apt-get lftp) или качните исходники и скомпилируйте: ftp://ftp.devil-linux.org/pub/devel/sources/tools/. Наличие lftp - обязательный пункт программы.

Сначала качаем базовый архив бинарников Linux From Scratch для DL, он же lfssystem, который обитает в ftp://ftp.devil-linux.org/pub/devel/sources/ - заходите и выбрайте соответствующий каталог (например, lfssystem-for-DL-1.3.4_and_up), далее надо распаковать содержимое - можно сразу из-под рута. Не пугайтесь, просто в DL существует очень немного пользователей, и единственный с настоящей консоль - root, поэтому именно он является владельцем всех файлов в архиве:

sudo tar -xjf lfssystem-SVN-20070314-cleaned.tar.bz2

Далее качаем исходники базовой системы DL из CVS с анонимным доступом на чтение, складывая внутрь распакованного каталога:

cd lfssystem/data


сvs -d:pserver:anonymous@devil-linux.cvs.sourceforge.net:/cvsroot/devil-linux login


sudo cvs -z3 -d:pserver:anonymous@devil-linux.cvs.sourceforge.net:/cvsroot/devil-linux get build

Наконец, вынимаем архивы исходников-компонентов при помощи специального скрипта:

cd build/


sudo ./update_src

Это довольно длительный процесс, к тому же при использовании зеркал (а почти все они - неработающие), его надо сделать дважды - второй раз надо указать главный сервер №1, чтобы скачать самые распоследние  исходники компонентов.

Замечу, что из CVS вы только что получили сборочные скрипты последней версии. CVS хранит все ревизии исходных файлов для каждой версии дистрибутива DL, но вот беда - они логически привязаны к исходникам программ, которые лежат на ftp и, следовательно, имеют всего одну "версию". Поэтому собрать более ранние версии DL, обновите CVS по тегу и ищите файл md5sum.lst - там перечислены все имена файлов с исходным кодом. К счастью, основная их часть выложена на ftp в каталогах "0.5", "1.0", "1.2", "1.4", но как видите - это только основные ветки. Не исключено, что, например, для 1.2.5 придется добыть десяток-другой пакетов исходников. С другой стороны, надо еще поискать педанта, которому все это понадобится.   

Пока идет закачка, добавляем себе alias в ~/.bashrc или ~/.bash_alias:

alias cr='sudo chroot /полный/путь/к/рабочему/каталогу/lfssystem /usr/bin/env -i HOME=/root TERM=$TERM /bin/bash -login'

После выполнения будут подсчитаны md5 для скачанных файлов и после сравнения скрипт может выругаться на те, у которых она не сошлась. Не скажу, что это нормально, но попробовать собрать все-таки можно (на то она и девелоперская ветка). Мне надо было получить ядро 2.6, поэтому пришлось примириться с мелкими несостыковками и пожертвовать некоторыми ненужными программами. Надеюсь, к тому моменту, как вы прочтете эту статью, мэйнтейнеры уже все пофиксят ;)

Компилируем "с нуля"

Настало время расчехлить наш alias! Выполняем cr и попадаем в каталог /data/build с рутовыми привилегиями. Если набрать makе без параметров, он покажет возможные варианты запуска.

make unpack

Закаченные исходники сейчас покоятся в каталоге /data/build/src, по этой команде они все будут распакованы в /data/build/tmp.

make menuconfig 

Попадаем меню конфигурирования. Здесь конфигурится всё. Можно выбирать приложения, некоторые специфические драйвера, тип/количество процессоров, число параллельных процессов make.  Кстати, лично меня сразу же начала раздражать разговорчивость скрипта /data/build/scripts/settings, чтобы его успокоить, поставьте в последней строке перенаправление STDERR в никуда:

test -n "${PACKAGEDIR}" && cd ${PACKAGEDIR} 2> /dev/null

В конфигурации можно оставить все как есть, а можно повыкидывать лишнее - главное, не забудьте сохранить результат (файл .config). Для первого раза все-таки рекомендую оставить все.

После этого, по идее, все готово к сборке... ну разве что исправить в /root/.bash_profile определение временной зоны с EST на Europe/Moscow (надо перелогиниться, конечно же).

make prepare


Вывода вы не увидите, он будет аккуратно сложен в  /data/build/tmp/LOGS/prepare/*.

make build


Тоже самое, но логи будут складываться в /data/build/tmp/LOGS/build/*. Сборка происходит для всех пакетов, вне зависимости от того, что выбрано в конфигурации. Все пакеты должны собираться нормально, но у меня не смог завершиться ./confire для git, причина была в отсутствии в базовом бинарном пакете LFS /usr/bin/python. Чтобы избавиться от git можно зайти в Makefile.build и удалить оттуда эту цель. Так можно поступать с любыми проблемными пакетами, если от них не зависят другие пакеты. В противном случае придется предметно разобраться, в чем причина и сделать патч, чтобы пакет все-таки собирался.

make install

Происходит выполнение цели install у всех Makefile всех программ. Учтите, что для некоторых пакетов нельзя сделать make install повторно: он может неожиданно завершиться с претензией о том, что какой-то каталог/файл уже, видите ли, создан.

make iso

Происходит "стаскивание" всех компонентов в каталог tmp/ISO, формирование рутовой файловой системы, а затем все необходимые шаги для получения файла tmp/bootcd.iso.

ГОТОВО!

Я смог дойти до конечного результата только спустя сутки, что даже на моем не самом отсталом Duo T5550/1.83 - мучительно долго. Кроме того, приходилось начинать несколько раз заново: unpack-prepare-build-install-iso. Казалось бы, можно "переигрывать" тот или иной пункт сборки довольно просто - удалить флаг tmp/FLAGS/<фаза>/<программа> (например, после удаления tmp/FLAGS/build/linux make build должен по-новой запустить компиляцию ядра). Но на практике, надо знать некоторые зависимости и особенности, иначе - нас ждет unpack-prepare-build-install-iso.

Если Вам интересно прочитать о составе программ и про то, как работать с этой сборкой (так сказать, информация для пользователей) - рекомендую статьи Александра Деревянко - часть 1 и часть 2.

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

Комментариев нет: