Использование бездисковых рабочих станций


Мини-руководство "шаг за шагом"

В статье рассказано, как настроить бездисковую рабочую станцию для загрузки по сети с помощью сетевого адаптера, поддерживающего технологию Preboot Execution Environment (PXE). PXE широко поддерживается производителями сетевых карт (Intel, 3Com и т.д.), материнских плат, а также программ эмуляции, таких как VMWare. Файловые системы и swap размещаются на сервере и предоставляются клиенту через NFS.

Сначала необходимо создать файловую систему для клиента. Проще всего это сделать, распаковав сеты на существующую файловую систему (в данном случае base38.tgz и etc38.tgz, остальные сеты распаковываются по мере надобности).

# mkdir -p /home/diskless/root
# tar xzpf base38.tgz -C /home/diskless/root
# tar xzpf etc38.tgz -C /home/diskless/root

Также необходимо создать файл подкачки. На клиентской машине экспортированный swap файл монтируется к пустой директории /home/diskless/root/swap, которая после монтирования станет файлом. Суть операции в том, чтобы swap файл получил inode на файловой системе и swapctl(8) смог его подключить. Создадим файл и директорию:

# mkdir /home/diskless/root/swap
# dd if=/dev/zero of=/home/diskless/swap bs=1m count=128
# chmod 600 /home/diskless/swap

Создадим стандартные устройства:

# cd /home/diskless/root/dev && ./MAKEDEV all

Для того чтобы собрать ядро для бездисковой станции, необходимо установить исходные коды из файла sys.tar.gz. Создадим новый файл конфигурации ядра на основе ядра GENERIC:

# cd /sys/arch/i386/conf
# cp GENERIC DISKLESS

Теперь необходимо отредактировать файл DISKLESS и заменить в нем строку:

config		bsd	swap generic

на

config		bsd	root on nfs swap on nfs

Соберем ядро, но пока не будем его никуда инсталлировать:

# config DISKLESS
# cd ../compile/DISKLESS
# make depend && make

Далее необходимо настроить сервер так, чтобы он мог предоставить клиенту сетевую информацию и файловые системы. PXE содержит в себе DHCP-клиент, который позволяет получить сетевую информацию, а также имя файла, который необходимо загрузить встроенным TFTP клиентом для продолжения загрузки. Это копия файла /usr/mdec/pxeboot. После загрузки этого файла в память на него передается управление, а он в свою очередь представляет собой модифицированную версию загрузчика boot(8), способного обрабатывать те же команды, а также поддерживающего загрузку ядра по TFTP. В данном случае управляющий файл boot.conf(5) располагается на сервере.

Выполним конфигурацию DHCP и TFTP сервисов. Для настройки необходимо знать MAC-адрес сетевой карты клиента. Для примера будем считать, что это 00:02:b3:5c:1e:81. IP адрес сервера 10.0.1.1, клиента: 10.0.1.2. Бездисковый клиент назовем netboot.

Настроим DHCP сервис:

# vi /etc/dhcpd.conf
shared-network LOCAL-NET {
	option domain-name "example.com";
	option domain-name-servers 10.1.1.1;
	option routers 10.0.1.1;

	subnet 10.0.1.0 netmask 255.255.255.0 {
		range 10.0.1.32 10.0.1.127;
	}
}

host netboot {
	hardware ethernet 00:02:b3:5c:1e:81;
	filename "pxeboot";
	fixed-address 10.0.1.2;
}

Запустим dhcpd на требуемом интерфейсе (для примера взят xl0):

# dhcpd xl0

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

# echo 'dhcpd_flags=""' >>/etc/rc.conf.local
# echo 'xl0' >>/etc/dhcpd.interfaces

Настроим TFTP сервис. TFTP запускается через inetd, поэтому необходимо раскомментировать строку:

tftp dgram udp wait root /usr/libexec/tftpd tftpd -s /tftpboot

и перезагрузить конфигурацию inetd:

# kill -HUP `head -1 /var/run/inetd.pid`

Создадим директорию /tftpboot и скопируем в нее необходимые файлы (загрузочный код pxeboot и файл ядра bsd для бездисковой станции):

# mkdir /tftpboot
# cp /sys/arch/i386/compile/DISKLESS/bsd /tftpboot/
# cp /usr/mdec/pxeboot /tftpboot/

Если вы не планируете производить установку OpenBSD по сети (boot tftp:bsd.rd), при каждой загрузке можно пропускать пятисекундную задержку и загружать ядро немедленно:

# mkdir /tftpboot/etc
# echo 'boot tftp:bsd' >/tftpboot/etc/boot.conf

