= Сборка своего LiveCD =
Личный опыт по сборке LiveCD на основе репозитория ALTLinux (branch) с помощью spt3.

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

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

В результате длительных раздумий родился следующий список форматов контента:

 * Стартовое "меню" - веб-страница (index.html), открывающаяся в браузере;
 * Презентации - odp или pdf;
 * Аудио - Ogg Vorbis (*.ogg);
 * Видео - MPEG-4 (avi), закодированное ffmpeg.
Источниками вдохновения для вышеуказанной деятельности послужили ["Edu/Courses/OpenLectory/BuildLiveCD"] ["Edu/Courses/OpenLectory"], высказывания Генерального директора ALTLinux А.В.Смирнова о том, что "дистрибутив делается нажатием на одну кнопку", а также статьи в Спец-Хакере и Линукс-Формате о сборке собственного дистрибутива.

Однако статьи в основном ориентируются на Knoppix или Ubuntu, а такие решения имеют ряд недостатков технологического и этического характера. Есть информация, что в Fedora7 есть инструмент для сборки собственного дистрибутива (в том числе и LiveCD), но мешает уже нажитое отрицательное отношение к Fedore.

В результате за основу был выбран ALTLinux (см. источники вдохновения выше) еще и потому, что разработчики более-менее досягаемы (не в Германии и не в ЮАР).

== Что нужно для решения задачи ==
=== Пакеты ===
Пакеты, необходимые для решения задачи, существуют в репозитории Sysiphus, однако использовался стабильный срез репозитария  - branch-4.0. Нужно установить в сборочную систему следующие пакеты:

 * hasher
 * hasher-priv
 * spt3
 * spt3-profiles
 * spt3-tasks
=== Настройка репозитария ===
spt3 активно использует репозиторий, указанный в источнике для apt. Поскольку она не является менеджером пакетов, то запросов типа "Вставьте диск номер Х" не выдает, а просто не работает. Поэтому для spt3 нужен источник пакетов в виде ftp-сервера.

Тут есть два варианта:

 1. Подключиться к существующему зеркалу репозиториев ALTLinux
 1. Поднять собственный ftp-сервер и создать зеркало на нем, прописав его в sources.list apt'a.
В обоих случаях все "посторонние" источники пакетов нужно вычистить из всех списков источников.

При работе с внешним репозиторием (существующим зеркалом) нужен скоростной канал с большим объемом трафика. т.к. каждая пересборка требует закачивания всех необходимых пакетов (200-400 Мбайт). На "медленной" безлимитке (ADSL 256К) ничего не получается, т.к. в случайные моменты процесс вылетает по таймауту.

=== Профиль ===
Профиль - это каталог с набором конфигурационных файлов и скриптов, содержащих список пакетов для целевой системы, настройки будущего рабочего стола, список файлов и папок, образующих полезный контент и пр. Как его сделать с нуля - тайна сия велика есть, а от примеров из spt3-profiles практической пользы никакой.

В любом случае каталог профиля (назовем его условно profile) кладется в домашний каталог пользователя, осуществляющего сборку (не root!).

''' attachment:profile-livecd-khakhaev.zip - исходный профиль /!\ '''(нуждается в оптимизации и уборке лишнего из файла packages)

''''' attachment:profile-livecd-khakhaev-final.zip - ''''''''итоговый профиль''' (после выяснения всех деталей)''''' '''''

В прилагаемых профилях каталог content оставлен пустым для экономии места, но его можно наполнить любым содержанием, соответственно подправив index.html.''' '''

=== Настройки пользователей ===
Пусть сборкой занимается пользователь ust. Тогда в /home/ust создаем папку build (или с другим именем по вкусу), в которой и будет осуществляться весь процесс сборки.

==== Действия администратора (root) ====
 * В root-сеансе даем команду
$ hasher-useradd ust

(при этом создаются дополнительные пользователи ust_a и ust_b, от имени и с правами которых совершаются все действия по сборке)

 * Редактируем файл /etc/hasher-priv/system
Все содержимое комментируем и добавляем строку

prefix=/home/ust/build

На этом предварительные действия администратора заканчиваются.

==== Действия пользователя (сборщика) ====
Пусть рабочий профиль скопирован в /home/ust/profile Тогда в /home/ust/build создаем симлинк с именем profile на /home/ust/profile (Реальное имя каталога профиля может быть каким угодно, но симлинк должен иметь имя profile обязательно!).

