09 декабря 2008

Создаём сервер сетевой установки Fedora/RHEL

С разрешения редакции размещена моя статья из 11/2008 номера журнала "Системный администратор":

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

Однако сегодня мы оставим Spacewalk-сервер в стороне и рассмотрим, как можно автоматизировать самую начальную стадию жизненного цикла серверов/рабочих станций – их развертывание. При этом в процессе установки мы постараемся обойтись без вмешательства оператора при помощи так называемого сервера сетевой установки. Для организации такого сервера мы используем следующие технологии:
  • PXE (Pre-Boot Execution Environment). Минимальное вмешательство человека подразумевает загрузку первой стадии инсталлятора по сети. Большинство выпущенных за последние два-три года сетевых карт и BIOS материнских плат поддерживают эту функцию. Как правило, загрузка по сети начинается, если на жестком диске отсутствует загрузчик, при старте нажата клавиша или в BIOS выбран соответствующий пункт меню. Первый вариант – отсутствие загрузчика на жестком диске – нас вполне устраивает.
  • DHCP-сервер. Предоставляет клиентам сетевые настройки и указывает место, где будут располагаться файлы, необходимые для загрузки с использованием Pre-Boot Execution Environment.
  • TFTP-сервер. Там мы и расположим все необходимые для начала инсталляции файлы. Нужно заметить, что мы можем одновременно поддерживать несколько вариантов дистрибутива, например, Fedora 9 и Red Hat Enterprise Linux 5.
  • Kickstart-файлы. Для каждого из дистрибутивов можно предусмотреть несколько вариантов установки, которые и будут задаваться при помощи kickstart-файлов. Kickstart-файл должен быть доступен по сети при помощи одного из протоколов: http/https, NFS, FTP. Необходимый kickstart-файл можно указывать и вручную, но, поскольку мы хотим максимально автоматизировать развертывание операционной системы, то нужно предусмотреть возможность автоматического выбора. Реализовать это можно следующими способами:
  • При помощи DHCP-сервера в зависимости от MAC-адреса клиента.
  • При помощи настроек PXE (конфигурационных файлов первой стадии загрузчика – pxelinux.0) в зависимости от MAC- или IP-адреса, полученного с DHCP-сервера. В последнем случае может понадобиться резервирование IP-адресов на DHCP-сервере.
  • При помощи Spacewalk-сервера. Мы не будем рассматривать данный вариант, но заметьте, что в зависимости от того, в какой из диапазонов IP-адресов попадает клиент, Spacewalk-сервер может выдавать свой kickstart-файл. При этом его содержимое будет создаваться «на лету» из базы данных, а на DHCP-сервере или при помощи настроек pxelinux.0 можно будет всегда задавать одно и то же месторасположение этого «динамического» kickstart-файла.
  • Сетевой репозиторий. Файлы дистрибутива, доступные по http, NFS, FTP или по всем трем протоколам. Быстрее всего установка будет производиться при выборе метода установки по NFS. Медленнее всего – по http.

Теперь попробуем собрать все компоненты вместе. Не буду подробно объяснять ключи командной строки или подробности работы протоколов – ответы на эти вопросы можно найти в обширной документации, включая официальную от Red Hat. Приведу рецепт решения конкретной задачи. Также обратите внимание на утилиту system-config-netboot, которая может упростить некоторые шаги. Однако в учебных целях не будем пользоваться GUI. Подробно использование system-config-netboot описано в руководстве системного администратора из комплекта официальной документации Red Hat Enterprise Linux.

Для начала установим и настроим автоматический запуск tftp-сервера:

# yum -y install tftp-server
# chkconfig tftp on
# service xinetd start

По умолчанию корневой директорией tftp-сервера в RHEL5 выступает /tftpboot, а в Fedora 9 – /var/lib/tftpboot. Если вы решите использовать директорию, отличную от установленной по умолчанию, не забудьте прописать соответствующие правила в своем модуле SELinux.

Скопируйте в избранный каталог необходимые файлы. Для начала нам необходима первая стадия загрузчика – файл pxelinux.0. Документация на загрузчик и сам файл привносятся в систему пакетом syslinux:

# yum -y install syslinux

Далее копируем загрузчик в корневую директорию tftp-сервера:

# cp $(rpm -ql syslinux | grep pxelinux.0) /var/lib/tftpboot/

Создадим сервер инсталляции для двух дистрибутивов. В качестве примера возьмем Fedora 9 и Red Hat Enterprise Linux 5.1, но пойдет и любой другой дистрибутив, использующий Anaconda. Скопируем в /tftpboot ядро и initrd-образы обоих дистрибутивов, которые расположены в директории /images/pxeboot/ установочного диска. Предположим, оба ISO-образа дистрибутивов смонтированы в /mnt/loop/:

# mkdir /var/lib/tftpboot/{fedora9,rhel51}
# cp /mnt/loop/RHEL_5.1/images/pxeboot/* /var/lib/tftpboot/rhel51/
# cp /mnt/loop/Fedora9/images/pxeboot/* /var/lib/tftpboot/fedora9/

Поскольку у нас два варианта дистрибутивов, предоставим оператору возможность выбора. Пусть в качестве информации наш загрузчик выводит на экран возможные варианты. Создадим текстовый файл /var/lib/tftpboot/boot.msg примерно следующего содержания:

--------------------------
MY SETUP MENU FOR PXE BOOT
--------------------------
f - install Fedora 9
r - install RHEL 5.1
q - boot normally

