Настройка PXE в FreeBSD. Установка FreeBSD по PXE.

PXE (Preboot Execution Environment) - среда для загрузки компьютеров с помощью сетевой карты без использования жёстких дисков, компакт-дисков и других устройств, применяемых при загрузке операционной системы. Для организации загрузки системы в PXE используются протоколы IP, UDP, DHCP и TFTP. PXE-код, прописанный в сетевой карте, получает загрузчик из сети, после чего передаёт ему управление.

Рассмотрим краткое руководство по настройке сервера PXE для системы FreeBSD, а также покажу как можно простенько запилить автоматическую установку сервера с необходимыми пакетами (для конкретного проекта).

1. Настройка сервера
Для начала нужно установить сервер DHCP.
После установки DHCP пишем конфигурационный файл (обычно /usr/local/etc/dhcpd.conf).
Выдержка из файла:

...
shared-network pxe {
        subnet 10.15.1.64 netmask 255.255.255.224 {
                pool {
                    deny dynamic bootp clients;
                    range 10.15.1.69 10.15.1.94;
                    option routers 10.15.1.65;
                    option domain-name-servers 10.14.1.14;
                    deny unknown-clients;
                    default-lease-time 120;
                    max-lease-time 120;
                    next-server 10.15.1.68;

            # FreeBSD 10 amd64 auto install
            group {
                filename "freebsd/10.1-amd64-RELEASE/livefs/boot/pxeboot";
                option root-path "/usr/home/storage/releases/cdrom-amd64/freebsd/FreeBSD-10.2-RELEASE-amd64/";

            host test.local {
                        hardware ethernet 00:16:3e:3b:bd:69; fixed-address 10.15.1.69;
                        next-server 10.15.1.68;
                        }

            

...

Параметр next-server определяет сервер TFTP или NFS, используемый для получения загрузчика или файла ядра (по умолчанию используется тот же самый хост, на котором расположен сервер DHCP).  

Параметр filename определяет файл, который PXE будет загружать для следующего шага выполнения (этот файл pxeboot, его мы качаем с образом livefs FreeBSD. Если нет такого ISO, то скорее всего pxeboot есть в диске DVD1 образа FreeBSD). Он должен быть указан в соответствии с используемым методом передачи. PXE использует TFTP, поэтому здесь применяются относительные пути файлов. Кроме того, PXE загружает pxeboot, а не ядро. 

Параметр root-path определяет путь к корневой файловой системе, обычно используют NFS (для этого распаковываем первый диск disk1. И на сколько помню я менял только файл /etc/fstab - отсюда убирал монтирование cd-rom, т.к. мы будем монтировать базовую систему по NFS).

Если вы используете PXE, настроенный для использования TFTP, то нужно включить tftpd на файловом сервере:
Создаем каталог, файлы которого будет обслуживать tftpd.
Прописываем в /etc/inetd.conf:
tftp dgram udp wait root /usr/libexec/tftpd tftpd -vv -u nobody -s /usr/home/storage/releases/cdrom-amd64/

Бывает, что некоторым версиям PXE требуется TCP-вариант TFTP. В таком случае добавьте вторую строчку, заменяющую dgram udp на stream tcp.
Перезапускаем inetd, чтобы он перечитал свой конфигурационный файл. Не забываем в /etc/rc.conf внести inetd_enable="YES".
# /etc/rc.d/inetd restart
Вы можете поместить каталог tftpboot в любом месте на сервере, как указано в inetd.conf и в dhcpd.conf.

Также нужно включить NFS и экспортировать соответствующую файловую систему на сервере NFS.
Добавьте следующее в /etc/rc.conf:
nfs_server_enable="YES"
Экспортируйте файловую систему, в которой расположен корневой каталог системы, добавив следующую строку в /etc/exports :
/usr/home/storage/releases -alldirs -maproot=0:0 -ro -network 127.0.0.0 -mask 255.0.0.0
/usr/home/storage/releases -alldirs -maproot=0:0 -ro -network 10.15.1.64 -mask 255.255.255.224

Попросим mountd перечитать файл настроек. Однако если это первый шаг настройки NFS, то нужно будет выполнить перезагрузку сервера.
# /etc/rc.d/mountd restart

Готово! Теперь у нас есть PXE сервер.

2. Установка FreeBSD 10 через PXE.

Итак, у нас есть тестовый хост, назовем test.local.
Для того, чтобы система поставилась на сервер без участия админа, или же с минимальным его участием, воспользуемся механизмом запуска пользовательских программ в FreeBSD, файлом rc.local.
# cat /usr/home/storage/releases/cdrom-amd64/freebsd/FreeBSD-10.2-RELEASE-amd64/etc/rc.local

#!/bin/sh -x
#include config file
HOSTNAME=`hostname`
. /etc/setup/$HOSTNAME/setup.conf

cat > $MNTDIR/etc/pkg/FreeBSD.conf << EOF
FreeBSD: {
url: "$PKGSITE",
mirror_type: "srv",
enabled: yes
}
EOF

cat > $MNTDIR/etc/rc.conf << EOF
hostname="$HOSTNAME"
EOF

ln -s /usr/local/bin/bash $MNTDIR/bin/bash

chroot $MNTDIR /bin/sh -c "ASSUME_ALWAYS_YES=yes pkg install $INSTALL" 

/etc/setup/$HOSTNAME/setup.conf - относительный путь, где лежат скрипты.

# cat setup/rns1-2.khor.nic.ru/setup.conf 

#!/bin/sh -x

################
PXE='10.15.1.68:/home/storage/releases/cdrom-amd64/freebsd/FreeBSD-10.2-RELEASE-amd64/'


MNTDIR=/tmp/mntroot

gpart destroy -F /dev/da0
gpart create -s gpt /dev/da0
gpart add -s 222 -a 4k -t freebsd-boot -l boot0 /dev/da0
gpart add -s 4g -a 4k -t freebsd-swap -l swap0 /dev/da0
gpart add -a 4k -t freebsd-ufs -l disk0 /dev/da0
newfs /dev/gpt/disk0
gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 /dev/da0
mkdir $MNTDIR
mount /dev/da0p3 $MNTDIR
mount $PXE /mnt

tar -xvzf /mnt/usr/freebsd-dist/base.txz -C $MNTDIR
tar -xvzf /mnt/usr/freebsd-dist/kernel.txz -C $MNTDIR
tar -xvzf /mnt/usr/freebsd-dist/doc.txz -C $MNTDIR

cat > $MNTDIR/etc/fstab << EOF
# Device Mountpoint FStype Options Dump Pass#
/dev/da0p3 / ufs rw 1 1
/dev/da0p2 none swap sw 0 0
EOF

PKGSITE='pkg+http://tinderbox-ng.infra.local/packages/corp-resolvers-bind998'

cat > $MNTDIR/etc/resolv.conf << EOF
search nic.ru hostcomm.ru

nameserver 10.0.0.100
nameserver 10.1.1.100

EOF

INSTALL=project-rc-bind
#######################

Где PKGSITE - репозиторий, создание которого рассмотрено в статье "собственный репозиторий FreeBSD pkgng"; опцией INSTALL - инсталлируем метапакет, который притянет нужные пакеты.

Выставляем грузиться серверу по PXE.

Пытаемся заинсталлить тачку.

Обновлено 05.04.2016 13:42

unix-way