Ключевые слова:pxe, boot, linux, diskless, dhcp, tftp, (найти похожие документы)
From: Сергей Черепенин, Игорь Чубин <http://xgu.ru>
Date: Mon, 27 Apr 2008 17:02:14 +0000 (UTC)
Subject: Загрузка бездисковых Linux-станций с помощью PXE
Оригинал: http://xgu.ru/wiki/PXE
На данной странице детально описывается процесс загрузки бездисковых
Linux-станций с помощью PXE, а также рассказывается как с помощью
программ проекта LTSP подгототвить Linux-систему для использования в
качестве сервера загрузки таких станций. Рассматривается процесс
настройки всех необходимых компонентов (TFTP,DHCP,NFS-серверов),а
также приводятся примеры их конфигурационных файлов.
Что такое PXE?
PXE (Preboot Execution Environment) -- среда для загрузки компьютеров
с помощью сетевой карты без использования жёстких дисков,
компакт-дисков и других устройств, применяемых при загрузке
операционной системы. Для организации загрузки системы в PXE
используются протоколы IP, UDP, DHCP и TFTP. PXE-код, прописанный в
сетевой карте, получает загрузчик из сети, после чего передаёт ему
управление.
Загрузка Linux-системы с использованием PXE
Загрузку Linux системы с помощью PXE можно выполнить с помощью
загрузчика PXELINUX, созданного на базе SYSLINUX. PXELINUX
загружается с помощью PXE-кода в сетевой карте, а затем ему передаётся
управление. Код PXELINUX не нужно прописывать в чип на сетевой карте
(если нужно именно это, см. проект etherboot).
* pxe - Загрузка PXE-загрузчика. Прошивкой PXE, встроенной в сетевую
карту, выполняется загрузка загрузчика pxelinux.
* dhcp1 - Получение IP-адреса и адреса TFTP-сервера. Загрузчик
pxelinux делает DHCP-запрос и с его помощью получает IP-адрес и
адрес TFTP-сервера. По умолчанию адрес TFTP-сервера равен адресу
DHCP-сервера.
* tftp - Обращение к TFTP-серверу для получения ядра Linux.
Загрузчик pxelinux обращается к TFTP-серверу и запрашивает у него
ядро Linux (и, при необходимости, образ initrd).
* kernel - Запуск ядра Linux. После того как ядро Linux загружено,
управление передаётся ему.
* dhcp2 - Получение IP-адреса DHCP. Ядро Linux делает запрос DHCP, с
помощью которого получает свой IP-адрес, адрес NFS-сервера, на
котором находится корневая файловая система, а также путь к
местоположению этой файловой системы на диске.
* nfs - Монтирование корневой файловой системы. Корневая файловая
система монтируется.
* init - Вызов процесса init. На корневой файловой системе находится
файл /sbin/init, которому передаётся управление.
Предварительные данные
Сетевые настройки
Сетевые интерфейсы настраиваются автоматически согласно файлу
/etc/network/interfaces:
%# cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
auto lo eth0 eth1
# The loopback network interface
iface lo inet loopback
# The primary network interface
iface eth0 inet static
address 10.0.35.7
netmask 255.0.0.0
network 10.0.0.0
gateway 10.0.35.1
dns-nameservers 10.0.35.1
dns-search unix.nt
pre-up iptables -t nat -A POSTROUTING -s 192.168.15.0/24 -j MASQUERADE
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
# The secondary network interface
iface eth1 inet static
address 192.168.15.180
netmask 255.255.255.0
network 192.168.15.0
post-up ifconfig eth1:1 192.168.1.254
Интерфейс eth0 подлючен к сети 10.0.0.0/8 и через него осуществляется
выход в интернет.
Интерфейс eth1 подключен к сети 192.168.15.0/24, в которую
подключаются тонкие клиенты.
Аллиас на интерфейсе eth1 eth1:1 необходим для соединения с
терминальным сервером Windows
Для осуществления возможности выхода в интернет всем студентам с
тонких клентов настраивается firewall в таблице nat цепочки
POSTROUTING (о чем говорит соответствующая строка в конфигурационном
файле настройки сетевых интерфейсов):
pre-up iptables -t nat -A POSTROUTING -s 192.168.15.0/24 -j MASQUERADE
Кроме настройки firewall необходимо включить forwarding. Иными
словами, необходимо разрешить ядру операционной системы осущетсвлять
проброс трафика с одного интерфейса на другой. Это можно сделать
несколькими способами:
1. Строка в файле /etc/network/interfaces
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
2. Строка в файле /etc/sysctl.conf
net.ipv4.conf.default.forwarding=1
3. Команда
%# sysctl net.ipv4.conf.default.forwarding=1
Но этот способ включения forwarding действует до первой перезагрузки,
а для автоматического включения на этапе старта системы необходимо
использовать первый или второй методы.
Операционная система
%$ uname -a
Linux debian 2.6.16-2-486 #1 Sat Jul 15 21:23:01 UTC 2006 i686 GNU/Linux
Инсталляция DHCP-сервера
Установка DHCP-сервера:
%# apt-get install dhcp
.
.
.
NOTE: dhcpd's messages are being sent to syslog. Look there for
diagnostics messages.
Starting DHCP server: dhcpd failed to start - check syslog for diagnostics.
DHCP-сервер не заработал в базовой конфигурации - смотрим почему:
%# tail /var/log/daemon.log
Dec 25 17:27:56 debian rpc.statd[4128]: Version 1.0.10 Starting
Dec 25 17:33:43 debian dhcpd: No subnet declaration for eth0 (192.168.15.244).
Dec 25 17:33:43 debian dhcpd: Please write a subnet declaration in your dhcpd.c
onf file for the
Dec 25 17:33:43 debian dhcpd: network segment to which interface eth0 is attached.
Dec 25 17:33:43 debian dhcpd: exiting.
Анализ лог-файла /var/log/daemon.log говорит, что не описана сеть
192.168.15.0/24. Указанная сеть была определена автоматически, исходя
из адреса интерфейса, на котором DHCP-сервер прослушивает запросы. По
умолчанию этот интерфейс eth0. Конфигурационный файл dhcpd.conf не
содержит описания этой сети.
Ниже мы отредактируем этот файл и опишем в нём названную сеть.
Если бы было нужно чтобы DHCP-сервер работал на другом интерфейсе,
нужно отредактировать файл /etc/default/dhcp -- указать нужный
интерфейс:
%# vim /etc/default/dhcp
INTERFACES="eth1"
Сейчас этого делать не нужно.
Настройка DHCP-сервера
Далее можно приступать к непосредственной настройке DHCP-сервера:
%# vim /etc/dhcp.conf
option domain-name "unix.nt";
option domain-name-servers 192.168.15.254;
option subnet-mask 255.255.255.0;
server-name "ltsp0.unix.nt";
default-lease-time 600;
max-lease-time 7200;
subnet 192.168.15.0 netmask 255.255.255.0 {
range dynamic-bootp 192.168.15.200 192.168.15.220;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.15.255;
option root-path "192.168.15.244:/opt/ltsp/i386/";
option routers 192.168.15.254;
filename "pxelinux.0";
}
Конфигурационный файл практически ничем не отличается от файла по
умолчанию. Клиентам будут выделяться IP-адреса из диапазона
192.168.15.200-192.168.15.220, указанного в range dynamic-bootp. В
качестве DNS-сервера и шлюза используется хост 192.168.15.254.
Опции, имеющие непосредственно отношение к бездисковой загрузке:
* root-path
* filename
Запуск DHCP-сервера
Запуск DHCP-сервера:
# /etc/init.d/dhcp start
Инсталляция и настройка TFTP-сервера
Установите пакет tftpd-hpa (другие TFTP-серверы могут работать
некорректно):
%# apt-get install tftpd-hpa
Настройка TFTP-сервера
В момент завершения установки нам было сообщено о том, что tftp-сервер
по-умолчанию не работает в режиме демона, а будет запускаться через
интернет-суперсервер inetd. Проверим на наличие строки его
настройки в конфигурационном файле inetd:
%# grep tftp /etc/inetd.conf
tftp dgram udp wait root /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot
Перезапустим интернет суперсервер:
%# /etc/init.d/inetd restart
Restarting internet superserver: inetd.
И проверим выполняет ли интернет-суперсервер прослушивание порта 69
(порт TFTP):
%# netstat -lnp | grep :69
udp 0 0 0.0.0.0:69 0.0.0.0:* 7331/inetd
На этом настрока tftp-сервера завершена.
Настройка LTSP ( Linux Terminal Server Project)
Установка серверной части ltsp
Необходимо установить пакет ltsp-server. В качестве зависимостей от
этого компонента будет скачан установлен сервер NFS (при условии, что
он не был установлен ранее).
%# apt-get install ltsp-server
После установки нам рекомендовано добавить строку
/opt/ltsp *(ro,no_root_squash,async)
в файл экспортирования файловых систем /etc/exports.
Корневая файловая система, которую будут использовать клиенты,
находится в подкаталоге каталог /opt/ltsp. Она должна быть доступна
через NFS. Можно изменить файл /etc/exports сейчас, а можно позже. Мы
изменим позже.
Настройка шлюза
Если нужно чтобы бездисковые клиенты могли получить доступ в Интернет
через наш шлюз, необходимо настроить на этом шлюзе iptables и включить
forwarding-пакетов между интерфейсами.
Добавляем строки в /etc/network/interfaces
post-up iptables -t nat -A POSTROUTING -s 192.168.15.0/24 -j MASQUERADE
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
Создание клиентского образа ltsp
Образ создаётся с помощью скрипта ltsp-build-client. В качестве
аргументов скрипту необходимо указать:
* архитектуру, для которой выполняется сборка;
* дистрибутив, на базе которого будет построен образ;
* зеркало, с которого должны инсталлироваться пакеты системы.
В каталог, который будет для бездисковой станции корневым,
проинсталлируется дистрибутив etch. В качестве источника пакетов
указан локальный apt-proxy. Вместо него нужно указать соответствующее
зеркало.
%# ltsp-build-client --arch i386 --dist etch --mirror http://192.168.15.251:9999/debian
.
.
.
WARNING: no entry for /opt/ltsp in /etc/exports,
you may want to add the following line to /etc/exports:
/opt/ltsp *(ro,no_root_squash,async)
and then run the command:
invoke-rc.d nfs-kernel-server reload
info: LTSP client installation completed successfully
Необходимо экспортировать каталог, в котором находится корневая
файловая система бездисковых клиентов.
%$ ls -l /opt/ltsp/
drwxr-xr-x 20 root root 4096 2006-12-25 18:02 i386
%$ ls /opt/ltsp/i386/
bin dev home lib mnt proc sbin sys usr
boot etc initrd media opt root srv tmp var
Рекомендуется делать доступ к файловой системе в режиме read/only,
дабы избежать конфиликтов при совместном доступе.
Мы для экспериментов сделаем файловую систему доступной в режиме
read/write. В режиме нормальной эксплуатации никогда не экспортируйте
корневую систему бездисковых станций в режиме read/write, если точно
не знаете к каким последствиям это приведёт!
Добавьте в файл /etc/exports строку:
/opt/ltsp/i386 *(rw,no_root_squash,async)
Теперь, необходимо указать nfs-kernel-server демону чтобы он перечитал
этот файл:
%# invoke-rc.d nfs-kernel-server reload
Re-exporting directories for NFS kernel daemon...
exportfs: /etc/exports :
Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/opt/ltsp/i386".
Assuming default behaviour ('subtree_check').
NOTE: this default will change with nfs-utils version 1.1.0
И проверяем:
%# showmount -e
Export list for debian:
/opt/ltsp/i386 *
В ходе выполнения команды ltsp-build-client был также создан каталог
/var/lib/tftpboot/ltsp/i386/ :
%# ls -l /var/lib/tftpboot/ltsp/i386/
-rw-r--r-- 1 root root 72400 2006-12-04 17:52 config-2.6.18-3-486
lrwxrwxrwx 1 root root 23 2006-12-25 18:05 initrd.img -> initrd.img-2.6.18-3-486
-rw-r--r-- 1 root root 3080263 2006-12-25 18:05 initrd.img-2.6.18-3-486
lrwxrwxrwx 1 root root 20 2006-12-25 18:05 nbi.img -> nbi.img-2.6.18-3-486
-rw-r--r-- 1 root root 4307968 2006-12-25 18:05 nbi.img-2.6.18-3-486
-rw-r--r-- 1 root root 13324 2006-12-25 18:05 pxelinux.0
drwxr-xr-x 2 root root 4096 2006-12-25 18:05 pxelinux.cfg
-rw-r--r-- 1 root root 714765 2006-12-05 00:21 System.map-2.6.18-3-486
lrwxrwxrwx 1 root root 20 2006-12-25 18:05 vmlinuz -> vmlinuz-2.6.18-3-486
-rw-r--r-- 1 root root 1218196 2006-12-05 00:21 vmlinuz-2.6.18-3-486
Конфигурационный файл сетевого загрузчика pxelinux находится в
pxelinux.cfg/default корневого каталога дистрибутива.
Проверяется не только имя default/
Необходимо создать файл /var/lib/tftpboot/pxelinux.cfg/default:
DEFAULT vmlinuz-2.4.34.lan
APPEND nfsdir=192.168.15.180:/opt/ltsp/i386/ lang=ru ramdisk_size=100000 (перенос)
root=/dev/nfs rw nfsroot=192.168.15.180:/opt/ltsp/i386/ ip=dhcp
TIMEOUT 30
PROMPT 1
DISPLAY boot.msg
Подготовка клиентского ядра и initrd
Необходимо подготовить ядро, под управлением которого будут работать
клиентские станции.
При конфигурировании клиентского ядра обязательно нужно включить:
* Поддержку сетевой карты
* Поддержку NFS
Пример конфигурационного файла пожно скачать здесь. При такой
конфигурации ядра initrd не используется.
В том случае, если какой-либо из необходимых для загрузки и
монтирования корневой файловой системы, драйвер нельзя (или не
хочется) по какой-либо причине включить в ядро, необходимо подготовить
виртуальный загрузочный диск initrd.
Если бездисковый клиент будет загружать не только ядро Linux, но и
initrd, нужно сделать соответствующие изменения в конфигурационном
файле pxelinux.cfg/:
%# vi pxelinux.cfg/default
Дополнительная информация
PXE:
* Спецификация PXE (pdf)
* PXE на en.wikipedia.org
* rom-o-matic.net - коллекция PXE-образов
* PXELINUX на сайте SYSLINUX
LTSP:
* Linux Terminal Server Project
* LTSP.RU - Linux TERMINAL SERVER Project (Russia) -
использование Linux на бездисковых рабочих станциях
* Linux Terminal Server Project на en.wikipedia.org
* Linux Terminal Server Project на ru.wikipedia.org
* Обсуждение на iXBT
Настройка:
* журнал инсталляции LTSP-сервера
Приложения
Конфигурационные файлы
mouse usb /etc/modules
mknod mice c 13 63
Скрипты
/home/rdp/.xsession
SERVER=192.168.1.2
USER=user
while true
do
LANG=C rdesktop -a24 -f -u $USER $SERVER
done
Во-первых, спасибо за ОЧЕНЬ ПОЛЕЗНУЮ СТАТЬЮ.
У меня есть один вопрос:
Можно ли настроить DHCP-сервер таким образом, что бы он работал в паре с DHCP сервером на маршрутизаторе, отвечающем за раздачу IP адреса и других параметров сети, кроме параметров непосредственно касающихся загрузки бездисковых клиентов, а именно: next-server и filename?
Я пробовал данную схему, но в моём случае она не работает.
Вот мой dhcpd.conf :
--------------------------------------------------
option domain-name "example.com";
на сколько я помню, dhcp запрос - широковещательный. по этому 2 сервера в одной сети - жесть. та и смысл? вы с начала получаете адрес сервера лтсп, а потом хотите получить адрес для выхода в интернет? прикольно, и что у вас с нфс случится?