Сетевая загрузка

Создание класса на основе терминального сервера

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

В состав ПСПО входит 4 дистрибутива: Мастер (большой), Юниор (средний), Лайт (маленький, для старых компьютеров) и Терминал-сервер для ситуации, когда одна машина современная, а остальные "никакие". Терминал-сервер поддерживает концепцию организации класса, при которой никакого администрирования на клиентских машинах не производится. Более того, на этих машинах можно даже не иметь винчестера, главное --- научить их загружаться через сеть. Это можно сделать путём сетевой загрузки, используя протокол PXE, а можно использовать загрузочный CD или USB-накопитель, лишь бы это в конечном счете приводило к загрузке операционной системы по сети.

Начало работы обычного компьютера выглядит примерно следующим образом. После загрузки собственно операционной системы на клиентских машинах запускается X-сервер (та часть графической оболочки, которая умеет рисовать на экране и работает с мышью и клавиатурой), а также средства для работы с локальными к флешкам и подобными устройствами. После запуска X-сервера эти машины подключаются по протколу взаимодействия графических подсистем, который называется XDMPC, к терминальному серверу, и запуск всех приложений происходит на терминальном сервере. Сервер должен быть достаточно хорошей машиной; скорее всего, любая современная машина подойдёт для класса из 10 компьютеров. На одного пользователя в классе обычно хватает 256 Мб памяти. Если вы совсем ограничены в средствах, можно считать необъожимый объем памяти так: 256 Мб на сам сервер + 128 Мб на каждый терминальный сеанс. Восемь машин при гигабайте памяти на сервере работают достаточно легко. Если шестнадцать машин работают на 2 Гб памяти, то узким местом системы будет уже с быстродействие дисковой подсистемы. Возможный вариант в этом случае -- машина с двумя винчестерами, которые работают, как один большой (raid 0). Другой вариант -- увеличить объём памяти и, соответственно, дискового кэша, чтобы больше данных находилось в оперативной памяти.

Основное достоинство терминального сервера --- при его использовании локальные машины не нуждаются в администрировании в принципе, они просто включаются и работают. Когда-нибудь в будущем их можно вообще выбросить и купить вместо них не полноценные компьютеры, а так называемые тонкие клиенты, у которых есть монитор (хороший), клавиатура (тоже хорошая) и очень компактный системный блок без винчестера, с минимальной памятью и usb-портами. Администрирование необходимо только на терминальном сервере.

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

Более подробно о терминальном сервере можно прочитать здесь;

Создание класса на основе самостоятельных компьютеров

По ряду причин вариант использования терминального сервере не рассматривается как основной при использовании ПСПО, поэтому мы возвращаемся к ситуации, когда необходимо, чтобы на локальных машинах была установлена операционная система, причем единообразным образом. Для этого можно использовать автоматизированную сетевую установку системы с сервера, где развернут нужный дистрибутив, например, Линукс Мастер (отметим, что здесь и далее описываются настройки для ALT Linux).

Что нужно для того, чтобы происходила сетевая установка? Вначале нужно организовать сетевую загрузку машины. Для этого нужно, прежде всего, установить службу dhcpd (Dynamic Host Configuring Protocol Daemon), пакет называется dhcp-server. Он есть в дистрибутиве Мастер, подробнее процесс описан в  Настройка DHCP-сервера.

Dynamic Host Configuring Protocol в переводе с английского --- "протокол динамической настройки компьютера". При включении компьютера по определённым правилам ему по сети передается набор настроек. Вообще говоря, этот протокол очень сложен, он позволяет передавать сотни настроек разного уровня, в том числе и с точки зрения сетевых протоколов. Например, раздача IP может быть организована динамически (каждому новому компьютеру будет выдаваться очередной IP адрес из набора) --- если вас не очень волнует, что в вашу сеть включится кто-то лишний, либо по MAC-адресам (каждому MAC-адресу соответствует свой жёстко определённый IP). Бывают и другие варианты, всё зависит от того, насколько возможно решить задачу административным путём. В любом случае dhcp не помешает в классе, даже если не планируется сетевая загрузка, в особенности, если в учреждении не один сегмент сети.

Конфигурационный файл dhcpd лежит в /etc/dhcpd.conf:

subnet 10.0.2.0 netmask 255.255.255.0 {}