Теперь разберемся с монтированием файловых систем по NFS. Для того чтобы получить параметры об экспортированных на сервере файловых системах, клиентское ядро посылает специальный BOOTPARAM запрос (перед этим система должна узнать определенное ей имя - это выполняется в ходе Reverse ARP запроса, который отрабатывается сервисом rarpd(8)). На запрос BOOTPARAM отвечает сервис rpc.bootparamd(8).

Перейдем к их настройке. Сервис rarpd работает с двумя файлами: /etc/ethers, в котором хранится соответствие MAC-адресов и символьных имен, а также /etc/hosts, с помощью которого по известному имени можно получить IP-адрес.

# echo '00:02:b3:5c:1e:81 netboot' >>/etc/ethers
# echo '10.0.1.2 netboot' >>/etc/hosts

Запустим rarpd и настроим автоматическую загрузку при старте системы:

# rarpd xl0
# echo 'rarpd_flags="xl0"' >>/etc/rc.conf.local

Сервис rpc.bootparamd настраивается через конфигурационный файл /etc/bootparams:

# vi /etc/bootparams
netboot root=10.0.1.1:/home/diskless/root \
	swap=10.0.1.1:/home/diskless/swap \
	dump=10.0.1.1:/home/diskless/swap

Настроим автоматический запуск rpc.bootparamd и запустим его (portmap должен быть также запущен, поскольку именно он реализует маппинг TCP или UDP портов на номера RPC программ):

# portmap
# rpc.bootparamd
# echo 'bootparamd_flags=""' >>/etc/rc.conf.local

Запись root=10.0.1.1:/home/diskless/root отражает соответствующие настройки на NFS сервере. Итак, получив ответ на BOOTPARAM запрос, ядро связывается с NFS сервером и пытается примонтировать корневую файловую систему и свап. После загрузки ядра скрипт rc(8), основываясь на содержимом fstab(5), сделает перемонтирование корневой файловой системы в режиме записи и подмонтирует недостающие.

Выполним конфигурацию NFS сервера (предполагается, что NFS сервер выключен). Добавьте записи об экспортируемых файловых системах в /etc/exports:

# vi /etc/exports
/home/diskless/root -maproot=root -alldirs 10.0.1.2
/home/diskless/swap -maproot=root 10.0.1.2

Запустим компоненты:

# touch /var/db/mountdtab
# mountd
# nfsd -tun 4

И настроим автоматический запуск:

# echo 'portmap=YES' >>/etc/rc.conf.local
# echo 'nfs_server=YES' >>/etc/rc.conf.local

Теперь сделаем ряд настроек клиентской машины. Отредактируем /etc/fstab:

# vi /home/diskless/root/etc/fstab
10.0.1.1:/home/diskless/root /    nfs  rw                0 0
10.0.1.1:/home/diskless/swap none swap sw,nfsmntpt=/swap 0 0

Также следует указать имя клиентского хоста, IP-адреса шлюза и DNS-сервера:

# echo 'netboot' >/home/diskless/root/etc/myname
# echo '10.0.1.1' >/home/diskless/root/etc/mygate
# echo 'nameserver 10.0.1.1' >/home/diskless/root/etc/resolv.conf

Примечание. При получении бездисковой станции сетевых настроек с помощью DHCP, в связи с особенностями стартового сценария /etc/netstart, в hostname.if(5) необходимо указать запуск dhclient(8), а не использовать ключевое слово "dhcp". Кроме того, файл /home/diskless/root/etc/mygate можно не создавать.

# vi /home/diskless/root/etc/hostname.xl0
!/sbin/dhclient -q \$if

Установим временную зону для клиентской системы. Для примера возьмем московское летнее время (UTC+003). Смещение в этом случае составляет -180 минут. Установим эти значения:

# cd /home/diskless/root/etc
# ln -fs /usr/share/zoneinfo/Europe/Moscow localtime
# config -ef /tftpboot/bsd
OpenBSD 3.8-stable (DISKLESS) #0: Tue Jan 24 11:52:24 MSK 2006
    root@ultra.crypt.org.ru:/sys/arch/i386/compile/DISKLESS
Enter 'help' for information
ukc> timezone
timezone = 0, dst = 0
ukc> timezone -180
timezone = -180, dst = 0
ukc> quit
Saving modified kernel.

На этом настройка завершена. Теперь можно запустить бездисковый клиент.


OpenBSD.ru www@openbsd.ru
$RuOBSD: diskless.html,v 1.24 2010/11/01 10:57:48 dinar Exp $