Автоустановка FreeBSD

Оригинал

Переработанная и дополненная статья отсюда (к сожалению, ссылка канула в лету).

Небольшое описание создания диска с автоустановкой FreeBSD. Я сам пользователь никсов довольно неопытный, но вот пришлось столкнуться по работе с такой необходимостью как подготовка дистриба для установки определенного сервера с нуля.

Информацию именно по FreeBSD пришлось собирать с инета по крупицам. Вся инфа разбросана по просторам сети частями и несвязанно, вот и решил описать свой опыт и собрать часть информации воедино. Может кому поможет   Smilie: :D

В основном в инете много описаний создания дистриба на флешке или для установки по сети, а мне нужен был на болванке. Почитав всякие высказывания и пообщавшись с линуксоидами понял, что лучше для автоустановки использовать стандартный sysinstall.

Текст из вышеозвученной статьи буду выделять курсивом.
Итак, берем дистрибутив FreeBSD (в моем случае это был 7.0-Release) и смотрим его содержимое:

/ boot
/ floppies
/ packages
/ 7.0-RELEASE
ERRATA.HTM
HARDWARE.HTM
README.HTM
RELNOTES.HTM
ERRATA.TXT
HARDWARE.TXT
README.TXT
RELNOTES.TXT
boot.catalog
docbook.css
cdrom.inf

Здесь интерес представляют файлы cdrom.inf (содержит краткое описание диска дистрибутива) и packages/INDEX (содержит список всех пакетов из папки packages/All). Эти файлы должны быть именно с того дистрибутива, кот вы будете собирать.

Внимание! Все дальнейшие действия желательно проводить под суперпользователем root, т.к. некоторые из дальнейших действий доступны только ему. Если не хотите производить обычные действия под root`ом, то придется периодически переключаться между пользователями. Далее команды, которые необходимо производить под root`ом я буду выделять красным цветом.

Копируем все это, кроме файлов *.HTM и *.TXT в корне диска, в какую-нибудь папку, например mybootcd. Эта папка будет нашей «рабочей директорией» или далее $WORKDIR. Также для вспомогательных скриптов создайте папку, например, temp там же, где и папку mybootcd (НЕ в папке mybootcd!). Далее буду называть эту папку $TEMP.

Примечание: т.к. мне нужна была фря только с моими пакетами, я удалил всё из папки $WORKDIR/packages, создал в ней папку $WORKDIR/packages/All, куда cкопировал нужные мне пакеты и положил подготовленный файл $WORKDIR/INDEX(подробнее об этом опишу ниже).

Внимание! Для пакетов важно, чтобы все пакеты из их зависимостей тоже присутствовали в папке All и были описаны в файле INDEX.

Автоматизации процесса инсталляции мы добьемся с помощью написания файла сценария для installer-а, а именно install.cfg. Подробней с правилами и синтаксисом его заполнения можно ознакомиться в соответствующей странице мануала (man sysinstall).

Создадим файл install.cfg в папке $TEMP.

Важно! Создавайте файл install.cfg и изменяйте его именно под никсами, а не под Win, иначе sysinstall может его не воспринять.

Вот пример моего файла:

цитата:
# This is a sample installation configuration file for my test machine,
# $FreeBSD: src/usr.sbin/sysinstall/install.cfg 2008/10/30 MadLord
# Turn on extra debugging.
debug=yes
################################
# My host specific data
#hostname=test
#domainname=xxx.ru
#nameserver=
#defaultrouter=
#ipaddr=
#netmask=
################################
################################
# Which installation device to use
#netDev=ed0
#mediaSetFTP
mediaSetCDROM
################################
################################
# Select which distributions we want.
#dists=base doc manpages info src sbase ssys kernels GENERIC
#distSetCustom
distSetUser
################################
################################
# Now set the parameters for the partition editor on ad0.  Set to use the
# disk exclusively (could also be «all» to use the whole disk but
# respecting the MBR or «free» to use only unallocated space for FreeBSD).
######
#For manual editing
######
#partition=exclusive
#bootManager=boot
#diskInteractive=YES
#diskPartitionEditor
#diskLabelEditor
######
#For autocreate
######
disk=ad0
partition=all
bootManager=boot
diskPartitionEditor
# Disk partitioning.
# All sizes are expressed in 512 byte blocks!
# A 1GB root partition
ad0s1-1=ufs 2097152 /
# And a 2GB swap partition
ad0s1-2=swap 4194304 none
# (size 0 = free space)
ad0s1-3=ufs 20971520 /usr
ad0s1-4=ufs 20971520 /var
ad0s1-4=ufs 2097152 /tmp
ad0s1-5=ufs 0 /home
# Let’s do it!
diskLabelEditor
################################
# Uncomment this instead to use only the free space and install boot manager.
#partition=free
#bootManager=booteasy
#diskPartitionEditor
################################
################################
# Now partition the 2nd disk with a 1GB /var and /usr/src using the
# remainder of the disk.
#disk=ad1
#partition=exclusive
#diskPartitionEditor
#ad1s1-1=ufs 2097152 /var
#ad1s1-2=ufs 0 /usr/src
#diskLabelEditor
################################
# OK, everything is set.  Do it!
installCommit
# Install some packages at the end.
package=cronolog-1.6.2_1
packageAdd
package=apache+mod_ssl-1.3.37+2.8.28
packageAdd
package=mypkg
packageAdd
#command=/sbin/reboot
#system
#shutdown