subnet 172.16.0.0 netmask 255.255.255.0 {
        option routers                  172.16.0.1;
        option subnet-mask              255.255.255.0;

        option domain-name-servers      172.16.0.1;

        range dynamic-bootp 172.16.0.101 172.16.0.199;
        default-lease-time 21600;
        max-lease-time 43200;
        filename "pxelinux.0";
        next-server 172.16.0.1;
}

Этот пример предполагает, что у сервера есть два сетевых интерфейса: внешний в сети 10.0.2.0/24 и внутренний с адресом 172.16.0.1. Предполагается, что на сервере развернут ретранcлятор DNS-запросов 172.16.0.1 (подробнее см.  Служба DNS (Bind)), если же его нет, следует указать адрес DNS-сервера провайдера. Обратим внимание на две вещи: все сети, к которым подключена машина, должны быть описаны. Дело в том, что dhcpd - капризный демон, и если он видит сеть, которая в нём не описана, он отказывается работать. И второе --- в одной локальной сети должен быть только один DHCP-сервер.

Какие настройки умеет отдавать DHCP-сервер:

Если выпустить из внимания две другие настройки, filename и next-server, которые нужны именно для сетевой загрузки и будут рассмотрены позже, то машина будет раздавать всем компьютерам в локальной сети адреса из указанного в поле range dynamic-bootp диапазона. Любая машина с установленным ПСПО для автоматической настройки сети запускает клиент dhcp, который называется dhcpcd.

Настройка сетевой загрузки

Настройка клиента

Итак, служба протокола DHCP настроена. Есть ещё две настройки, связанных с сетевой загрузкой операционной системы: во-первых, для ее работы необходима поддержка сетевой загрузки на клиентах, и во-вторых, для нее необходима передача файлов начальной загрузки по протоколу TFTP.

Как правило, о способности клиента загрузиться по сети свидетельствуют слова в настройках BIOS о том, что загрузочным устройством является сеть, int 18 или 19, либо на сетевой карте есть плата BootROM, то есть прошивка для сетевой загрузки, и при включении компьютера с такой сетевой картой вам говорят: "нажмите Alt+B, Shift+F10 или что-то чтобы настроить параметры сетевой загрузки". В этой настройке сетевой загрузки может быть много вариантов, правильно выбирать вариант под названием "PXE". Протокол PXE включает в себя получение настроек по DHCP и некоторые другие возможности.

Клиенты, поддерживающие протокол PXE, должны быть подключены к локальной сети с работающим DHCP-сервером, и на сервере (указанном в поле next-server) должен быть специальный демон, называемый TFTP-сервер. TFTP (Trivial File Transfer Protocol) --- это специальный протокол передачи файлов, крайне упрощённый, чтобы его клиентскую часть (программу, которая умеет скачивать файлы согласно этому протоколу) можно было уместить в памяти сетевой карты. Собственно, BootROM и содержит программу, записанная в ПЗУ сетевой карты, которая загружается в оперативную память и занимается ровно одной вещью: по протоколу PXE получает настройки по DHCP/BOOTP, потом сообразно этим настройкам получает информацию о том, откуда брать специальный файл --- загрузчик, скачивает его, загружает в память и запускает. В отличие от ситуации, когда передаются только настройки сети, в протокол PXE входит стадия скачивания некой программы и запуска её. Всё это делает прошивка сетевой карты.

Настройка TFTP-сервера

Для установки TFTP-сервера требуется поставить соответствующий пакет, разрешить службу и перезагрузить метасервер xinetd, через который и работает сервер tftp:

# apt-get install tftp-server
# chkconfig tftp on
# service xinetd restart

На сервере при установке пакета tftp-server появляется каталог /var/lib/tftpboot, в который нужно поместить файлы, которые будут скачиваться по протоколу tftp, как если бы они лежали в корневой директории сервера. Для того, чтобы получить эти файлы, требуется поставить пакет syslinux:

# apt-get install syslinux

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

Нас интересует содержимое каталога /usr/lib/syslinux/:

$ ls /usr/lib/syslinux/
chain.c32      dmitest.c32         mboot.c32  pcitest.c32   vesamenu.c32
com32          ethersel.c32        mbr.bin    pxelinux.0
copybs.com     isolinux-debug.bin  memdisk    syslinux.com
cpuidtest.c32  isolinux.bin        menu.c32   syslinux.exe