== Компоненты профиля ==
 * content/ - каталог с полезным содержимым;
 * home/ - заготовка для домашнего каталога в целевой системе;
 * root/ - содержит подкаталоги etc и usr с некоторыми глобальными настройками
 * setup.d/ - каталог со скриптами настройки конфигурации целевой системы
 * config - файл с установками переменных окружения, нужных при работе spt3
 * index.html - начальная страница, которая откроется после загрузки LiveCD
 * initfs.in - как следует из названия, файл с настройками инициализации файловой системы, развертываемой из LiveCD - не редактировать!
 * isolinux.cfg.in - настройки загрузчика isolinux
 * modules - какие-то модули ядра, пока не ясно что и как - не редактировать!
 * packages - список пакетов для целевой системы, так как они называются в текущей версии репозитария (без номеров версий и .rpm)
 * recipe - список последовательности этапов spt3
 * spt-copy-files - скрипт включения полезного контента в финальный образ LiveCD
 * spt-copy-files.iso - список каталогов и файлов полезного контента
 * style.css - таблица стилей для index.html
 * syslinux.cfg.in - полность аналогичен isolinux.cfg.in
== Этапы сборки, проблемы и их решение ==
На свежеподготовленной системе, находясь в каталоге build, запускаем

[/home/ust/build]> spt3 -v

И минут через 30-50 (в зависимости от скорости канала и быстродействия сборочной системы) получаем готовый livecd.iso, который для проверки можно запустить в эмуляторе Qemu:

[/home/ust]> qemu -boot d -cdrom ~/build/livecd.iso

В случае применяемого профиля получаем графическую загрузку с паузой 1 секунда, рабочий стол с KDE и возможностью настройки видеорежимов и сети. Но автоматического открытия index.html не происходит.

Основные проблемы, которые решались (или не решились) при отладке процесса, были следующие:

 1. Смена темы графической загрузки
 1. Замена названий пунктов загрузочного меню
 1. Получение корректной русификации в "Центре управления системы"
 1. Обеспечение автоматического включения звуковой подсистемы
 1. Обеспечение автоматического открытия index.html
 1. Получение на рабочем столе ссылок на произвольные папки, в том числе и на папку с контентом
 1. Замена фона рабочего стола.
'''''Для замены названий пунктов загрузочного меню''''' нужно редактировать syslinux.cfg и isolinux.cfg:

в строках, формирующих меню загрузчика (строки, начинающиеся с "label") вместо label live и label disk пишем соответственно label Start и label Stop.

'''''Для замены картинки на экране загрузочного меню (bootlogo)''''' нужно сначала создать свой собственный вариант bootlogo.

Для этого из /home/ust/build/chroot/usr/share/gfxboot/$THEME/ (все это было создано на предыдущем этапе при автоматической сборке) копируем файл bootlogo куда-нибудь к себе (например, в специально созданный каталог /home/ust/logo). Здесь под переменной $THEME понимается значение THEME=<...>, которое прописано в файле config профиля.

Файл bootlogo является архивом каталога с элементами экрана загрузки, созданным с помощью утилиты cpio.  Поэтому сначала архив надо распаковать, а потом  проделать изменения, после чего опять запаковать.

Для порядка переименуем bootlogo в bootlogo.cpio и дадим команду распаковки:

[home/ust/logo]> cpio -i < bootlogo.cpio

В результате получим много разных файлов, среди которых интересен файл back.jpg. Он имеет размер 800х600 точек и его можно редактировать по вкусу.

После создания своей версии файла back.jpg нужно создать свой вариант bootlogo. Предварительно удалив имеющийся bootlogo.cpio (старый вариант), создаем новый cpio-архив командой

[home/ust/logo]> ls | cpio -o > ../newlogo.cpio

В результате в каталоге /home/ust получаем файл newlogo.cpio

(cpio не понимает метасимволов * или ?, поэтому на вход cpio был послан список файлов, созданный командой ls).

'''''Для замены картинки в процессе загрузки системы (bootsplash)''''' нужно заготовить jpeg'и с именами типа silent-XxY.jpg, где XxY - разрешение экрана. Таких картинок может понадобиться достаточно много, варианты можно посмотреть в chroot/etc/bootsplash/themes/current/images

Менять нужно будет только файлы с именами silent-..., файлы с именами bootsplash-... трогать не надо.

'''''Теперь проводим сборку поэтапно '''''с выполнением ручной настройки по необходимости.

[/home/ust/build]> rm livecd.iso  -- Удаляем старый образ (если нужно)

[/home/ust/build]> spt-clean  -- Очищаем сборочную среду и приводим ее в исходное состояние

[/home/ust/build]> spt-init-chroot -- Создаем "скелет" файловой структуры целевой системы

[/home/ust/build]> spt-make-chroot -- Собираем целевую систему из пакетов, указанных в packages

__Ручная работа:__