Теперь подробнее о install.cfg:

hostname и domainname — задаем имя машины и ваш домен, если он есть. В принципе эти параметры можно и вообще не указывать, а настроить потом на уже установленной ОС.

mediaSetCDROM — откуда пойдет установка (в нашем случае с CD)

distSetUser — устанавливаем набор дистрибутива User (можете установить и свой набор используя dists и distSetCustom. Пример как раз закомментирован)

disk, partition, bootManager — выбираем диск, указываем какую его часть использовать (в нашем случае весь диск, но можно использовать и свободную его часть указав partition=free) и какой загрузчик ставить(в нашем случае ставиться мультизагрузчик FreeBSD, который перезапишет MBR, в соответствии с существующими на диске ОС. Если используете какой-то свой загрузчик и не хотите трогать существующий MBR, укажите bootManager=none)

Внимание! У параметра booManager есть еще значение standart, которое перезапишет MBR так, что будет загружаться одна только эта FreeBSD. Но данный параметр сработает только если у вас указан, какой из дисков активный(стоит атрибут Active). Файлом install.cfg этого не сделаешь(по крайней мере я не нашел как. Если кто знает буду благодарен за информацию), поэтому ОС после перезагрузки не станет загружаться.

ad0s1-1 — разбиваем диск на разделы как нам надо

Внимание!  эти параметры необходимы если хотите, чтобы sysinstall сам разбивал диск как вам нужно. При этом важно знать какой это диск(IDE, SATA и пр.) и указать это в параметре disk(например, ad0 если диск IDE или SATA, da0 если SCSI и т.д.). И параметр ad0s1, естественно нужно заменить на, например если диск SCSI, da0s1.

Если хотите вручную разбивать диск, закомментируйте всё от строки

disk=ad0

до строки