Здесь мы видим файлы нескольких форматов: .bin, .com, .c32, .0 .exe, которые предназначены для загрузки в разные среды. В частности, те, которые загружаются прямо в сетевую карточку называются .0 и .c32.

Насбудет в первую очередь интересовать загрузчик pxelinux.0. В терминологии последовательности загрузки это вторичный загрузчик, то есть тот, который должен загружаться не из пзу, а непосредственно с устройства. Основная его задача --- подгрузить откуда-то ядро и стартовый виртуальный диск (initrd). Загрузка этих двух файлов --- это то, с чего начинается загрузка Linux. Ядро --- это ядро, а в стартовом виртуальном диске находится очень маленький линукс, который содержит все модули, нужные для дальнейшей загрузки и работы системы. Скопируем его в каталог TFTP:

# cp /usr/lib/syslinux/pxelinux.0 /var/lib/tftpboot/

Кроме того, нам необходим сам загрузочный CD или DVD-диск. Для его раздачи на сервере нужно настроить NFS, как описано в <<PasportLink(PspoClasses_080722_00FtpInstallConfigure)>>. Скопируем содержимое диска в каталог /srv/boot сервера, а каталог isolinux --- в каталг tftpboot:

# cp -a /media/cdrom/* /srv/boot
# cp -a /media/cdrom/isolinux /var/lib/tftpboot/

У pxelinux есть конфигурационный файл, в котором написано, что же ему загружать дальше. В нём можно сделать несколько разных вариантов выбора. Для удобства работы с сетью pxelinux.0 загружает конфигурационный файл по определённым правилам. Сначала pxelinux пытается загрузить конфигурационный файл, который по имени совпадает с шестнадцатеричным представлением полученного по PXE IP-адреса. Это сделано для того, чтобы при жёсткой привязки IP-адреса к MAC-адресу машины для каждой машины можно было бы иметь собственную настройку, и можно машины с одними IP-адресами загружать по одной конфигурации, а другие, из другой сети, по другой конфигурации.

Мы рассмотрим простейшую конфигурацию, общую для всех компьютеров сети. Для этого нужно создать файл /var/lib/tftpboot/pxelinux.cfg/default следующего содержания:

timeout 0
prompt 1
default install

label install
  kernel ../isolinux/alt0/vmlinuz

---- /!\ '''Edit conflict - other version:''' ----
  append initrd=../isolinux/alt0/full.cz lang=ru_RU automatic=method:nfs,network:dhcp,server:172.168.0.1,directory:/srv/boot ai live stagename=altinst

---- /!\ '''Edit conflict - your version:''' ----
  append initrd=../isolinux/alt0/full.cz lang=ru_RU automatic=method:nfs,network:dhcp,server:172.168.0.1,directory:/srv/boot ai live stagename=altinst
# Все, что после "append " - должно быть записано в одну строчку

---- /!\ '''End of edit conflict''' ----

Рассмотрим синтаксис этого файла. Поле prompt означает, ожидать ли подсказки (boot:) при загрузке, поле timeout 0 означает ожидание, пока пользователь не нажмёт enter при загрузке в ответ на приглашение boot:. Тут есть один момент: если включён NumLock, pxelinux будет ждать, а если выключен --- нет.

Дальше идут настройки для конкретной загрузки. Поле label задает имя варианта загрузки. Его, можно указать в ответ на подсказку boot: --- не то, которое по умолчанию, а какое-то иное, если оно указано в файле конфигурации. Дальше нужно указать, где находится ядро (поле kernel) и какие у этого ядра параметры (поле append). Параметр ядра initrd разбирается загрузчиком syslinux, он загружает этот файл (стартовый виртуальный диск), а остальные параметры, которые он не понимает, он передаёт ядру.

В параметре automatic указан способ получение файлов установки (здесь NFS, так же возможен FTP), адрес сервера (172.168.0.1) и путь к файлам (/srv/boot).


Сведения о ресурсах

Готовность (%)

Продолжительность (ак. ч.)

Подготовка (календ. ч.)

Полный текст (раб. д.)

Предварительные знания

Level

Maintainer

Start date

End date

80

1

1

1

1

ConstantinYershow, VladimirLysikov, VsevolodKrishchenko


CategoryLectures CategoryPspo CategoryMpgu CategoryUneex