Hашел кое что по настройке удаленной загрузки под Slackware
Журнал Хакер за март 2004г автор Антон Карпов (стр 104.)
Для начала нам понадобится сервер удаленной загрузки.
Это может быть bootp-сервер или dhcp-сервер, оба они выполняют необходимые функции. Т.к. протокол dhcp
умеет все то же, что и bootp, только больше и лучше , то нет никакого резона использовать bootp-сервер.
Поэтому качаем и ставим ISC DHCP сервер, последняя версия которого на момент написания статьи - 3.0.1rc13.
Протокол dhcp позволяет намного больше, чем просто раздачу IP-адресов. Нам нужно будет не только "оформиться"
у сервера, но и загрузить с сервера ядро. Сам dhcp не умеет предоставлять файлы, для этого используется tftp
(trivial file transport protocol) – урезанный, по сравнению с ftp, протокол, не имеющий авторизации и работающий по udp.
Также нам необходимо скачать и поставить поддерживающий команду tsize tftp-сервер, к примеру, hpa-tftp.
И то и другое требует конфигурирования. Dhcp-сервер читает все настройки из файла /etc/dhcpd.conf:
Code:
/etc/dhcpd.conf
allow booting;
allow bootp;
# Глобальные опции
option domain-name "nwudc.lan";
option broadcast-address 192.168.1.255;
option subnet-mask 255.255.255.0;
default-lease-time -1;
use-host-decl-names on;
ddns-update-style ad-hoc;
filename "pxelinux.0";
# Опции для подсети
subnet 192.168.1.0 netmask 255.255.255.0
range 192.168.1.10 192.168.1.30;
option routers 192.168.1.1;
Запуск демона происходит следующим образом:
# /usr/sbin/dhcpd -cf /etc/dhcpd.conf
tftpd конфигурационного файла не имеет и просто запускается в безопасном режиме
/usr/sbin/in.tftpd -s /tftpboot, где /tftpboot - предварительно созданная директория,
куда мы положим ядро и прочие необходимые файлы (см. ниже).
Запущенный с аргументом -s, tftpd использует системный вызов chroot(2) в указанный каталог, поэтому
остальным программам мы должны указывать пути к файлам на tftp относительно этого каталога.
Параметр -l запускает tftpd в standalone режиме. Таким образом, нам уже не нужно использовать устаревший inetd
для запуска tftp-сервера. Оба сервиса можно прописать в /etc/rc.d/rc.local для запуска при старте системы:
Code:
echo "Starting ISC dhcpd: /usr/sbin/dhcpd"
/usr/sbin/dhcpd -cf /etc/dhcpd.conf > /dev/null 2>&1
echo "Starting secure tftpd: /usr/sbin/in.tftpd"
/usr/sbin/in.tftpd -l -s /tftpboot
Собственно, а что нам надо грузить? В конфиге dhcpd.conf среди прочих видим строчку:
Code:
filename "pxelinux.0";
Это значит, что мы будем использовать pxelinux - модификацию всем известного загрузчика syslinux от Питера Анвина (Peter Anvin), специально созданную для загрузки по сети. Берем на syslinux.zytor.com свежий архив syslinux, в нем находим искомый файл-загрузчик pxelinux.0, помещаем его в /tftpboot и в конфиге dhcpd указываем путь до файла относительно этого каталога (напомню, что tftpd запущен в безопасном режиме, и для него /tftpboot – это корневой каталог) - filename "pxelinux.0";. Именно поэтому нам нужен был tftpd-сервер с поддержкой команды tsize - pxelinux использует ее, чтобы скачать образ свежеиспеченного ядра:
Code:
# cd /usr/src/linux-2.4.24
# make menuconfig
# make dep clean bzImage
Опционально:
# make modules modules_install
Общие рекомендации по сборке: для удаленной загрузки удобно собирать ядро без модулей, например, у меня все необходимое влезло в 1200 Кб, но это несущественно. Главное вкомпилировать в ядро (НЕ как модули) следующие вещи: поддержку TCP/IP, драйвер сетевой карты бездисковой
машины, опции "nfs-клиент" и "nfs-server", опцию "allow nfs root", монтирование корневой nfs при загрузке, поддержку devfs и devfs mount at boot. Одним словом, прикинь, что нужно ядру, которое грузится на совершенно голой машине, и при этом должно видеть сеть и уметь монтировать nfs-разделы при загрузке.
Итак, в /tftpboot у нас уже лежит файл pxelinux.0 из архива syslinux и наше ядрышко для бездисковых станций, пусть оно будет незатейливо называться bzImage. Давай мысленно прокрутим ситуацию и подумаем,
чего еще нам не хватает. Когда мы выставим в BIOS клиентской машины опцию загрузки по сети, pxe-загрузчик пойдет искать доступные dhcp-серверы, наш dhcpd откликнется, выдаст клиенту файл pxelinux.0, этот файл загрузится, загрузит ядро bzImage, ядро пойдет грузиться, а потом... а потом оно очень хотело бы увидеть корневую файловую систему, монтируемую по сети. Кроме того, pxelinux должен иметь конфигурационный файл, где описано, какое ядро и с каким опциями ему грузить.
Нетривиальный trivial ftp
Последняя по порядку, но не по важности вещь в каталоге /tftpboot - папка /tftpboot/pxelinux.cfg/, где будет располагаться конфигурационный файл с именем “айпишник клиента”. Мы ведь хотим, чтобы разные бездисковые клиенты с разной конфигурацией железа могли грузить разные ядра, верно? И как дать каждому клиенту понять, где его ядро? Для каждого клиента создается файл /tftpboot/pxelinux.cfg/XXXX,
где имя XXXX файла – это IP-адрес клиента в шестнадцатеричной форме. Т.е. для клиента с адресом 192.0.2.91 это будет конфиг /tftpboot/pxelinux/C000025B. Наконец, если ни один из конфигов не подойдет, то pxelinux читает /tftpboot/pxelinux/default.
Возникает вопрос: откуда у клиента берется конкретный адрес? Как мы помним, у нас используется dhcp-сервер, и от выполнения своей прямой миссии - динамически выдавать IP-адреса - он не отказывается. Клиент и
получает от этого сервера адрес, за это отвечают следующие строчки /etc/dhcpd.conf:
Code:
Дополнения к /etc/dhcpd.conf
// выдавать клиентам такое имя домена
option domain-name "xakep.lan";
// пусть клиенты знают широковещательный адрес сети
option broadcast-address 192.168.1.255;
// пусть клиенты знают маску подсети
option subnet-mask 255.255.255.0;
// описание подсети, в которой мы живем
subnet 192.168.1.0 netmask 255.255.255.0
// диапазон назначаемых адресов
range 192.168.1.10 192.168.1.30;
// сообщим клиентам, какие роутеры надо добавить в таблицу маршрутизации
option routers 192.168.1.1;
// а также какие dns-сервера им нужно прописать себе в /etc/resolv.conf
option name-servers 192.168.1.10;
В итоге получаем клиента с полностью сконфигурированной сетью.
Каждому свое ядро
Очевидно, что адрес клиенту в данной конфигурации назначается случайным образом из имеющихся свободных.
Но нам может понадобиться, чтобы клиент A получал ядро kernA, а клиент B - ядро kernB. Это значит,
что у клиентов А и B каждый раз должны быть строго фиксированные адреса. К счастью, dhcpd и это умеет.
В секцию subnet пишем:
Code:
host ethboot
hardware ethernet 00:0C:6E:9D:6F:78;
fixed-address 192.168.1.20;
Исходя из того, что сетевая карта у клиента не меняется, ее MAC-адрес и будем использовать. Мы указываем, что клиенту с MAC-адресом 00:0C:6E:9D:6F:78 всегда нужно назначать IP-адрес 192.168.1.20. Затем переведем этот адрес в шестнадцатеричный вид и положим конфиг с таким именем в /tftpboot/pxelinux.cfg/. Вуаля! Оговорюсь, что у меня все 72 бездисковых клиента были одинаковые, и различать их каким-либо образом не было нужды (опции host вообще в конфиге не было, а в pxelinux.cfg лежал один лишь default).
Итак, сам конфиг (в моем случае - /tftpboot/pxelinux.cfg/default):
Code:
label linux
kernel bzImage
append ip=auto
append nfsroot=192.168.1.1:/home/nfsroot
ipappend 1
Здесь ничего сложного нет: синтаксис практически совпадает с синтаксисом lilo.conf, за исключением того, что пара "имя-значение" отделена пробелом, а не знаком равенства (=). Клиенту будет выдано по tftp ядро bzImage, IP-адрес клиенту уже присвоен dhcp-сервером, а корневая файловая система должна быть примонтирована по nfs с сервера 192.168.1.1. Эти параметры буду переданы ядру при загрузке.