'''''Для замены bootlogo '''''удаляем в chroot/usr/share/gfxboot/$THEME файл bootlogo, копируем туда ранее созданный newlogo.cpio и переименовываем его в bootlogo. Потом делаем владельцем этого файла пользователя ust_a (с правами которого работает spt3) и выставляем (при необходимости) права 644.

(Тема графической загрузки определяется переменной THEME в файле конфигурации профиля (config). Указанная для этой переменной строка должна соответствовать названию темы в /boot/splash целевой системы , которое получается после установки пакета design-bootloader-* из репозитория (т.е. полезно перед вызовом spt-boot-gfxboot заглянуть в chroot/boot/splash/). В частности, пакет design-bootloader-livecd-desktop, включаемый в профиль, приводит к появлению chroot/boot/splash/desktop-livecd/ , поэтому в переменной THEME должно быть установлено значение desktop-livecd (т.е. то, что получается после установки пакета, а не то, что написано в его названии). А design-bootsplash-* должен соответствовать design-bootloader-* уже по названию пакета в репозитории.)

'''''Для замены bootsplash''''' копируем все заготовленные файлы silent-... в chroot/etc/bootsplash/themes/current/images и выставляем владельца и права как в случае с bootlogo.

'''''Для обеспечения появления ярлыков на рабочем''''' столе нужно сделать следующие действия.

С правами root скопировать в ~/build/chroot/usr/share/apps/kdesktop/DesktopLinks/ с рабочей системы (например, со сборочной) нужные ярлыки (см. /usr/share/apps/kdesktop/DesktopLinks/*, например, Home.desktop и documents.desktop) ''(подсказано Сергеем Турчиным)''

[/home/ust/build]> spt-run-scripts -- Запускаем скрипты настройки конфигурации целевой системы

__Ручная работа:__

'''''Для автоматического открытия файла index.html '''''после загрузки системы нужно сделать следующие действия.

С правами root скопировать ~/build/profile/root/usr/share/autostart/indexhtml.desktop (файл настроек KDE для автозапуска index.html) в ~/build/chroot/usr/share/autostart/

Почему-то положительный эффект дает еще и переименование ~/build/chroot/usr/share/autostart/indexhtml.desktop в starthtml.desktop (в том же каталоге).

(В итоговом профиле переименование уже сделано.)

Затем выполняются следующие этапы spt3.

[/home/ust/build]> spt-pack-squashfs -- Создаем сжатую файловую систему

[/home/ust/build]> spt-boot-propagator -- По всей видимости, готовит загрузочную часть целевой системы

[/home/ust/build]> spt-boot-gfxboot -- Если эта команда ничего не вывела, то графической загрузки не будет, надо искать ошибки :\ (см. ниже).

[/home/ust/build]> spt-boot-splash -- Если предыдущая команда сработала некорректно, то от этой тоже толку не будет

[/home/ust/build]> profile/spt-copy-files iso -- Копируем контент в грядущий образ. (К сожалению, нельзя использовать этот этап только для замены контента.)

[/home/ust/build]> spt-pack-iso -- Создание финального образа целевой системы. Последний этап работы.

== Замечание о звуковой подсистеме ==
Включение в список пакетов всего, что относится к alsa (kernel-modules-alsa, alsa-utils) и kde-multimedia с kmix'ом приводит к тому, что после загрузки звук оказывается всегда выключен. При ручном включении и настройке каналов (главный, фронт, PCM) все начинает работать. По подсказке Кирилла Маслинского (KirillMaslinsky) добавление в список пакета sound-scripts дало положительный эффект и на поддерживаемых звуковых картах звук включается автоматически.

== Замечание о русской локали с UTF-8 ==
В исходном профиле в файле config переменная LANGS установлена в ru_RU. С первоначальным профилем в итоге получается ru_RU.cp-1251.

Решение: в профиле в папке setup.d в скрипте console (а не locale!) прописать везде ru_RU.UTF-8 (см. итоговый профиль)

== Иллюстрации ==
=== Bootlogo: ===
||<tablewidth="100%" tablestyle="">Исходный профиль ||Итоговый профиль ||
|| attachment:bootlogo-orig-small.png || attachment:bootlogo-new-small.png ||
=== Bootsplash: ===
||<tablewidth="100%" tablestyle="">Исходный профиль ||Итоговый профиль ||
|| attachment:bootsplash-orig-small.png || attachment:bootsplash-new-small.png ||
== Благодарности ==
Большое спасибо ALTLinux в целом за возможность использования репозитория, спасибо также Михаилу Якшину, автору spt3 и краткого описания к нему, и особая благодарность Кириллу Маслинскому (KirillMaslinsky) за помощь в вышеописанном процессе и терпение, проявленное в ходе ее оказания.