вторник, 3 апреля 2012 г.

Бездисковые станции - примеры реализации для PXE

В handbook'е FreeBSD настройку бездисковой станции относят к сложным вопросам работы в сети. Я не считаю это сложным делом, но видимо из-за разрозненной информации в сети это считается таковым. Здесь я рассмотрю три примера реализации бездисковой станции. В качестве примера на базе своего LiveCD я собрал образ системного раздела для клиентской машины. По составу включенных пакетов это что-то вроде консольной версии Recovery LiveCD. Также я собрал собрал ядро Linux-3.3 на конфиге ядра slackware-generic с всеми необходимыми опциями для работы бездисковой станции. Архив можно скачать здесь.

В качестве сервера для бездисковой станции сгодится компьютер с установленным дистрибутивом Slackware GNU/Linux или LiveCD Recovery-версии, где есть все необходимое.

Cсылки по теме:
PXELINUX
Введение в сетевую загрузку и протокол Etherboot
Введение в загрузку по сети и Etherboot
Использование сетевых адаптеров PXE
bootptab
Введениe
Во-первых, сетевая карта клиентского компьютера должна поддерживать загрузку по сети, для этого она должна иметь свой BIOS. Со времен этак Pentium 4 материнские платы изготавливаются со встроенными сетевушками BIOS которых интегрирован в общий BIOS материнки, и возможность сетевой загрузки можно включить через меню BIOS'а компьютера. Это как правило PXE загрузчик(других лично я не встречал). С внешними сетевыми картами не все так просто. Сетевушки с PXE стоят дороже, преимущества использования для большинства не очевидна, следовательно покупают их мало и магазины возят тоже редко.
Кроме PXE как бы есть (или был?) стандарт сетевой загрузки NetBoot, единственную карточку c NetBoot которая побывала у меня в руках была клон NE2000 для ISA шины(там на ПППЗУ еще было окошко для УФ). Если верить википедии NetBoot до сих под живет в макинтошах.
В дальнейшем предполагаем что у нас компьютер с загрузчиком PXE.

Чтобы клиентская система могла загружаться загружаться по сети, её ядро должно быть собрано со специальными опциями:
1. Автоматическая настройка сети по протоколам BOOTP и/или DHCP (IP: kernel level autoconfiguration)

2. Возможность быть клиентом NFS (NFS client support)
3. Возможность иметь NFS в качестве системного раздела (Root file system on NFS)

4. Кроме того драйвер вашей сетевой карты должен быть собран монолитно или включен в init-ram диск если таковой используется.

Для тестирования я собрал ядро Linux-3.3 с указанными опциями, а так же монолитно собрал драйвера для всех сетевых карт, чтобы ядро гарантировано работало на всех компьютерах.

Используем сервер как загрузочную флешку
Обычно при описании настройки бездисковой станции используют DHCP демон. Я буду использовать BOOTP потому что это проще, а значит понятнее.
Нам понадобятся tftpd и boopd демоны. В файле /etc/inetd.conf раскоментируйте строки:
#tftp dgram udp wait root /usr/sbin/in.tftpd in.tftpd -s /tftpboot -r blksize
#bootps dgram udp wait root /usr/sbin/bootpd bootpd

обратите внимание на параметр -s /tftpboot в первой строке. Это рабочий каталог для tftpd демона, он же будет корневым для его клиента, т. е. это аналог chroot в vsftpd демоне. создайте указанный каталог и задайте права на него:
# mkdir /tftpboot
# chmod 777 /tftpboot

распакуйте содержимое архива в /tftpboot. Нас интересуют файлы linux32 - это ядро клиента, base.sfs - это системный каталог каталог клиента сжатый в squashfs архив, initrd.cgz - это тот же самый системный раздел, но сжатый в CPIO/GZIP архив.
Нужно сразу оговориться, что клиент настроен на статичный IP адрес 192.168.1.11 для себя и на то что его сервером будет машина с адресом 192.168.1.3.
Файл slavanka-diskless.sh это скрипт который этот системный собрал. Это слегка модифицированный финальный скрипт 2.1

По протоколу PXE можно загрузить только 32кБайта, поэтому сначала передается загрузчик который соединяется с tftp сервером и через него клиент получает уже все остальное. Скопируйте pxe-загрузчик в рабочий каталог tftpboot демона, он входит в состав пакета syslinux:
# cp -v /usr/share/syslinux/pxelinux.0 /tftpboot/

