Введение в сборку дистрибутивов
Материал из ALT Linux Wiki
Версия 20:41, 11 августа 2010
"Введение в сборку дистрибутивов"
Это инструкция по самостоятельной сборке дистрибутивов на базе бранча 5.1 АЛЬТ-линукс.
Собрана из отдельных сообщений автора NotHAM (А.Чернов)
Основная информация по сборке дистрибутивов находится на странице вики:
http://www.altlinux.org/Mkimage/Profiles/Desktop
а также по многочисленным ссылкам с этой страницы. Год назад читать это
непосвященному пользователю было невозможно, но в последнее время ситуация
меняется в лучшую сторону (в основном благодаря усилиям М. Шигорина).
Попытаюсь пересказать основное содержимое этой страницы на языке, понятном
продвинутому пользователю АЛЬТ-линукса.
Основные инструменты:
- бранч 5.1 (р5, сизиф - это для особо продвинутых), крайне желательно иметь локальное зеркало, сборка через интернет - "врагу не пожелаешь", хотя и работает, но делать что-то кроме минималки через интернет - это проще скачать готовое;
- makeimage-profiles-desktop (не пакет из бранчей-сизифа, а гит boyarch@ - комбайн с "вертикальным взлётом и посадкой", известный как m-p-d);
Дополнительные инструменты (это уже пакеты из бранчей-сизифа):
git
hasher
autoconf_2.60 (самой свежей версии)
mkimage
make
установленный АЛЬТ-линукс
(любой, хотя все примеры в дальнейшем буду прогонять
на antique-full (с доустановленными pidgin-mini и seamonkey):
http://ftp.linux.kiev.ua/pub/Linux/ALT/people/_anatoly/iso/
Для создания локального зеркала (5.1) нужно иметь дополнительный раздел достаточного размера либо большой раздел /home (чтобы всем места хватило). Создать зеркало можно командой (в дальнейшем обновлять ей же):
rsync <опции> <источник> <получатель>
у меня это выглядит так
rsync --timeout=6000 -avlpztc --exclude 'SRPMS' --exclude 'SRPMS.all' --exclude 'SRPMS.classic' --exclude 'i686' --exclude 'x86_64' --exclude 'x86_32' --stats --delete-after --verbose rsync.altlinux.org::ALTLinux/5.1/branch/ /mnt/sda5/mirror/ALTLinux/5.1
Здесь
<источник> = rsync.altlinux.org::ALTLinux/5.1/branch/
<получатель> = /mnt/sda5/mirror/ALTLinux/5.1
остальное - опции.
Зеркало занимает примерно 21 ГБ (только бинарники). Если что-то не эксклюдить - займёт больше.
Устанавливаем git (и всё что потянет). Сразу после установки - представляемся ему:
$ git config --global user.name "Your Name Comes Here"
$ git config --global user.email "you@yourdomain.example.com"
Устанавливаем пакеты autoconf_2.60, mkimage, make.
Устанавливаем hasher (и всё что потянет), добавляем пользователя:
# hasher-useradd USER
Здесь USER - это ваш логин.
Это единственный запуск хашера из под root. Перезагружаемся.
Создаём рабочие каталоги, например ~/mkiso/branch, ~/mkiso/sisyphus, ~/out (не обязательно - создастся автоматически, здсь будут лежать "блины"). Теперь (согласно вики) нужно склонировать гит boyarch@, но мы пойдём другим путём. Скачиваем отсюда тарбол (mkimage-profiles-desktop.tar.bz2): http://ftp.linux.kiev.ua/pub/Linux/ALT/people/_anatoly/packages/ Это тот же самый клон, но по состоянию на 26.01.2010. Он как-то лучше приспособлен к работе с бранчами (имхо). Тарбол распаковываем в каталог ~/mkiso/branch/. Там должен появиться /mkimage-profiles-desktop (гит). Все дальнейшие примеры будут на основе этого клона. Особенно это касается редактирования конфигов (буду указывать номера строк). Хотя желающие могут сделать как по вики, в каталоге ~/mkiso/sisyphus выполнить команду:
$ git clone git://git.altlinux.org/people/boyarsh/packages/mkimage-profiles-desktop.git
Только про расхождения номеров строк потом вопросов не задавайте.
Во всех случаях необходимо сделать резервные копии m-p-d (мало-ли что).
Для начала рекомендую ознакомиться с содежимым файлов: .../m-p-d/Makefile.in, configure.ac, use-mk.in (их будем редактировать), а также с содержимым .../m-p-d/profiles/pkg/lists/... Туда файлы будем добавлять. Обратить особое внимание на файлы base.in, kernel.in, xorg.in. Редактировать не будем, но их содержимое нужно представлять себе достаточно четко.
Как известно, всякая сложная машина перед первой поездкой требует некоторой подготовки. Точно так-же и комбайн "m-p-d" - подготавливаем для себя. Чтобы не повторять некоторые ошибки других: http://forum.altlinux.org/index.php/topic,7274.msg101496.html#msg101496 Здесь, повидимому, пользователь запустил сборку не сделав перезагрузку после команды ...# hasher-useradd USER. Я обращал на это Ваше внимание ранее (и на вики об этом есть). Да и делать всё начал по советам на вики, у нас будет несколько другой путь. Ещё рекомендую глянуть тут: http://forum.altlinux.org/index.php/topic,7274.msg101513.html#msg101513 Это не наш случай, потому пока игнорируем (просто принимаем к сведению).
Подготовка:
1. Открываем в любом текстовом редакторе, умеющем показывать номера строк, файл /mkiso/branch/m-p-d/configure.ac (вполне подходит xfce-mousepad из сборки antique, или любой другой, который не добавляет скрытых кодов в текст). Ищем в файле строки:
31 APTCONF_PACKAGE="platform5"
.....
210 APTCONF_PACKAGE="desktop"
Переменная APTCONF_PACKAGE (используется в base.in) определяет, какой пакет
будет подложен в нашу сборку для начальных настроек apt-get и синаптика.
Допустимые значения: "desktop"(5.0), "platform5"(p5), "branch"(5.1), "sisyphus".
Поскольку мы собираем на бранче 5.1 - наш выбор - "branch". Заменяем и сохраняем
изменения в файле. Наши первые сборки будут использовать строку 210, а дальше видно будет.
Для желающих - если в "m-p-d" ещё ничего не запускали (нет мусора), можно
закоммитить изменения (не обязательно):
git add . # Пробел и точка в конце команды - обязательны.
git commit -m "small changes for branch 5.1"
2. Настраиваем apt-get. Проще всего это сделать с помощью синаптика,
выбрав нужные репозитории. У меня это выглядит так (/etc/apt/sources.list):
rpm file:///mnt/sda5/mirror/ALTLinux/5.1/ i586 classic
rpm file:///mnt/sda5/mirror/ALTLinux/5.1/ noarch classic
### rpm file:///mnt/sda5/mirror/Branch5.1/ i586 hasher
### rpm file:///mnt/sda5/mirror/Branch5.1/ noarch hasher
### rpm ftp://ftp.linux.kiev.ua/pub/Linux/ALT/people/_anatoly/packages/Branch5.1/ i586 hasher
### rpm ftp://ftp.linux.kiev.ua/pub/Linux/ALT/people/_anatoly/packages/Branch5.1/ noarch hasher
Т. е. apt-get направлен на зеркало, хотя могу подключить и любые другие из списка,
всё совместимо. У кого зеркала ещё нет - просто подключите в синаптике бранч 5.1.
Всё готово, переходим в каталог mkimage-profiles-desktop и даем команды:
$ autoconf # для того пакет и ставили, сейчас он создаст файл *configure
$ ./configure # пока без параметров
$ make rescue.cd
После удачного завершения сборки, что занимает некоторое время в
зависимости от скорости ПК, и требует получения примерно 150 МБ трафика,
если нет локального зеркала и пакеты закачиваются из инета,
сразу же делаем (обязательно!):
$ make distclean
Дело в том, что "комбайн" в процессе работы создаёт в m-p-d в подкаталогах
несколько рабочих каталогов, нужных только ему, в т. ч. хашерниц, с которыми
он умеет обращаться гораздо лучше нас, и после работы там остаётся очень много
мусора (до нескольких ГБ - в основном распакованные пакеты). Нужно подчищать за ним.
Теперь идём в каталог /out/desktop/ и смотрим на наше творение altlinux-5.0...rescue.cd.iso, размером примерно 112 МБ. Между прочим вполне рабочий. Можете проверить. Только вот с версией что-то не то, нам нужна 5.1.
Исправляем свой недочет: опять идём в /mkimage-profiles-desktop и делаем:
$ ./configure --with-version=5.1
$ make minimal.cd
.... несколько минут и примерно 400 МБ трафика.
$ make distclean
Опять идём в /out/desktop/ и опять смотрим altlinux-5.1-...install.cd.iso
размером примерно 260 МБ, и тоже рабочая, урезанная минималка (без синаптика).
Проверим, правильно ли мы выбрали значение APTCONF_PACKAGE, для этого заныриваем с помощью mc в iso-образ (у кого не antique - проверьте, установлен ли пакет cdrkit-utils, если нет - доустановите), там идём в каталог /ALTLinux/RPMS.main и ищем пакет apt-conf-branch-5.1.1..., если есть - всё сделано правильно.
Домашнее задание: сделать самим сборку М. Шигорина с KDE3. Подсказка: (version=5.1 make kde3.cd), кто забудет distclean - тому незачёт.
Сначала сохраним где нибудь собранную ранее урезанную минималку, она скоро понадобится для сравнения. Далее читаем вики, начиная с фразы "А как свой?". Там много полезного.
Открываем в редакторе с нумерацией строк файл /mkiso/branch/m-p-d/Makefile.in и в промежутке между строками (45)slinux.cd и (47)minimal.cd вписываем следующее (кроме строк 45 и 49):
(45)slinux.cd: | use-slinux use-gdm install2 main install-cd.@IMAGETYPE@
(46)# ***********************************************************************
(47)console.cd: | install2 main rescue install-cd.@IMAGETYPE@
(48)# ***********************************************************************
(49)minimal.cd: | use-icewm use-xdm install2 main install-cd.@IMAGETYPE@
Номера строк проставит редактор (вписывать не нужно). На вики, то что мы сделали,
называется "крупноблочная" настройка. По сравнению с minimal - мы удалили
"крупный" блок icewm, с содержимым можно ознакомиться в /m-p-d/profiles/pkg/lists/
файл icewm (hi!), удалили блок xdm (в данном случае это просто пакет) и
добавили блок rescue (действительно крупный). Теперь в каталоге /m-p-d делаем
$ ./configure --with-version=5.1
$ make console.cd
...
$ make distclean
Идём в каталог /out/desktop/ и смотрим результат. Там лежит образ консольной
сборки, которую многие знают и пробовали, но опять под названием desktop, как
и предыдущая сборка. Это происходит потому, что при запуске ./configure мы не
использовали параметр --with-distro=..., т. к. пока не знаем, что тут написать
(Файл configure.ac мы ещё толком не правили, попозже поправим). Это не страшно,
т. к. сборка полностью рабочая и переименовать несложно.
Теперь "заныриваем" с помощью mc в свежий блин, а другой панелью - в первый вариант,
и начинаем сравнивать. В корне образов сразу видны отличия, если в первом варианте
есть крупный блок altinst (81М), то в новом варианте добавился блок rescue (95 M).
Далее в /ALTLinux/RPMS.main смотрим - в новом варианте отсутствуют большинство
шрифтов, ndiswrapper, ну и ещё кое-что, что предусмотрено в файле xorg.in (я не
просто так просил обратить внимание на файлы base.in, kernel.in, xorg.in. в самом
начале). Делаем вывод - xorg.in в новую сборку попал лишь частично - только
то, что притянулось по зависимостям инсталлером. Кто на это повлиял? В Makefile.in
про xorg нет ни слова (можете не искать).
Значит "крупноблочная" коррекция может иногда и напакостить (но не в этом случае),
поэтому требуется вникать в более "более тонкую" настройку (use.mk.in).
Открываем в редакторе (с нумерацией строк конечно) файл use.mk.in и начинаем
искать:
(39) $(DESKTOP_TARGETS): | $(AUTOCFG) use-xorg
...
(44) use-xorg:
(45) echo GLOBAL_BASE_PACKAGE_LISTS+='xorg' >> "$(call scfg,main)"
...
(107) use-desktop: use-xorg use-alterator-desktop
Мда..., ну и который из них наш? Оказывается самый первый (39), но там есть
какой-то $(DESKTOP_TARGETS), про который в строке (35) написано:
Код:
(35) DESKTOP_TARGETS = $(DE_TARGETS) $(WM_TARGETS) $(FEATURE_TARGETS)
Уже легче, в строках 17-22 есть про WM_TARGETS. Всё понятно, убрав из строки в Makefile.in "use-xdm", мы тем самым оторвали подключение к сборке файла xorg (по зависимостям что-то притянулось, но не всё).
Цитата с вики:
"Чем более краткими, ясными, устойчивыми к изменениям являются его составляющие — тем удобней браться за разработку или продолжать её через год. Чем более запутанными и неявно взаимосвязанными они остаются — тем больше времени приходится сперва тратить на отслеживание, кто куда зачем пошёл и надо ли это ещё."
Что-то я не пойму - это "ясность" или "запутанность", и что делает ndiswrapper в файле xorg.in, они что - жить друг без друга не могут?
Ну да ладно. Другого комбайна всё равно нет, а этот работает. Причем хорошо. Иногда. Вот сегодня сборка получилась со 2-го раза, первый раз обломалась с ошибкой: find не смог найти "find" (бывает). Закрыл seamonkey (2 экз.), закрыл оба текстовых редактора, закрыл один из терминалов и отключил погремушку (gkrellm-монитор). Оставил один терминал urxvt. После этого всё собралось. Имейте в виду, если что.
Домашнее задание: Будем делать слегка продвинутую минималку с WindowMaker-ом, и с wdm конечно. Xorg по понятной причине, должен отвалиться (см. строки 17-22 в use.mk.in). Потому придётся настраивать "крупноблочно", "более тонко" и "совсем тонко" (вики). Нужно приготовить файл WM-mini и положить в /m-p-d/profiles/pkg/lists/...Будем настраивать. В качестве образца можно использовать файл icewm, который там уже есть.
А так: "крупноблочно", "более тонко" и "совсем тонко". Как на вики сказано.
Сначала делаем WM-mini.
1. "крупноблочно".
В файл /mkiso/branch/m-p-d/Makefile.in добавляем строки (48-49):
46 # ***********************************************************************
47 console.cd: | install2 main rescue install-cd.@IMAGETYPE@
48 WM-mini.cd: | use-WM-mini use-wdm install2 main install-cd.@IMAGETYPE@ 49 #icewm-mini.cd: | use-icewm-mini use-xdm install2 main install-cd.@IMAGETYPE@
50 # ***********************************************************************
Строку (49) пока оставляем закомментированой. Надеюсь что здесь уже всё понятно.
2. "более тонко".
В файл /mkiso/branch/m-p-d/use.mk.in добавляем строку (21), об этом было ранее и тоже понятно (чтобы xorg не отвалился).
17 WM_TARGETS = \
18 use-fvwm \
19 use-icewm \
20 use-wmaker \
21 use-wdm \
22 use-xdm \
23 use-gdm
Всё? - конечно нет. Комбайн - он слегка туповатый и не знает, что значит use-wdm,
потому будем обучать. А как? А так-же как он обучен использовать use-xdm. Ищем.
50 use-xdm:
51 echo GLOBAL_BASE_PACKAGES+='xdm' >> "$(call scfg,main)"
52 # TODO: tune it as well, see live/image-scripts.d/05xdm
53 $(call done,$@)
Оказывается всё довольно просто, осталось добавить нужные строки, но сначала
посмотрим, куда нас отсылает строка (52) /m-p-d/profiles/live/image-scripts.d/05xdm,
Там этот скриптик называется чуть по другому, но понять можно. Читаем, и, к изумлению
обнаруживаем, что он приделывает кнопки к нашему xdm, а мы голову ломали, в интернете
искали, а в комбайне это уже предусмотрено на будущее ..., да и дизайн там уже
заложен, ну дела ... (Правда это всё для live.cd, но использовать можно, если нужно).
Добавляем строки:
55 use-wdm:
56 echo GLOBAL_BASE_PACKAGES+='wdm' >> "$(call scfg,main)"
57 $(call done,$@)
Строки 56-57 теперь подсунут в нашу сборку wdm, а строка 21, совместно с бывшими
35, 39, 45 (теперь номера поменялись) подсунут xorg. Всё просто.
3. "совсем тонко".
Ну а тут совсем просто (именно тут и определяется основной состав сборки). Открываем в редакторе заготовленный файл /m-p-d/profiles/pkg/lists/WM-mini (однострочный) и добавляем всё, что нужно для минималки.
###WindowMaker
WindowMaker
###synaptic
synaptic
synaptic-usermode
###alterator
alterator-browser-qt
alterator-standalone
alterator-xkb
alterator-mkbootflash
alterator-net-pppoe
alterator-net-pptp
alterator-net-openvpn
alterator-nsswitch
###alterator-packages
###alterator-pkg
alterator-profile
alterator-proxy
### for system
sound-scripts
hal-laptop
dbus-tools
dbus-tools-gui
cdrkit-utils
Тут, самое главное, не наделать опечаток, иначе сборка обломается и долго потом искать будете, почему. Имена пакетов должны быть написаны строго так, как в бранче (как их синаптик видит). Иначе apt-get их не найдёт.
Теперь делаем icewm-mini (многим известная минималка).
1. "крупноблочно".
В файле /mkiso/branch/m-p-d/Makefile.in раскомментируем строку (49).
2. "более тонко".
Ничего не делаем, всё уже сделано до нас.
3. "совсем тонко".
Делаем копию файла WM-mini, переименовываем в icewm-mini, WindowMaker в тексте заменяем на icewm и закидываем файл в /m-p-d/profiles/pkg/lists/.
Всё готово. Собираем свои поделки.
$ ./configure --with-version=5.1
$ make WM-mini.cd
...
$ make distclean
Переименовываем результат в ...WM-mini...iso .
Второй раз запускать ./configure не обязятельно (файлы ***.in не изменялись).
$ make icewm-mini.cd
...
$ make distclean
И опять ...desktop... (переименовываем), мы с ним ещё разберёмся.
Сравниваем исошки, видим, что с icewm получилась поменьше, потому её в основном и собирал. Проверить комплектацию xorg очень просто, заныриваем в образ (mc) и смотрим наличие шрифтов из xorg.in. Шрифты все есть, значит всё сделали правильно (подключился весь).
Домашнее задание. Изучить файл /mkiso/branch/m-p-d/configure.ac на предмет использования разных --with...=, у нас desktop получается вблизи от строки (210), но редактировать будем совсем в другом месте. Далее будем собирать antique (base и full). Нужно скачать профили http://forum.altlinux.org/index.php/topic,6091.msg102014.html#msg102014 (во вложении), переименовать как нужно (без .txt). Приготовить для закидывания в /m-p-d/profiles/pkg/lists/
Сначала попытаемся решить проблему с надоедливым "desktop". На самом деле параметр --with-distro может принимать множество всевозможных значений, в файле configure.ac это хорошо видно в операторе case, который начинается в строке (32) и тянется до строки (195). Там есть заготовки для всех Альтовских дистров "...на каждый чих отдела маркетинга..." (с) Вики WhiteLabel. Даже для произвольного distro что-то предусмотрено. Только вот незадача. Если запустить сборку с произвольным distro, она обломается с ошибкой "cannot find package doc", пойдём искать почему:
189 *)
190 BRANDING=${with_branding:-"altlinux-desktop"}
191 INSTALLER=${with_installer:-"desktop"}
192 DOCS="$with_docs"
193 LABEL="Desktop"
194 DEFAULT_ISO="kde.dvd";;
А всё потому, что в строке (192) DOCS должно получить какое-то значение, а получает какую-то фигню, которую apt-get не может потом найти. Кстати для варианта custom* (стр. 182 - ситуация аналогичная, да и в свежем клоне гита boyarch@ всё то-же самое, только номера строк другие). Наверное никто не чихнул?? Щас поправим (подсмотрим в строке 168 и сделаем так-же):
192 DOCS=${with_docs:-"desktop"}
Теперь быстренько проверим (сначала сохранив файл):
$ autoconf # файл *configure нужно перегенерить, configure.ac изменился!
$ ./configure --with-version=5.1 --with-distro=icewm-mini
$ make icewm-mini.cd
...
$ make distclean
И бегом в ~/out/desktop ... хм, а теперь там есть каталог /out/icewm-mini, в
котором лежит altlinux-5.1-...-icewm-mini-...iso, заработало что-ли?
Проверим ещё раз (с другим distro):
$ ./configure --with-version=5.1 --with-distro=icewm
$ make icewm-mini.cd
...
$ make distclean
Точно. Заработало. Для нашей цели вполне сойдёт. На строку (194) уже можно
и не смотреть. Комбайн нас правильно понял и всё сделал как заказывали.
Оказывается, что не такой уж он и тупой.
Для справки- теперь APTCONF_PACKAGE использует значение из строки (31) а не (210), не зря мы её в самом начале исправили.
Начинаем собирать antique. А что тут собирать-то, уже всё просто и понятно.
1. "крупноблочно".
Как обычно - добавляем пару строк в главный Makefile.in (50-51):
46 # ***********************************************************************
47 console.cd: | install2 main rescue install-cd.@IMAGETYPE@
48 WM-mini.cd: | use-WM-mini use-wdm install2 main install-cd.@IMAGETYPE@
49 icewm-mini.cd: | use-icewm-mini use-xdm install2 main install-cd.@IMAGETYPE@
50 antique-full.cd: | use-antique-base disk-antique-disk use-xdm install2 main rescue install-cd.@IMAGETYPE@
51 antique-base.cd: | use-antique-base use-xdm install2 main install-cd.@IMAGETYPE@
52 # ***********************************************************************
Тут появилось всего одно незнакомое слово "disk-...", что оно означает смотрим в файле use.mk.in:
78 # put on first disk, but don't install by default
79 disk-%::
80 echo GLOBAL_DISK_PACKAGE_LISTS+='$(subst disk-,,$@)' >> "$(call scfg,main)"
81 @echo "*** added $(subst disk-,,$@) to main" >&2
Если что-то непонятно открываем словарь stardict и переводим строку (78)
2. "более тонко".
Ничего не делаем, всё уже сделано.
3. "совсем тонко".
Переименовываем скачанные профили (ссылка выше) в antique-base и antique-disk, подправляем ***-disk (комметируем 2 строки, иначе сборка обломается):
###WindowMaker -base
###wmsystemtray -base
Apt-get увидит лишние слова в конце строки, и не сможет найти пакеты.
Закидываем оба файла в /m-p-d/profiles/pkg/lists/...
Настраиваем apt-get (/etc/apt/sources.list):
rpm file:///mnt/sda5/mirror/ALTLinux/5.1/ i586 classic
rpm file:///mnt/sda5/mirror/ALTLinux/5.1/ noarch classic
rpm ftp://ftp.linux.kiev.ua/pub/Linux/ALT/people/_anatoly/packages/Branch5.1/ i586 hasher
rpm ftp://ftp.linux.kiev.ua/pub/Linux/ALT/people/_anatoly/packages/Branch5.1/ noarch hasher
У меня одновременно подключены - бранч 5.1 (зеркало) и киевский бранч (они совместимы). И делаем (в каталоге .../m-p-d/...):
$ ./configure --with-version=5.1 --with-distro=antique-base
$ make antique-base.cd
...
$ make distclean
...
$ ./configure --with-version=5.1 --with-distro=antique-full
$ make antique-full.cd
...
$ make distclean
Вот и всё. Всё собралось и всё работает. И названия у исошек правильные.
Общее пожелание: Делайте локальное зеркало. Интернет - штука дорогая и бывают обломы, как правило - в конце сборки (когда трафик уже использован).
ЗЫ. Всем удачи в дистростроительстве. И почаще заглядывайте на вики. Там много полезного есть (если поискать хорошенько).