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