Сборка своего 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-сервера.
Тут есть два варианта:
- Подключиться к существующему зеркалу репозиториев ALTLinux
- Поднять собственный ftp-сервер и создать зеркало на нем, прописав его в sources.list apt'a.
В обоих случаях все "посторонние" источники пакетов нужно вычистить из всех списков источников.
При работе с внешним репозиторием (существующим зеркалом) нужен скоростной канал с большим объемом трафика. т.к. каждая пересборка требует закачивания всех необходимых пакетов (200-400 Мбайт). На "медленной" безлимитке (ADSL 256К) ничего не получается, т.к. в случайные моменты процесс вылетает по таймауту.
Профиль
Профиль - это каталог с набором конфигурационных файлов и скриптов, содержащих список пакетов для целевой системы, настройки будущего рабочего стола, список файлов и папок, образующих полезный контент и пр. Как его сделать с нуля - тайна сия велика есть, а от примеров из spt3-profiles практической пользы никакой.
В любом случае каталог профиля (назовем его условно profile) кладется в домашний каталог пользователя, осуществляющего сборку (не root!).
profile-livecd-khakhaev.zip - исходный профиль (нуждается в оптимизации и уборке лишнего из файла packages)
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 не происходит.
Основные проблемы, которые решались (или не решились) при отладке процесса, были следующие:
- Смена темы графической загрузки
- Замена названий пунктов загрузочного меню
- Получение корректной русификации в "Центре управления системы"
- Обеспечение автоматического включения звуковой подсистемы
- Обеспечение автоматического открытия index.html
- Получение на рабочем столе ссылок на произвольные папки, в том числе и на папку с контентом
- Замена фона рабочего стола.
Для замены названий пунктов загрузочного меню нужно редактировать 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:
Исходный профиль |
Итоговый профиль |
|
|
Bootsplash:
Исходный профиль |
Итоговый профиль |
|
|
Благодарности
Большое спасибо ALTLinux в целом за возможность использования репозитория, спасибо также Михаилу Якшину, автору spt3 и краткого описания к нему, и особая благодарность Кириллу Маслинскому (KirillMaslinsky) за помощь в вышеописанном процессе и терпение, проявленное в ходе ее оказания.