понедельник, 2 февраля 2009 г.

Сборка собственного дистрибутива

(на примере CentOS 5.1)
вольный перевод с изменениями, искажениями и тд

Введение
Подготовка собственного дистрибутива выполняется по разным причинам. Например, для автоматизации установки на множестве компьютеров однотипной среды, или для добавления часто используемых программ в установку дистрибутива. В любом случае, предполагается выполнение нескольких шагов. В качестве примера используем дистрибутив CentOS 5.1. Но можно и любой другой, который работает на системе пакетов, основанных на RPM и anaconda в качестве инсталлятора (то есть RedHat5, ASPLinux12, Fedora8/9).

Подготовка инструментов
В процессе работы могут потребоваться некоторые программы. Установим их. Для отдельных случаев может подойти инсталляция по сети. Тогда все ограничится созданием kickstart файла (где лежит описание параметров, передаваемых инсталлятору) и изменением репозитария — для этого можно поставить только createrepo.

#yum install anaconda-runtime yum-utils anaconda anaconda-help
#yum install busybox-anaconda
#yum install createrepo
#yum install squashfs-tools
#yum install mkisofs

Так же для создания файла kickstart можно применять следующую утилиту

yum install system-config-kickstart

После сделаем локальную копию диска (для удобства работ с пакетами и т.д.), включая .discinfo файл. В оригинальной документации используется rsync для создания копии с параметром –a. Это сделано для того, чтобы при копировании сохранялись символические ссылки и права доступа.