в конфиг-файл /etc/bootptab добавте строку типа:
diskless.net:ha=00241d866018:ip=192.168.1.11:gw=192.168.1.1:sm=255.255.255.0:bf=/pxelinux.0

где: 00241d866018 - MAC-адрес сетевой карты клиента, 192.168.1.11 - присваиваемый клиенту IP, gw=192.168.1.1 и sm=255.255.255.0 - шлюз и маска сети. Обратите внимание на путь к загрузчику bf=/pxelinux.0. Для сервера он выглядит как /tftpboot/pxelinux.0, но для клиента каталог /tftpboot будет корнем.

теперь можно перезапустить супер-демон:
/etc/rc.d/rc.inetd restart

осталось написать конфиг загрузчика. Создайте каталог:
# mkdir /ftptboot/pxelinux.cfg

далее читаем
First, it will search for the config file using the hardware type (using its ARP type code) and address, all in lower case hexadecimal with dash separators; for example, for an Ethernet (ARP type 1) with address 88:99:AA:BB:CC:DD it would search for the filename 01-88-99-aa-bb-cc-dd.
т.е. если МАС моего клиента 00:24:1d:86:60:18 то pxe-конфиг для для него должен лежать в файле
/tftpboot/pxelinux.cfg/01-00-24-1d-86-60-18

открываем файл с конфигом для вашего клиента и вписываем туда простейшую конфигурацию:
label linux
kernel linux32
append ro ip=bootp root=/dev/ram0 initrd=initrd.cgz vga=0

т. е. мы указываем загрузчику путь к ядру и init-ram диску, по tftp это загружается на клиент после чего запускается. т. к. init-ram диск это и е есть системный раздел клиента, то больше для работы ему ничего не нужно.

По ssh заходим на клиент(пароль root: slavanka, логин пользователя: slacker, пароль: пользователя: slavanka, адрес 192.168.1.11), смотрим как дела:


Использование nfs и initramfs
Использование init-ram диска позволяет использовать модули сетевых карт для инициализации сетевого интерфейса на уровне ядра Linux, смонтировать nfs-диск чтобы получить с него нужные файлы или использовать его как системный раздел. Я взял initrd от Recovery livecd и в init строку:
mount /dev/sr0 /mnt
заменил на:
mount 192.168.1.3:/tftpboot /mnt -t nfs -o nolock

в результате чего могу использовать nfs сервер как носитель файлов livecd. На этом этапе сетевой диск смонтированый на /mnt легко можно сделать корневым разделом для загружаемой системы.

На сервере в файл /etc/exports добавте строку:
/tftpboot 192.168.1.11(ro)

теперь запустите nfs - сервер
# sh /etc/rc.d/rc.rpc start
# sh /etc/rc.d/rc.nfsd start

в конфиге pxe загрузчика строку:
append ro ip=bootp root=/dev/ram0 initrd=initrd.cgz vga=0

замените на:
append ro ip=bootp root=/dev/ram0 initrd=rootfs.cgz vga=0

т. е. это тоже получится livecd с загрузкой по сети, но уже на AUFS

загружаем и проверяем как дела:


Использование системного раздела на NFS без initramfs
Теперь отбросим в сторону livecd и настроим классическую загрузку c NFS в качестве системнго раздела.
Распакуем архив системного раздела:
# unsquashfs -d /tftpboot/pxeboot /tftpboot/base.sfs

в конфиг файле nfs-сервера /etc/exports, строку:
/tftpboot 192.168.1.11(ro)

замените на:
/tftpboot/pxeboot 192.168.1.11(rw,no_root_squash)

после чего перезапустите nfs - сервер:
# sh /etc/rc.d/rc.nfsd restart

теперь в таблицу файловых систем клиента /tftpboot/pxeboot/etc/fstab добавте строку:
192.168.1.3:/tftpboot/pxeboot / nfs default 1 1

, а в конфиге pxe-загрузчика строку с предыдущим конфигом:
append ro ip=bootp root=/dev/ram0 initrd=rootfs.cgz vga=0

замените на:
append rw ip=bootp root=/dev/nfs nfsroot=192.168.1.3:/tftpboot/pxeboot,nolock vga=0

запускаем компьютер клиента и снова заходим по ssh:


Вот и все сложности.

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

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