Ключевые слова:centos, linux, packet, iso, rpm, repository, (найти похожие документы)
From: EliteMoly
Date: Mon, 23 Oct 2010 17:02:14 +0000 (UTC)
Subject: Создание дистрибутива под определённые нужды на основе пакетной базы CentOS
Оригинал: http://centos.alt.ru/?p=425
Долго думал, как начать изложение темы и решил начать повествование с
обзора того, что находится на iso-образе.
Итак, что же у нас на нём такое лежит.
mkdir CentOS-5.4-i386-bin-DVD
mount CentOS-5.4-i386-bin-DVD.iso CentOS-5.4-i386-bin-DVD -o loop
tree CentOS-5.4-i386-bin-DVD
CentOS-5.4-i386-bin-DVD
|- CentOS
| |- Cluster_Administration-as-IN-5.2-1.el5.centos.noarch.rpm
| |- Cluster_Administration-bn-IN-5.2-1.el5.centos.noarch.rpm
-----------------skip-----------------------
|- EULA
|- GPL
|- NOTES
| |- RELEASE-NOTES-U1-as.html
| |- RELEASE-NOTES-U1-bn.html
-----------------skip-----------------------
|- RPM-GPG-KEY-CentOS-5
|- RPM-GPG-KEY-beta
|- TRANS.TBL
|- images
| |- README
| |- TRANS.TBL
| |- boot.iso
-----------------skip-----------------------
|- isolinux
| |- TRANS.TBL
| |- boot.cat
-----------------skip-----------------------
`- repodata
|- TRANS.TBL
|- comps.xml
|- filelists.sqlite.bz2
|- filelists.xml.gz
|- other.sqlite.bz2
|- other.xml.gz
|- primary.sqlite.bz2
|- primary.xml.gz
`- repomd.xml
Уделим внимание вещам, которым стоит уделить внимание.
CentOS - директория, в которой лежат rpm-пакеты.
images - директория, в которой лежат файлы, необходимые для самого
процесса инсталляции.
isolinux - директория одноимённого загрузчика.
repodata - директория, в которой лежат файлы, в которых
проиндексировано всё, что лежит в директории с пакетами.
Глядя на то, что имеем, приходим к очевидному решению. Для того чтобы
добавить\заменить\убрать\обновить пакет, нужно всего лишь сделать
соответствующие изменения в директории с пакетами, проиндексировать их
заново, записать полученное в iso, назвать это всё MegaDISTeR и идти
постить новость о нём на opennet.ru
В принципе, все, кто пишет о том, как это сделать, в том или ином виде
это делают. http://centos.alt.ru/?p=3http://cooker.wbitt.com/index.php/Custom_Linux_bootable_CD
Для наглядности рассмотрим наиболее распространённые задачи.
Задача: Заменить исходные пакеты своими. Или сделать respin с
обновлённым набором пакетов.
Для выполнения следуйте многочисленным инструкциям. Например
Создание респина (Respin) CentOS 5
Создание установочного диска со всеми текущими обновлениями пакетов.
Первым шагом научимся создавать загрузочный DVD диск со всеми текущими
обновлениями пакетов.
Для этого создадим каталог /builddir в котором будем проводить все
дальнейшие манипуляции.
Также нам понадобятся пакеты yum-utils, createrepo, mkisofs,
anaconda-runtime - установим их с помошью yum.
yum install yum-utils createrepo mkisofs anaconda-runtime
В каталог /builddir скопируйте все файлы которые содержатся на
оригинальном компакт диске с CentOS, структура каталогов получится
следующая:
CentOS
EULA
GPL
images
isolinux
NOTES
RELEASE-NOTES-en
RELEASE-NOTES-en.html
RELEASE-NOTES-en_US
RELEASE-NOTES-en_US.html
repodata
RPM-GPG-KEY-beta
RPM-GPG-KEY-CentOS-5
TRANS.TBL
.treeinfo
.discinfo
Обратите внимание на два файла .treeinfo и .discinfo они очень важны для
работоспособности полученного дистрибутива.
Теперь в каталог /builddir/CentOS скопируйте все обновляния для
дистрибутива доступные на данный момент.
После того как Вы это сделали, в данном каталоге будут присутствовать
как оригинальные пакеты, так и пакеты с обновлениями.
Удалим старые версии дублирующихся пакетов с помошью команды:
repomanage -o /builddir/CentOS | xargs rm
Теперь нам необходимо произвести переиндексацию пакетов.
В каталоге /builddir выполните следующую команду:
createrepo -g repodata/comps.xml .
Теперь нам необходимо создать установочный ISO образ полученного
дистрибутива для записи на компакт диск.
Делается это с помошью команды:
mkisofs -v -U -J -R -T -b isolinux/isolinux.bin -c isolinux/boot.cat \
-no-emul-boot -boot-load-size 4 -boot-info-table -V "CentOS 5" -o /centos5.iso /builddir
После чего в корне вашего диска будет находится файл centos5.iso.
Последним шагом внесем в полученный ISO образ системы его md5 сумму:
/usr/lib/anaconda-runtime/implantisomd5 /centos5.iso
Внимание !!! При создании компакт диска ядро инсталятора не обновится на
более свежее, о том, как обновить ядро инсталятора читайте ниже.
Создание установочного диска со всеми текущими обновлениями пакетов +
обновленное ядро в инсталяторе CentOS.
После выполнения команды:
repomanage -o /builddir/CentOS | xargs rm
Перейдите в каталог /builddir и удалите следующие каталоги images,
isolinux и файлы .discinfo .treeinfo
Выполните команду:
/usr/lib/anaconda-runtime/buildinstall --product CentOS-Custom --version 5 \
--release "CentOS-Custom 5" --prodpath /builddir/CentOS /builddir
buildinstall возьмет образ ядра из доступного в каталоге
/builddir/CentOS , и создаст все сопутствующие файлы необходимые
инсталятору.
Производим переиндексацию пакетов, в каталоге /builddir выполняем команду:
createrepo -g repodata/comps.xml .
Затем создаем установочный ISO образ полученного дистрибутива для записи
на компакт диск с помошью команды:
mkisofs -v -U -J -R -T -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot \
-boot-load-size 4 -boot-info-table -V "CentOS 5" -o /centos5.iso /builddir
После чего в корне вашего диска будет находится файл centos5.iso.
Вносим в полученный ISO образ системы его md5 сумму:
/usr/lib/anaconda-runtime/implantisomd5 /centos5.iso
Задача: Добавить к существующему дистрибутиву дополнительный пакет или группу пакетов.
Причём надо, чтобы они не просто лежали на компакт диске, а ещё либо
устанавливались сами, либо был выбор устанавливать их или нет в штатном
установщике.
При установке все мы видели возможность выбирать категории пакетов или,
если захотеть, то выбирать по-пакетно. А ещё все мы также замечали, что
несмотря на наш выбор, устанавливается определённый набор пакетов,
которых даже и в списке-то нет. Вся эта информация хранится в файле
repodata/comps.xml. Описание формата этого файла - отдельная статья. Но
именно он содержит информацию о группах, пакетах и то, как они зависят
друг от друга. Добавить пару своих пакетов вы можете, например, в
группу core, с типом type="mandatory", тогда они установятся
независимо от выбора пользователя. Или же можете создать свою группу и
описать её согласно принятым правилам comps.xml. И тогда она даже
появится в списке выбора пакетов во время установки.
Итак, подытожим:
1. Добавить свои пакеты в директорию с пакетами.
2. Отредактировать файл comps.xml согласно своим нуждам.
3. Переиндексировать пакеты createrepo -g repodata/comps.xml.
4. Создать установочный ISO образ.
Следующая задача звучит несколько сложнее, собственно из-за неё и
начинался весь сыр-бор со сборкой своего заточенного под определённые
нужды ISO образа.
Задача: Создать установочный ISO образ, размером желательно(настойчивым
тоном) поменьше, чем 4gb, который содержит только httpd и минимальное
окружение для его запуска+заданный набор пакетов. Установка
производится без вмешательства пользователя.
Куда бежать?
Можно поступить как в предыдущей задаче. Установить необходимое
окружение, посмотреть список установленных пакетов в этом окружении и
поместить их в директорию с пакетами. Отредактировать comps.xml(что
есть самое противное занятие) и далее как в предыдущей задаче. А потом
я представил, что когда появится задача добавить в установочный образ,
например, ещё и mysql+postgres со всеми зависимостями, а если таких
сборок надо будет поддерживать 2 или более наборов, и обновлять их при
каждом релизе upstream дистрибутива. Оценил фронт работ и стал искать
другой способ.
Интернет молчит, как рыба, о том, как делать собственные дистрибутивы
на основе пакетной базы CentOS\RHEL 5. Я, по крайней мере, не мог найти
ничего вразумительного на протяжении месяцев.
Не помню как, но я нашёл вот что - https://fedorahosted.org/pungi/
The pungi project is two things. First and foremost it is a free
opensource tool to spin Fedora installation trees / isos. It will be
used to produce Fedora releases from Fedora 7 on until it is replaced
by something better.
Хм, инструмент для сборки федоры.... дак rhel 5 и основан на какой-то
из версий федоры(то ли 6 то ли 7 то ли вперемешку)!
И я стал экспериментировать. Долго ли, коротко ли, но вам уже будет
представлен готовый порядок действий использования pungi для создания
дистрибутива под свои нужды.
Порядок действий для сборки pungi. Описание сборки pungi было сделано в
окружении, созданном с помощью pungi, и окружение, так скажем, очень
минимально, для того чтоб я не пропустил никаких зависимостей.
rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
yum install rpm-build
cd /usr/src/redhat/SOURCES/
wget https://fedorahosted.org/pungi/attachment/wiki/1.2.6/pungi-1.2.6.tar.bz2?format=raw -o pungi-1.2.6.tar.bz2
yum install python-devel
rpmbuild -ta pungi-1.2.6.tar.bz2
yum install anaconda-runtme repoview
Приготовились к тому, что по зависимостям будет вытащен целый вагон
пакетов. Но на что не пойдёшь ради великого дела.
yum install pungi-1.2.6-1.noarch.rpm
"Из каробки" pungi, естественно, у нас не заработает. Продолжаем.
cd /usr/src/redhat/SRPMS/
wget http://rpm.sh-linux.org/rpm-fc7/updates/target-SRPMS/pykickstart-1.13-2.fc7.src.rpm (или ещё откуда душе угодно)
yum install gettext make
rpmbuild -rebuild pykickstart-1.13-2.fc7.src.rpm
yum install -nogpgcheck pykickstart-1.13-2.noarch.rpm
В файле /usr/lib/python2.4/site-packages/pypungi/pungi.py
Исправляем путь к файлу implantisomd5
# pypungi._doRunCommand(['/usr/bin/implantisomd5', isofile], self.logger)
pypungi._doRunCommand(['/usr/lib/anaconda-runtime/implantisomd5', isofile], self.logger)
В файле /usr/lib/python2.4/site-packages/pypungi/gather.py
Закомментировать строки
# thisrepo.exclude = repo.excludepkgs
# thisrepo.includepkgs = repo.includepkgs
В файле /usr/lib/python2.4/site-packages/pypungi/config.py
Все надписи fedora меняем на CentOS. product_path тоже на CentOS.
Распишем, что же делает pungi. Чтобы знать и понимать.
1 Собирает пакеты из репозитариев и подготавливает их к использованию в
установочном ISO образе. (По сути помещение нужных rpm пакетов, с
разрешением зависимостей, в определённую директорию)
2 Проверяет comps.xml
3 Индексирует репозитарий.
4 Создаёт директорию repoview(Набор html файлов с описанием пакетов).
5 Запускает anaconda/buildinstall. (В качестве донора для создания
окружения установщика, анаконда использует репозитарий, тот который
будет помещён на компакт диск)
6 Может создавать образы, не более заданного размера. Если размер
превышает объём носителя, то разделяет на необходимое колличество
частей.
7 Запускает mkisofs для записи полученного в ISO образ.
Теперь попробуем собрать образ, содержащий минимальное окружение для
запуска httpd.
Pungi, как инструкцию из чего и как собирать, использует для свой
работы kickstart-подобные файлы (потому что оно использует pykickstart.
Вот такая реентабельность). Не все инструкции из этого kickstart файла
применимы к нему. Оттуда он берёт список репозитариев и список пакетов,
которые следует поместить\не поместить на ISO образ. (Поместить не
означает, что они будут устанавливаться)
Создадим директорию
mkdir /home/mycentos/
cd /home/mycentos/
создадим файл mycentos.ks
со следующим содержимым.
repo -name=centos -baseurl=file:///home/buildsystem/centos/CentOS-5.2-i386-bin-DVD/
repo -name=update -baseurl=file:///home/buildsystem/centos/CentOS_5_Update/i386/RPMS/
%packages -nobase
anaconda
anaconda-runtime
-@kde-desktop
-kde*
-gnome-*
httpd
mod_*
vim-minimal
-mysql
-postfix
%end
В секции настройки репозитариев укажите свои.
И давайте сразу создадим вот такой скриптик build-centos.sh
#!/bin/bash -x
#some cleanup needed
rm -rf /tmp/treedir* /tmp/key* /tmp/minst* /tmp/instima* /tmp/makebootdisk.dir.*
rm -rf work 5 logs repodata-*
pungi -c mycentos.ks --name=CentOS --ver=5 --nosource --force --nosplitmedia
Запустите build-centos.sh, понаблюдайте за его работой.
После выполнения в директории /home/mycentos появится 3 директории: 5,
logs, work. В директории 5 вы и найдёте ваш свеженький ISO + ISO Rescue
CD. В директории logs, как ни странно, подробный лог сборки. Директория
work содержит какие-то промежуточные файлы, необходимые для работы
pungi.
Посмотрите, какой он вам создал ISO образ. httpd и все пакеты с
названием mod_* там. Увидите, что размер всех пакетов на-а-а-а-много
меньше, чем 4gb. И когда вы попробуете установиться с полученного
образа, то заметите, что выбирать пакеты во время установки можно, но
поставятся только те, которые есть на CD.
Теперь рассмотрим подробней, как pungi получает список пакетов, которые
следует поместить на ISO.
Мы в нашем файле указали не так много включений и исключений, а пакетов
набралось всего 463 штуки. Это при том, что на оригинальном DVD CentOS
их находится больше 2000.
За ответом заглянем в код pungi.
# Always add the core groiup
self.ksparser.handler.packages.add(['@core'])
# Check to see if we need the base group
if self.ksparser.handler.packages.addBase:
self.ksparser.handler.packages.add(['@base'])
1. Pungi всегда добавляет все пакеты из группы core файла comps.xml
2. Pungi, в зависимости от ключа к %packages, либо добавляет, либо не
добавляет пакеты из группы base.
То есть, чтобы добиться от pungi добавления(на CD) пакета или группы,
то ему это надо явно указать. Пример kickstart файла для сборки
fedora-rawhide можно оценить тут: /usr/share/pungi/rawhide-fedora.ks,
он намного наглядней, чем мои попытки описать суть.
Вариантов задачи создания дистрибутива под определённые нужды я выделяю два:
Первый. Когда нужно подготовить дистрибутив почти "общего
назначения". Например, с выбором типа установки для пользователя (то
есть, неавтоматическая установка с помощью kickstart). Например, в
выборе участвуют такие пункты как: "Cluster node", "Router",
"Vasya Pupkin soft group", с возможностью выбора того, иного или
вместе.
В данном варианте, основная работа будет идти вокруг файла comps.xml и
простом перечислении данных групп для pungi в конфигурационном файле. В
помощь тем, кому нужен этот вариант, советую эту ссылку
http://sourceforge.net/projects/orangejeos/ . Проект немного уже
попахивает, НО в нём проделана гигантская работа, там сделан свой
comps.xml. И пакеты поделены всего на 3 группы. От этого можно будет
оттолкнуться. Вот ещё один вариант
http://cooker.wbitt.com/index.php/Comps.xml_for_CentOS-5.4-x86_64_minimal_install
Второй. Когда нужно подготовить дистрибутив с определённым набором
пакетов, и установка происходит в режиме automated install, когда
система разворачивается, не особо задавая вопросы. Это тот вариант,
ради которого всё и затевалось. Я для себя остановился на следующей
схеме подготовки списка помещаемых пакетов на ISO образ:
1. Не трогать comps.xml на дистрибутиве "доноре".
2. Пакеты, которые, я считаю, должны быть\не быть, описываю в
конфигурационном-kickstart файле.
3. Автоматическая установка через kickstart.
4. Про четвёртый пункт будет рассказано в конце.
Вот, в принципе, и всё.
Под конец расскажу ещё о полезных вещах. Вспомним то, о чём было
сказано в начале. "В качестве донора для создания окружения
установщика анаконда использует репозитарий, тот, который будет помещён
на компакт диск". И как вы уже, наверное, заметили, что в
конфигурационном файле для сборки присутствует строчка, говорящая о
том, что на ISO образ должен быть помещён anaconda-runtime. А
anaconda-runtime за собой тащит очень много барахла (подробный список
можно найти в файле /usr/lib/anaconda-runtime/upd-instroot). Эти пакеты
нужны для сборки, но потом помещать их в ISO образ совсем не
обязательно. Представляю, сколько возмущения созрело в вас, когда вы
увидели, что по зависимостям на образ был утащен X сервер итд :) , а
устанавливаться он не будет.
Патчим pungi в файле /usr/lib/python2.4/site-packages/pypungi/pungi.py
Добавляем вот сюда
# setup the extra mkisofs args
extraargs = []
вот такое
# setup the extra mkisofs args
extraargs = []
#exclude packages from iso image
extraargs.append('-exclude-list')
extraargs.append(os.path.join(os.getcwd(), 'exclude-list'))
И можно будет писать список нам ненавистных пакетов в файл
exclude-list. Причём, не используя точное имя файла. А, например,
anaconda*. И в ISO не попадут 2 файла: anaconda и anaconda-runtime. Ибо
они нам не нужны, ведь мы не создаём дистрибутив общего назначения.
Только нужно учесть, что после такого "патча" исключение пакетов
происходит на этапе записи ISO образа, это означает, что если вы не
правили comps.xml, или установка идёт не в автоматическом режиме, то,
возможно, на этапе выбора пакетов пользователь навыбирает то, что мы
исключили, и установка завершится с ошибкой.
Для своих нужд я использую kickstart установки с полученного образа (а
наши нужды на 100% совпадают). Вы спросите, а как в образ поместить
kickstart файл? Надо просто в момент перед записью дерева образа в ISO
вставить копирование в дерево нужного вам файла. Дерзайте, pungi
написан на питоне :) . Я свой вариант изменений выкладывать не буду:
там не пара строчек. Да и более правильное решение этой проблемы
описано в https://fedorahosted.org/pungi/ticket/17. Тому, кому
действительно нужно делать свои сборки, сообщённой мной информации уже
должно хватить для достижения положительных результатов.
Есть основания полагать, что в будущем данный способ можно будет
применить к rhel/centos 6, только надо будет взять pungi посвежее.
------
Если при создании таким способом установочного диска, анаконда не
работает в графическом режиме, значит не все необходимые пакеты были
включены на момент сборки. Полный список смотреть тут
/usr/lib/anaconda-runtime/upd-instroot .
Часть 2.
Изложение в данной части будет проходить в предположении, что вы уже
ознакомились с мат. частью в предыдущей статье, и у вас уже есть
готовый pungi.
В предыдущей статье я описал схему, на которой я остановился. Ничто не
вечно, и моя схема тоже. На сегодня я от неё отказался.
Она обладала одним большим недостатком, вытекающим из логики работы
pungi.
А именно:
1. В список пакетов для сборки приходилось включать anaconda и
anaconda-runtime, которые, в свою очередь, тянут вагон и маленькую
тележку пакетов за собой.
2. Мучительное, долгое, трудозатратное исключение пакетов разными
хаками.
И я решил разделить создание окружения инсталятора и сборку пакетов для
ISO образа.
Подробнее:
Копируем содержимое ISO образа на жесткий диск.
mkdir -p /home/mycentos/CentOS-5.4-i386-bin-DVD
cp -ar /home/buildsystem/CentOS-5.4-i386-bin-DVD/{CentOS,repodata} /home/mycentos/CentOS-5.4-i386-bin-DVD/
Далее воспользуемся знанием о фале comps.xml.
Берём вот отсюда
http://cooker.wbitt.com/index.php/Comps.xml_for_CentOS-5.4-x86_64_minimal_install ,
чужой труд. Хотя и не принципиально его использовать,
можно и родной с CD переделать. Но нам именно этот пригодится в
дальнейшем.
Кладём его в /home/mycentos/CentOS-5.4-i386-bin-DVD/repodata/
cd /home/mycentos/CentOS-5.4-i386-bin-DVD/repodata/
sed -i 's/mandatory/optional/' comps.xml
sed -i 's/default/optional/' comps.xml
cd ..
createrepo -g repodata/comps.xml `pwd`
Теперь у нас нет нигде никаких умолчаний о том, какие пакеты будут в
репозитарии, который пойдёт на CD, и теперь мы полностью всё будем
выбирать сами.
cd ..
mkdir stage2
cat CentOS-5.4-i386-bin-DVD/repodata/comps.xml | grep packagereq |\
sed -rn 's/.*>(.*)/\1/p' > stage2/packages-base
echo kernel " stage2/packages-base
Теперь у нас в директории stage2/ в файле packages-base лежит список
пакетов, который мы считаем минимальным для себя. Его потом можно будет
использовать как основу для разных сборок. (На самом деле, он не
минимален, в нём ещё можно поубирать.)
Создаём файл anaconda-runtime.ks со следующим содержимым:
repo --name=centos --baseurl=file:///home/mycentos/CentOS-5.4-i386-bin-DVD/
%packages --nobase
#need to build
anaconda
anaconda-runtime
busybox-anaconda
mdadm
kernel
gnome-python2-gtkhtml2
-kernel-PAE-*
-kernel-debug-*
-kernel-xen-*
#end need to build
#all other groups
@core
%end
Создаём файл stage2/repolist-base со следующим содержимым:
repo --name=centos --baseurl=file:///home/mycentos/CentOS-5.4-i386-bin-DVD/
Создаём файл build-centos.sh со следующим содержимым:
#!/bin/bash -x
ver=5.4
cleanup()
{
#some cleanup needed
rm -rf /tmp/treedir* /tmp/key* /tmp/minst* /tmp/instima* /tmp/makebootdisk.dir.*
/tmp/updboot.kernel.*
rm -rf work 5* logs repodata-i386
return 0
}
cleanup
pungi -c anaconda-runtime.ks --name="CentOS" --ver=$ver-stage1 --nosource \
--force --nosplitmedia -G -C -B
echo "Generating kickstart for stage2"
cat stage2/repolist-* > mydistr-stage2.ks
echo "%packages --nobase" " mydistr-stage2.ks
cat stage2/packages-* | sort | uniq " mydistr-stage2.ks
echo "%end" " mydistr-stage2.ks
pungi -c mydistr-stage2.ks --name="CentOS" --ver=$ver --nosource --force --nosplitmedia -G -C
echo "Moving completed anaconda installer to another build tree"
#put here all kickstart file movement, syslinux menu editing
cp -av ./$ver-stage1/.composeinfo ./$ver/.composeinfo
cp -avr ./$ver-stage1/i386/os/images ./$ver/i386/os/
cp -avr ./$ver-stage1/i386/os/isolinux ./$ver/i386/os/
cp -av ./$ver-stage1/i386/os/.discinfo ./$ver/i386/os/.discinfo
cp -av ./$ver-stage1/i386/os/.treeinfo ./$ver/i386/os/.treeinfo
pungi -c mydistr-stage2.ks --name="CentOS" --ver=$ver --nosource --force --nosplitmedia -I
Намётанному глазу должно уже быть всё ясно.
Теперь отдельно можно выкорчёвывать из анаконды пакеты, необходимые
графическому установщику. И отдельно под полным контролем задавать
список пакетов нашего дистрибутива.
PS: В список stage2/packages-base, в данном случае, не нужно вносить
пакеты со знаком "-". Если ненавистный вам пакет помещается на ISO,
то нужно смотреть, кто его утащил за собой по зависимости.