mkdir centos-disk centos
sudo mount /dev/dvd centos-disk
rsync -a centos-disk/* centos
cp centos-disk/.discinfo centos/
sudo umount centos-disk
rmdir centos-disk

Теперь все готово к созданию дистрибутива. Редакторы для графики каждый выбирает по своему усмотрению.

Создание файла kickstart
А сейчас сделаем заготовку (по ходу доработаем) файла kickstart, того чем будем «кормить» анаконду. Главное — описать все что потребуется инсталлятору, чтобы не спрашивал у нас (ну, кроме редких случаев которые каждый определит самостоятельно).
Способов много. Взять готовый после установки и исправить, написать с нуля, воспользоваться system-config-kickstart и доработать руками.
В целом kickstart представляет собой список параметров, передаваемых инсталлятору (ответов на вопросы), дополненный списком пакетов и скриптами предварительной/заключительной настройки.

#--- метод инсталляции (install, это не upgrade) и источник пакетов (CD-ROM)
install
cdrom

#--- языковые средства и устройства ввода
lang en_US.UTF-8
langsupport ru_RU.UTF-8
keyboard ru

#--- пропустить конфигурацию X-Window
skipx

#--- авторизация и настройки безопасности
rootpw --iscrypted $1$nIbsWYcm$AJ3Dm/kvbhDP3f30j2EKy/
firewall --disabled
selinux --disabled
authconfig --enableshadow --enablemd5

#--- часовой пояс
timezone --utc America/New_York

#--- место положения загрузчика
bootloader --location=mbr

#--- разбиение диска (можно применить и lvm)
zerombr yes
clearpart --all --initlabel
part /boot --fstype ext3 --size=128
part swap --size=1024
part /recovery --fstype ext3 --size=1024
part / --fstype ext3 --size=4096
part /var --fstype ext3 --size 1 --grow

#--- перезагрузка после инсталляции
reboot

#--- список пакетов и групп пакетов
%packages --resolvedeps
@core
very_important_app

#--- скрипты выполняемые перед инсталляцией
%pre

#--- скрипты выполняемые после инсталляции
%post


Подготовка пакетов
Большое число пакетов, не входивших в поставку дистрибутива, перед созданием репозитария желательно подписать.
Делаем это следующим образом:
1. Устанавливаем (если еще нет в системе) gpg.
2. Генерируем ключ для подписывания.
3. Создаем файл ~/.rpmmacros с содержанием:

%_signature gpg
%_gpg_name <полное название ключа>

Публичный ключ экспортируется для последующего распространения вместе с реподанными.
Подписывание пакетов выполняется коммандами:

rpm -addsign <имя пакета>
rpm -resign <имя пакета>

Репозитарии и comps.xml
Самая длительная часть - выбор пакетов и поиск зависимостей. Для начала можно посмотреть разделы core и base оригинального comps.xml. В этом файле описываются группы пакетов для меню инсталлятора и файла kickstart. При желании можно сделать по аналогии свой comps.xml, это сильно поможет, если делается несколько kickstart для одного диска.
Для проверки зависимостей воспользуемся таким скриптом:

# инициализация тестовой базы
rpm --initdb --dbpath ~/testdb

# --test для того чтобы только проверить на конфликты
# -Uvh в режиме обновления с выводом дополнительной информации
rpm --test --dbpath ~/testdb -Uvh \ path/to/dir/with/packages/*.rpm

В зависимости от того какой результат получен, корректируем список пакетов.
Для того чтобы в kickstart-файле вызвать группу пакетов указываем символ @ и идентификатор группы. Для всего остального просто указываем имя пакета.
Еще одно место, где можно найти полезную информацию — install.log в домашней папке root. Правда, для этого придется установить систему в той комплектации, в какой она вам интересна. (Одной инсталляцией больше, одной меньше. Для процесса не критично, но поиск пакетов ускоряет).
Когда набор пакетов собран и протестирован, делаем сборку метаданных для того, чтобы использовать в yum (система управления пакетами) и anaconda. Это выполняется с помощью утилитки createrepo:

createrepo --baseurl= --groupfile=

В качестве baseurl указываем номер из первой строки .discinfo, в groupfile ставим подготовленный comps.xml, ну и путь к месту с пакетами.

Замена графики anaconda
Графика - картинки, которые показываются анакондой во время инсталляции. Их замена - это маленькая радость от возможности порезать подборку картинок и запихать их в собственноручно собранный дистрибутив, а заодно и оформление инсталлятора поменять. Тем более, что для этого надо только разобрать файл stage2.img, а потом собрать по новой с новой графикой.
Разбираем... Копируем... Перенос через tar делается из-за жестких ссылок (сам не проверял, но люди из sipX в это верят). (Примечание: раньше вместо squashfs использовалась cramfs)

mount -o ro,loop -t squashfs ./stage2.img /mnt
cd /mnt
tar -cvf ~/stage2.tar .
cd ~
mkdir stage2; cd stage2
tar -xvf ../stage2.tar

В каталоге ~/stage2/usr/share/anaconda/pixmaps находятся картинки интерфейса anaconda. Там же в подкаталоге rnotes лежат картинки от процесса установки.
После замены всего, что хочется, делаем сборку…

cd ~
mksquashfs stage2/ stage2.img.new

…И кладем на место. То есть заменяем оригинальный stage2.img в images создаваемого дистрибутива своим. Кстати из images я оставил только stage2.img и minstg2.img. Существование остального в моем конкретном случае не имело значения.

Подготовка загрузчика диска
Загрузчик диска дает нам поле для творчества. Это и тексты, вызываемые по функциональным клавишам, и картинки с логотипами или «рекламой». Всего лишь нужно изменить isolinux/isolinux.cfg (чтобы страниц хватило) и соответствующие msg файлы.
Вот в этом файле есть два варианта загрузки: тест памяти и инсталляция по kickstart (ks.cfg в корне диска), причем последний по умолчанию. Также здесь урезано количество экранов с сообщениями — всего два (по умолчанию isolinux.cfg конечно отличается но не сильно).

default minimize
prompt 1
timeout 600
display boot.msg
F1 boot.msg
F2 options.msg
label local
localboot 1
label memtest86
kernel memtest
append -
label minimize
kernel vmlinuz
append initrd=initrd.img ks=cdrom:/ks.cfg

Вот экран который мы видим при загрузке (из-за строки с display в isolinux.cfg), он же boot.msg. В других msg-файлах (если упомянуты в isolinux.cfg) можно написать обращения и воззвания к будущим пользователям (или к самому себе).

^L
^Xsplash.lss

- Press ^O0b^O07 to begin installation.
- ^O0bWARNING:^O07 all data will be erased and disk formatted.
- Root password is "hez123".

^O0f[F1-Main] [F2-Info]^O07

Упомянутый splash.lss это и есть картинка, но немножко «мутная». К созданию картинок прилагаются следующие ограничения:
  1. ppm(raw/необработаный) формат изначально, потом конвертируется;
  2. только 14 цветов, режим «indexed»;
  3. 640 точек по горизонтали;
  4. по вертикали зависит от того, сколько пространства под текст отводится внизу экрана. Обычно 220-300 точек.
Ну и преобразование из ppm в lss делается так:

./ppmtolss16 '#c0cfc0=7' splash.lss

Прочие навороты
За подобные вещи отвечает отдельная секция kickstart-файла — %post.
Например, в файле от sipX производится замена фоновой картинки grub.
Самое главное - не забыть, что все выполняется в chroot итоговой инсталляции, и если надо что-нибудь скопировать или запустить с инсталляционного диска, то его необходимо примонтировать.
Вот пример секции, которая приводилась на сайте sipX:

%post
#!/bin/sh

#...Make copy of installation CD to the "/recovery" partition
/sbin/start_udev
/sbin/chkconfig --del smartd &> /dev/null
mkdir /recovery/linux
mkdir /tempdir
mount /dev/cdrom /tempdir
cp -a /tempdir/* /recovery/linux
cp -a /tempdir/.discinfo /recovery/linux
umount /tempdir
rm -rf /tempdir

#...Create initial setup script to run one time (after initial reboot only)
cp /recovery/linux/sipx_reset_cd /root/sipx_reset_cd
chmod u=rwx /root/sipx_reset_cd
echo -e "\n/root/sipx_reset_cd\n" >> /root/.bashrc
# the script removes itself from the root .bashrc file when it completes

#...Install new splash image
cp /recovery/linux/splash.xpm.gz /boot/grub

Мой вариант пока более примитивный (сложнее не потребовалось):

%post --interp /bin/bash
# no boot delay
real_file=/boot/grub/grub.conf
temp_file=/tmp/grub.conf.new
cat $real_file | sed 's/timeout=5/timeout=0/' > $temp_file
mv $temp_file $real_file
# less virtual consoles
real_file=/etc/inittab
temp_file=/tmp/inittab.new
cat $real_file | sed 's/[3-6]:2345:respawn/#\0/' > $temp_file
mv $temp_file $real_file

Сборка и запись образа
Ну вот, в нашей маленькой махинации остались мелочи - собрать файл образа и записать его на диск. Сборка iso-образа выполняется:

mkisofs -R -J -T -no-emul-boot -boot-load-size 4 \
-boot-info-table -V "идентификатор диска" \
-A "создано программой =)" -P "Паблишер" -p "подготовил" \
-b isolinux/isolinux.bin -c isolinux/boot.cat \
-x "lost+found" -o имя_файла.iso каталог_с_дистром

Записать диск можно любой программой для записи дисков, в том числе и

growisofs -Z /dev/dvd=имя_файла.iso

Дополнение
Основанно на следующих материалах (или подло уперто):
http://sipx-wiki.calivia.com/index.php/A_Kickstart_CD_for_sipX_on_CentOS
http://opennet.ru
http://www.centos.org
http://wiki.centos.org/TipsAndTricks/KickStart
http://www.centos.org/docs/5/html/5.1/Installation_Guide/pt-install-advanced-deployment.html

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

Отправить комментарий