diskLabelEditor (идущей после # Let’s do it!)

и раскомментируйте все строки от

#partition=exclusive

до

#diskLabelEditor (идущей после #diskPartitionEditor)

Тогда во время установки sysinstall предложить разбить диск самим и после продолжит автоустановку.

installCommit — записываем все изменения на диск

package и packageAdd — указываем какие пакеты доустановить (все необходимые пакеты должны находится в папке packages/All)

Более подробное описание параметров этого файла можно посмотреть в man sysinstall.

Для того чтобы внедрить install.cfg в дистрибутив, чтобы он автоматически скармливался инсталлеру, нужно запихать его в файл mfsroot.gz лежащий в папке $WORKDIR/boot. Для этого проделаем следующее.

Распаковываем файл:

# gunzip $WORKDIR/boot/mfsroot.gz

Появится файл mfsroot, который есть образ диска, поэтому его можно легко смонтировать. Монтировать его будем как md (memory disk) на устройство с номером 0. Но возможно, что у вас на md0 уже есть смонтированные образы, поэтому для начала проверим какие номера устройств уже заняты:

# mdconfig -l

Команда может ничено не показать — значит у вас все md свободны и можно использовать md0. Если команда показала, например, md0 md1, значит у вас эти устройства заняты и тогда нужно использовать свободные, например md2. Тогда  в нижеприведенных командах используйте вместо -u 0 и md0, -u 2 и md2.

Ассоциируем метаустройство с файлом и смонтируем:

# mdconfig -a -t vnode -f $WORKDIR/boot/mfsroot -u 0
# mount /dev/md0 /mnt

Копируем в него файл install.cfg:

# cp $TEMP/install.cfg /mnt

Размонтируем:

# umount /mnt
# mdconfig -d -u 0

и запакуем обратно:

# gzip $WORKDIR/boot/mfsroot

Все пакеты, которые должны быть установлены инсталлером автоматически, то есть те, которые указаны в конце файла install.cfg, должны быть скопированы в $WORKDIR/packages/All. Важно не забыть добавить строки описывающие эти пакеты в файл $WORKDIR/packages/INDEX.

Это должна быть строка вида:

package_name-1.0||/|Package Description||youremail@your.domain||||

Внимание! В версиях FreeBSD 6.x формат строки выглядит так

package_name-1.0||/|Package Description||youremail@your.domain||||1

где 1 — номер диска, на котором находится пакет. Ставьте номер 1 если используете один диск, если не укажите никакого номера sysinstall попросит вас поставить диск 0 Smilie: :lol:  

Внимание! Главное в файле INDEX это правильное описание пакета, иначе sysinstall его не найдет. Если пакет имеет зависимости, описание и пр. это должно быть указано в файле INDEX.

Примечание: для создания строк описания необходимых мне пакетов я ставил их на готовую систему обычным pkg_add и после выдирал описание из сформировавшегося INDEX. Он лежит в /usr/ports и имеет название INDEX-x, где х — версия FreeBSD.

Теперь рассмотрим такой замечательный механизм как пользовательский постинсталляционный пакет.

В моем файле install.cfg он упоминался, как mypkg.

Основная идея состоит в том, чтобы этот пакет устанавливал и настраивал все, что мы захотим после инсталляции системы и пакетов приложений. Это могут быть системные файлы такие как rc.conf, master.passwd, подготовленные конфигурационные файлы установленных приложений. Кроме того при своей установке этот пакадж может выполнить системные комманды посредством применения преинсталляционного и постинсталляционного шелл-скриптов.

Функциональность этого механизма ограничена только вашей фантазией и перечнем задач.

Для облегчения и автоматизации процесса генерации пакета создадим в папке $TEMP скрипт pkgmaker.sh. Вот его содержимое:


#!/bin/sh
# src/freebsd/pxe/doc/pkgmaker.sh, 2008/10/30 MadLord
# $FreeBSD: doc/en_US.ISO8859-1/articles/pxe/pkgmaker.sh
PKGNAME=${1}
PKGDIR=`pwd`/${PKGNAME}/
pkg_create -i ${PKGDIR}pre -I ${PKGDIR}post -f ${PKGDIR}PLIST -s ${PKGDIR} -p / -d ${PKGDIR}DESCR -c ${PKGDIR}COMMENT ${PKGNAME}.tgz

Для более глубокого понимания сути процесса рекомендуется вдумчивое прочтение соответствующей страницы мануала (pkg_create(1)).

Для того, чтобы можно было его запустить, необходимо дать право на его запуск. Для этого вводим:

# chmod +x $TEMP/pkgmaker.sh

В папке $TEMP создадим директорию для файлов пакета:

# mkdir $TEMP/mypkg

Создаем там набор служебных файлов:

# cd $TEMP/mypkg
# touch COMMENT
# touch DESCR
# touch PLIST
# touch post
# touch pre

Проверяем содержимое папки mypkg:

# ls $TEMP/mypkg

COMMENT DESCR PLIST post pre

Названия COMMENT и DESCR говорят сам за себя — это файлы, которые содержат краткое и полное описание пакета. Заполняем их по своему усмотрению или не заполняем вовсе. В файл PLIST вносим список файлов которые должны устанавливаться в системе при установке пакета(пути указываем относительно папки $TEMP/mypkg):

цитата:
etc/rc.conf
etc/master.passwd

Создаем в директории пакета копию дерева файловой системы содержащей файлы, которые будут устанавливаться и копируем туда эти файлы:

# mkdir $TEMP/mypkg/etc

# cp /etc/rc.conf $TEMP/mypkg/etc
# cp /etc/master.passwd $TEMP/mypkg/etc

Проверяем содержимое папки $TEMP/mypkg/etc:

# ls $TEMP/mypkg/etc

master.passwd rc.conf

Ну а файлы post и pre делаем исполняемыми (chmod +x) и вносим туда сценарии, которые должны быть выполнены до и после установки пакета, например в файл post пишем:

цитата:
/sbin/reboot

т.е. после установки данного пакета система перезагрузится.

Пути указываем полностью(хотя может это и не обязательно, не проверял) и относительно устанавливаемой ОС. Если не знаете полный путь, можно узнать его введя команду(например, для команды reboot):

# which reboot

Теперь находясь в папке $TEMP запускаем скрипт pkgmaker.sh, с аргументом, соответствующим имени директории пакета(в нашем случае это mypkg):

# cd $TEMP
# ./pkgmaker.sh mypkg

В папке $TEMP получаем пакет mypkg.tgz

Поступаем с ним также, как со всеми другими пакетами, т.е. ложим в $WORKDIR/packages/All и описываем в файле INDEX. Пример описания выглядит так (если вы не заполняли файлы COMMENT и DESCR):

mypkg||/||||||||||

Теперь наш дистрибутив готов. Осталось записать его на болванку. Для этого я создавал исошник, который потом заливал на болванку. Исошник я создавал следующей командой:

цитата:
mkisofs -b boot/cdboot -c boot.catalog -no-emul-boot -d -N -D -J -R -T -V «myiso» -P «madlord» -o myfree.iso полный_путь_до_папки_mybootcd

пути до файлов cdboot и boot.catalog указываются относительно папки mybootcd.

Примечание: если система заругается мол нет такой команды mkisofs, значит у вас не установлен пакет cdrtools.

В итоге получаем исошник myfree.iso, который пишем на болванку и пробуем ставить с него систему. Установка происходит до первой перезагрузки. После перезагрузки выньте диск, иначе система загрузиться с него и опять начнет устанавливаться  Smilie: :lol:
Примечание: я не стал писать болванку под никсами, т.к. машинка с никсами стоит в серверной и бегать туда не особо хотелось, поэтому я просто сливал себе исошник и писал болванку спомощью Nero.

Делаем альтернативный загрузчик CD.

Теперь опишу как можно сделать красивый загрузчик для вашего диска. Ведь если использовать стандартный загрузчик из дистрибутива, то придеться каждый раз при перезагрузке не забывать вынимать диск.

Для этого используем загрузчик Syslinux.

Качаем дистрибутив syslinux и распаковываем в нашу папку $TEMP, создав там для этого папку, например, syslinux. У меня была версия syslinux 3.72.

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

isolinux.bin и ldlinux.sys — лежат в syslinux/core

vesamenu.c32 — лежит в syslinux/com32/menu

а также любая картинка в разрешении 640х480 формата *.jpg. Назовем её boot.jpg.

Копируем эти 4 файла в корень нашей папки $WORKDIR. Теперь нужно создать в папке $TEMP файл isolinux.cfg, который будет содержать настройки нашего загрузочного меню. Вот пример моего файла:

цитата:
DEFAULT vesamenu.c32
TIMEOUT 100
PROMPT 0
MENU TITLE My SUPER PUPER CD
MENU BACKGROUND boot.jpg
LABEL hdd
MENU LABEL Boot from hard drive
LOCALBOOT 0x80
LABEL free
MENU LABEL Install FreeBSD 7.0 Release
BOOT boot/cdboot

Опишу часть параметров:

TIMEOUT — время ожидания выбора пункта меню, после которого система загрузиться с дефолтного пункта(по-умолчанию это самый первый пункт) в 1/10 сек

PROMPT — выводить(1) или нет(0) стандартный промпт. При использовании vesamenu должен быть установлен в 0.

MENU LABEL — текст пункта меню. Этот параметр обязательно должен идти после LABEL. А в LABEL можете писать все что угодно.

Копируем isolinux.cfg  в корень папки $WORKDIR. Все готово, осталось создать исошник. Делаем это следующей командой:

цитата:
mkisofs -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -d -N -D -J -R -T -V «AutoInstall» -P «madlord» -o autoinstall.iso полный_путь_до_папки_mybootcd

Примечание: файл boot.catalog из папки $WORKDIR можете удалить. А файл boot.cat создастся сам.

Готово! Пишем исошник на болванку и смотрим свой загрузчик.

Опубликовано из WordPress для Android

Рубрики: Программирование (Programming)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

 

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.