Кстати, в файле /usr/share/doc/syslinux-*/syslinux.doc (помимо опций, использующихся в конфигурационном файле загрузчика) описано, как сделать информационное сообщение более «веселым», добавив цвета, страницы, переключаемые при помощи функциональных клавиш, и различные управляющие символы. Теперь пришло время создать конфигурационный файл загрузчика, пользуясь все тем же руководством /usr/share/doc/syslinux-*/syslinux.doc:

# mkdir /var/lib/tftpboot/pxelinux.cfg
# vi /var/lib/tftpboot/pxelinux.cfg/default

Наш конфигурационный файл, используемый PXE по умолчанию, будет содержать следующие строки:

default q
display boot.msg
prompt 1
timeout 100

label q
localboot 0

label f
kernel fedora9/vmlinuz
append initrd=fedora9/initrd.img ks=http://192.168.0.100/f9.cfg

label r
kernel rhel51/vmlinuz
append initrd=rhel51/initrd.img ks=http://192.168.0.100/rhel51.cfg

Вариант загрузки с меткой q описывает загрузку с локального диска. Данный вариант используется по умолчанию. Для загрузки ядра Fedora или RHEL необходимо выбрать f или r. Заметьте, мы воспользовались самым простым способом предоставления информации о kikstart-файле через параметры ядра, передаваемые опцией append. В случае использования Spacewalk-сервера можно было бы обойтись одним «динамическим» путем к kikstart-файлу. Без него, если необходимо, можно добавить еще несколько меток, указывающих на другие файлы, например:

label f2
kernel fedora9/vmlinuz
append initrd=fedora9/initrd.img ks=http://192.168.0.100/f9_2.cfg

Следующий компонент нашего сервера – служба DHCP. Устанавливаем его:

# yum -y install dhcp
# cp /usr/share/doc/dhcp-*/dhcpd.conf.sample /etc/dhcpd.conf

С учетом того, что имя kikstart-файла передается без помощи DHCP, а также упростив конфигурацию и не используя классы вендоров, отредактируем нашу область, добавив два параметра:

filename "pxelinux.0";
next-server 192.168.0.100;

Остальные настройки используются в соответствии с вашими пожеланиями. Конфигурирование DHCP-сервера, как и написание kickstart-файла, выходит за рамки этой статьи. Предполагается, что читатель может самостоятельно скопировать содержимое дистрибутива на сервер и сделать его доступным по NFS, FTP или http. В случае необходимости смотрите соответствующую документацию по настройке этих служб.

Создание kickstart-файла также не должно представлять сложностей. Его формат подробно описан в документации Red Hat. Проще всего создать его при помощи GUI-утилиты system-config-kickstart или взяв за основу /root/anaconda-ks.cfg.

Итак, все готово для начала сетевой установки. Включаем тестовую рабочую станцию или запускаем виртуальную машину и наблюдаем следующую картину:


Вводом имени соответствующего пункта меню запускаем инсталляцию соответствующего варианта дистрибутива.

Как вы видите на рис. 3, до использования конфигурационного файла default загрузчик ищет конфигурационные файлы, соответствующие вашему MAC-адресу, IP-адресу и подсетям. Этим можно воспользоваться для создания конкретных комбинаций «дистрибутив/kickstart-файл» для определенных серверов или рабочих станций. Управлять привязкой IP-адресов к конкретным машинам можно в конфигурационном файле DHCP-сервера, используя резервирование IP-адресов и классы вендоров.

Приведенное решение является лишь «заготовкой», на основе которой вы можете самостоятельно собрать нужную вам конфигурациию сервера инсталляции. Следующим шагом я бы порекомендовал попробовать посмотреть в сторону Spacewalk-сервера, являющегося Open Source-решением для управления Linux-инфраструктурой и помимо прочих задач также служащего для развертывания серверов и рабочих станций.

4 комментария:

axet комментирует...

Спасибо за статью! На мой взгляд статья не законченная. Для автоматизированной настройки сети машин необходимо корректно сконфигурированные .ks файлы для автоматической установки системы на кластере машин!

Andrey Markelov комментирует...

Ну, в одной статье все охватить не возможно. Думаю упоминания об официальной документации и GUI для создания ks вполне достаточно. Про KS можно почитать в переводе документации по RHEL4 на rhd.ru. Плюс еще перевод на моем сайте http://www.markelov.net/articles.php?lng=ru&pg=330

Анонимный комментирует...

Статья мне поравилась (нашёл в журнале Системный администратор)
только вопрос
---------------------
вступление

в статье указано что установка идёт через http протокол, а у меня через фтп
DHCP сервер стоит на одной машине(CentOS 5.2) и там прописал необходимы строки, там же стоит и tftp-server, а непосредственно сам установочный сервер находится на другой машине (Fedora 8)
у меня на машинах Realtek 8139 (Realtek boot agent)
он при загрузке пишет
PXE-E51:: No DHCP or proxyDHCP offers were received
а в логе dhcpd сервера пишет
DHCPDISCOVER from 00:16:ec:4b:dd:1a via eth1
Dec 17 15:43:58 localhost dhcpd: Abandoning IP address 192.168.2.53: pinged before offer
и так 4 раза (только IP разные)
----------------------
вопрос это проблема непосредственно самого бут агента риалтека или это у меня неправильно настроено?

Andrey Markelov комментирует...

Какой протокол использовать для установки вы сами указываете вручную или при помощи ks-файла.

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

Верояно проблема в неправильном планировани распределения IP-адресов.