Pxe сервер что это

PXE — грузим всё! Осваиваем мультизагрузку по локальной сети

Содержание статьи

Сегодня автоматизируется все больше задач, для максимальной отдачи серверов все шире используют виртуализацию. Но устанавливать операционки по-прежнему приходится. Каждый делает это по-своему: у кого-то полные карманы различных образов на все случаи жизни, кто-то по старинке носит с собой «барсетку» с дисками, а то и две. Как правило, администраторы выполняют эту работу с невеликим удовольствием. Давай посмотрим, как сократить время на тривиальные задачи, как научить компьютеры устанавливать системы самостоятельно, вообще без участия админа, используя при этом только локальную сеть.

Итак, сегодня мы научимся: устанавливать Windows и Linux по сети, грузить небольшие ISO-образы, полезный софт (всяких там Касперских, Акронис, WinPE, мемтесты), разворачивать тонкие клиенты и рулить ими. Чтобы, например, бухгалтер, работающая с 1С по RDP, не прибила тебя за то, что у нее слетела винда, а отчет нужно было подготовить еще вчера. Или скупой начальник, который не хочет обновлять свой комп, восхитился твоим профессионализмом, когда увидит, как на стареньких компах летает Windows 8. В достижении наших коварных целей нам поможет сервер, предоставляющий загрузку по сети (PXE).

Xakep #201. Как стать киборгом

У любого системного администратора в заначке есть универсальный USB-диск для экстренной реанимации компьютера. Согласись, было бы куда лучше иметь ту же функциональность, используя одну лишь сетевую карту. Нельзя при этом не отметить возможность одновременной работы с несколькими узлами сразу. Итак, исходя из наших потребностей у нас есть два пути решения: использовать PXE или LTSP.

LTSP нам не очень подходит: он призван грузить по сети ОС, установленную на самом сервере, что позволяет использовать приложения сервера LTSP. Это не совсем то, что нам нужно. PXE — инструмент для загрузки компьютера по сети без использования локальных носителей данных, так же как и LTSP. PXE позволяет организовать мультизагрузочное меню загрузки, аналогичное универсальному «USB-реаниматору».

Главное меню загрузки PXE, графический режим

Что будем реализовывать?

Началось все с необходимости иметь под рукой инструмент для удаленной установки Ubuntu/Debian Server по сети, с возможностью загрузки Live CD маленькой системы, вроде SliTaz или Kolibri OS.
Как говорится, аппетит приходит во время еды: намеченное не успели реализовать, а к плану добавился еще ряд «хотелок». В итоге список получился весьма внушительным.

Собираем все в кучу и взлетаем

В качестве дистрибутива для сервера выбор пал на Ubuntu Server 14.04.2 LTS. Можно остановиться на любой другой ОС, разница будет только в синтаксисе. Итак, приступим. Нам потребуется TFTP, DHCP (необязательно установленный на этом же сервере, в роли DHCP-сервера может выступить роутер), сервис для организации сетевой файловой системы NFS. Рассматривать будем только те настройки, которые нас интересуют в рамках темы. Первым делом установим все необходимое, предварительно сделав все обновления:

Обрати внимание, параметр TFTP_DIRECTORY=»/var/lib/tftpboot» указывает место расположения корневого каталога TFTP-сервера. После сохранения перезапускаем удобным для себя способом:

Далее настроим DHCP-сервер. Приведу простую конфигурацию файла /etc/dhcp/dhcpd.conf:

Данная конфигурация говорит о том, что DHCP-сервер работает в локальной сети 192.168.0.0/24. Клиенту присваиваются адреса из диапазона 192.168.0.150–192.168.0.200, им будут присвоены параметры шлюза — 192.168.0.1, DNS-сервера — 192.168.0.2 и 192.168.0.5. Класс pxeclients, а именно параметр filename — это имя файла загрузчика, расположенного в корневой папке TFTP-сервера, в нашем случае /var/lib/tftpboot/pxelinux.0, на сервере с адресом 192.168.0.10.

Syslinux. Ставим загрузчик

В качестве загрузчика будем использовать Syslinux. Последнюю версию можно взять здесь. Распаковываем и кладем в /var/lib/tftpboot следующие файлы: ldlinux.c32, libcom32.c32, pxelinux.0 и lpxelinux.0 и каталог boot, в который складываем chain.c32, ldlinux.c32, libcom32.c32, libcom32.elf, libutil.c32, linux.c32, memdisk, menu.c32, vesamenu.c32 (menu.c32 — только текстовое меню, vesamenu.c32 позволяет украсить меню, например добавив фон). Файл меню загрузки по умолчанию должен находиться в /var/lib/tftpboot/pxelinux.cfg/default и иметь вид

На этом этапе загрузчик должен работать и иметь единственный пункт меню «Загрузка с первого жесткого диска». Далее необходимо создать подменю. Чтобы не путаться и не городить огромные файлы, рекомендую вынести подпункты в отдельные файлы меню, например так:

Все, что относится к разделу меню Install/Boot Linux, вынесем в отдельный файл /var/lib/tftpboot/linux. Аналогично выносятся другие пункты меню. Остальные параметры загрузки рассмотрим при добавлении каждого пункта/продукта.

Раздел Linux. Готовим на примере Ubuntu 14.04

Тонкие клиенты / Thinstation Linux

Acronis

Продукты Acronis загружаются аналогично инсталляторам Linux-систем. Скачал в Сети первый попавшийся образ Acronis, исключительно в научных целях. Распаковал. Нас интересуют только два каталога: ADD12 и ATI2015. Внутри каждого каталога видим по два файла с одинаковым именем и разным расширением. Это сделано для загрузки на 32-битных и x64-системах. Если открыть файл menu.lst того же образа, можно посмотреть, что чему соответствует. Для удобства складываем True Image и Disk Director аналогичным образом. Создаем папку acronis в рабочем каталоге ( /var/lib/tftpboot ). В него копируем ADD12 и ATI2015 со всем содержимым. Для удобства продукты Acronis выносим в отдельный раздел меню, так же как и раздел Linux. В pxelinux.cfg/default добавляем:

Файл acronis приводим к такому виду:

Windows PE

Заключение

На этом всё. В следующей статье мы научимся подготавливать и добавлять Windows-образы, сетевой установке в ручном и автоматическом режимах. Добавим Kaspersky Rescue v10, ERD Commander, именуемый MSDaRT. Разберемся, как запускать диагностические утилиты на примере memtest, а также покажем, как украсить меню загрузки.

Читайте также:  снять комнату в дедовске на сутки

Александр «Plus» Рак

Участник сообщества OmskLUG. Инженер отдела электронного взаимодействия МКУ «Информационно-технического управления».

Источник

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).

[править] Предварительные данные

[править] Сетевые настройки

Сетевые интерфейсы настраиваются автоматически согласно файлу /etc/network/interfaces:

Интерфейс eth0 подключен к сети 10.0.0.0/8 и через него осуществляется выход в интернет.

Интерфейс eth1 подключен к сети 192.168.15.0/24, в которую подключаются тонкие клиенты.

Аллиас на интерфейсе eth1 eth1:1 необходим для соединения с терминальным сервером Windows.

Для осуществления возможности выхода в интернет, всем студентам с тонких клиентов настраивается firewall в таблице nat цепочки POSTROUTING (о чем говорит соответствующая строка в конфигурационном файле настройки сетевых интерфейсов):

Кроме настройки firewall необходимо включить forwarding. Иными словами, необходимо разрешить ядру операционной системы осуществлять проброс трафика с одного интерфейса на другой. Это можно сделать несколькими способами:

1. Строка в файле /etc/network/interfaces

Приведённый выше способ годится для ОС Debian/Linux и основанных на нём и может не работать в других ОС.

2. Строка в файле /etc/sysctl.conf

Но этот способ включения forwarding действует до первой перезагрузки, а для автоматического включения на этапе старта системы необходимо использовать первый или второй методы.

4. Файл /etc/network/options:

Приведённый выше способ годится для ОС Debian/Linux и основанных на нём и может не работать в других ОС.

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

[править] Операционная система

[править] Инсталляция и настройка DHCP-сервера

[править] Инсталляция DHCP-сервера

Анализ лог-файла /var/log/daemon.log говорит, что не описана сеть 192.168.15.0/24. Указанная сеть была определена автоматически, исходя из адреса интерфейса, на котором DHCP-сервер прослушивает запросы. По умолчанию этот интерфейс eth0. Конфигурационный файл dhcpd.conf не содержит описания этой сети.

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

Сейчас этого делать не нужно.

[править] Настройка DHCP-сервера

Далее можно приступать к непосредственной настройке DHCP-сервера:

Вы можете ещё указать опцию:

для того случая, когда TFTP-сервер и DHCP-сервер разные. В противном случае TFTP-сервер ищется на самом DHCP-сервере.

Если загрузка не выполняется, попробуйте явным образом указать в качестве next-server машину, на которой расположен TFTP-сервер и файл pxelinux.cfg/default.

Конфигурационный файл практически ничем не отличается от файла по умолчанию. Клиентам будут выделяться IP-адреса из диапазона 192.168.15.200-192.168.15.220, указанного в range dynamic-bootp. В качестве DNS-сервера и шлюза используется хост 192.168.15.254.

Опции, имеющие непосредственно отношение к бездисковой загрузке:

[править] Запуск DHCP-сервера

[править] Инсталляция и настройка TFTP-сервера

[править] Инсталляция TFTP-сервера

Установите пакет tftpd-hpa (другие TFTP-серверы могут работать некорректно):

[править] Настройка TFTP-сервера

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

Перезапустим интернет суперсервер:

И проверим выполняет ли интернет-суперсервер прослушивание порта 69 (порт TFTP):

На этом настройка TFTP-сервера завершена.

Я установил TFTP-server (apt-get install tftp-server), который умеет работать в режиме демона, запускается он так:

[править] Настройка pxelinux

[править] Настройка LTSP (Linux Terminal Server Project)

[править] Установка серверной части ltsp

Необходимо установить пакет ltsp-server. В качестве зависимостей от этого компонента, будет скачан и установлен сервер NFS (при условии, что он не был установлен ранее).

После установки нам рекомендовано добавить строку

в файл экспортирования файловых систем /etc/exports.

Корневая файловая система, которую будут использовать клиенты, находится в подкаталоге каталог /opt/ltsp. Она должна быть доступна через NFS. Можно изменить файл /etc/exports сейчас, а можно позже. Мы изменим позже.

[править] Настройка шлюза

Если нужно чтобы бездисковые клиенты могли получить доступ в Интернет через наш шлюз, необходимо настроить на этом шлюзе iptables и включить forwarding пакетов между интерфейсами.

Добавляем строки в /etc/network/interfaces

[править] Создание клиентского образа ltsp

Образ создаётся с помощью скрипта ltsp-build-client. В качестве аргументов скрипту необходимо указать:

В каталог, который будет для бездисковой станции корневым, проинсталлируется дистрибутив etch. В качестве источника пакетов указан локальный apt-proxy. Вместо него нужно указать соответствующее зеркало.

Читайте также:  война миров зет актеры и роли

Необходимо экспортировать каталог, в котором находится корневая файловая система бездисковых клиентов.

Рекомендуется делать доступ к файловой системе в режиме read-only, дабы избежать конфликтов при совместном доступе.

Мы для экспериментов сделаем файловую систему доступной в режиме read-write. В режиме нормальной эксплуатации никогда не экспортируйте корневую систему бездисковых станций в режиме read-write, если точно не знаете к каким последствиям это приведёт!

Добавьте в файл /etc/exports строку:

Теперь, необходимо указать nfs-kernel-server демону чтобы он перечитал этот файл:

В ходе выполнения команды ltsp-build-client был также создан каталог /var/lib/tftpboot/ltsp/i386/ :

Конфигурационный файл сетевого загрузчика pxelinux находится в pxelinux.cfg/default корневого каталога дистрибутива.

Проверяется не только имя default/

Необходимо создать файл /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default:

В документации сказано, что использование initrd.img необязательно при использовании nfs. На практике же, далеко не всегда получается примонтировать nfs-систему из initrd.img. Желательно предоставить пользователю возможность выбора.

Не забудте создать файл /var/lib/tftpboot/ltsp/i386/boot.msg произвольного содержания. Он будет отображаться при загрузке. Его содержание, например, может быть таким:

Измените версию ядра и initrd образа, посмотреть какая у Вас версия можно тут: /var/lib/tftpboot/ltsp/i386

[править] Альтернатива LTSP (без привлечения сторонних пакетов)

Данный раздел позволяет создать клоны целевой системы. Данный раздел предоставляет сведения, полученные эмпирическим путём. Он довольно прост и опробован на практике, но не доведён до конца.

[править] Создание «базовой площадки»

Для работы операционки все необходимые файлы можно разбить на 3 категории:

Мы создадим «базовую площадку», которая инициализирует файловую систему с учётом вышеописанных принципов. Для упрощения, корневую файловую систему разместим в /ltsp

Для начала экспортируем всё необходимое. Затем возьмём за основу содержимое локального initrd.img. Мы экономить не будем, а поэтому закинем необходимые бинарники, а позже библиотеки к ним. Так же возьмём busybox в качестве шелла — вы сможете использовать /bin/ash в /init для отладочных целей. Так же нам необходима часть его функций для развёртывания. ifconfig нам нужен только для того, чтобы убедится в правильности назначения IP-адреса ядром. С помощью mount.nfs будем монтировать необходимое для работы, т.к. больше ничто не может нормально работать с nfs. Так же нам необходим FIFO-файл initctl в каталоге устройств для «общения» с init’ом.

Проверить, какие библиотеки используют скопированные бинарники можно командой ldd (ldd /sbin/ifconfig). У меня получилось всего 2:

/sbin/init запускается первым и остаётся первым всё время. При своём запуске он читает inittab, секцию sysinit. там у нас указано выполнение нашего /init. Это сделано, по большей части, для удобства редактирования.

При загрузке необходимы «свои» конфигурационные файлы. «Выстрелим из бочки» и cнимем копию с рабочей системы скопировав /etc, подправим его. Оригинальный inittab заменит наш файл и загрузка продолжится в исходном режиме. Для уменьшения размеров и ускорения его загрузки по сети, запакуем его и будем распаковывать при каждой загрузке. Так же при загрузке у нас уже, наверняка, будет сконфигурирована сеть, поэтому удалим соответствующие файлы.

Конечный результат выглядит так:

Далее нам остаётся настроить /init.

После загрузки у нас должна оказаться примонтированная /ltsp в качестве корневой системы, назначен IP-адрес (должна быть досягаема донорная система) и запущен на выполнение /sbin/init, а соответственно и /init.

Т.к. у нас всё изначально ro, то мы создадим временную (tmpfs) rw-систему в /sysroot и будем далее работать уже с ней. Создаём на ней необходимые каталоги для неизменяемых файлов и монтируем соответствующие экспортированные разделы донорной системы. Далее — распаковываем туда наш etc.tar.gz. Копируем туда же каталог с устройствами. После этого, переходим на /sysroot и делаем pivot-root тем самым подменяя файловую систему. После этого монтируем /proc и /sys системы. С этого момента дальнейшая загрузка возможна в теории, но многим программам необходим rw-доступ в определённые места. Есть так же ряд тонкостей, которые необходимо подправить; переменная PATH — одна из них. Нам так же надо привести в соответствие файл /etc/mtab с текущим состоянием системы. В конце файла мы передаём управление скрипту, который подменили собой.

Данный метод опробирован на VMWare и Linux Mandiva 2008 DVD. Система загружается и работает, но процесс загрузки всё ещё имеет шероховатости. Завершение работы так же не блещет изяществом.

Если у вас что-либо не получится — можете вынести этот вопрос здесь на страницу обсуждения. Я постараюсь вам ответить.

[править] Подготовка клиентского ядра и initrd

Необходимо подготовить ядро, под управлением которого будут работать клиентские станции.

При конфигурировании клиентского ядра обязательно нужно включить:

Ниже будет рассмотренно, как это осуществить

Для начала необходимо выяснить, какой модуль ответственнен за сетевую карту. На работающей машине сделайте:

допустим, мы получили alias eth0 pcnet32. После этого, нам необходимо выяснить, как она включается в ядро.

Так мы узнаем, в каком каталоге лежат файлы, ответственные за модуль. Для драйверов сетевых карт это

Осталось только узнать define-variable для модуля.

В выводе будет что-то похожее на CONFIG_PCNET32. Далеко не у всех модулей имя define-variable совпадает с именем модуля. Осталось только

Заодно можно выставить оптимизацию под конкретный процессор и отключить неиспользуемые модули. Например IrDA, BlueTooth или IDE-через-LPT.

В том случае, если какой-либо из необходимых для загрузки и монтирования корневой файловой системы, драйвер нельзя (или не хочется) по какой-либо причине включить в ядро, необходимо подготовить виртуальный загрузочный диск initrd.

Читайте также:  как облегчить стяжку пола в квартире

Если бездисковый клиент будет загружать не только ядро Linux, но и initrd, нужно сделать соответствующие изменения в конфигурационном файле pxelinux.cfg/:

[править] Дополнительная информация

Установка операционной системы через PXE:

[править] Материалы на Xgu.ru посвящённые загрузке системы

[править] Приложения

[править] Конфигурационные файлы

[править] /etc/dhcp.conf

[править] /etc/exports

Вместо rw, лучше использовать ro, в противном случае возможны ошибки при совместном доступе.

[править] /etc/inetd.conf

[править] /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default

Пример конфигурационного файла PXELINUX.

В этом примере в загрузке есть три пункта меню:

Источник

Бездисковая загрузка по сети и жизнь после нее

История

Теория

По сути, для того, чтобы система загрузилась ей необходимо 3 компонента — ядро, начальное окружение initramfs и корневой каталог, в котором система будет работать.

Практика

Все действия проводятся на машине с ubuntu precise.

Для начала настроим PXE. Мануалов на эту тему уйма, поэтому я расскажу только самую суть.
Ставим ваш любимый dhcp сервер, например isc-dhcp-server, который будет раздавать машинкам ip адреса и указывать путь к файлу pxelinux.0, который будет отдавать tftp сервер (tftp-hpa или же atftp).

Пример конфига dhcp сервера. В примере pxe-сервер находится по адресу 10.0.0.1.

Запускаем tftp сервер (в ubuntu он имеет init-скрипт, но вполне вероятно, что вам придется запускать его и через inetd/xinetd).
Проверяем работоспособность. Кладем файл в каталог /var/lib/tftpboot и пробуем стянуть его tftp клиентом.

В принципе неважно, где вы возьмете файл pxelinux.0, так как он является просто начальным загрузчиком, в который мы передаем то, что надо грузить дальше.
Вы можете сделать красивую менюшку в загрузчике, но сейчас нам это не нужно, поэтому мой pxelinux.cfg/default выглядит так

rootfs

Образ rootfs собираем через debootstrap, чрутимся в него и ставим необходимые программы. Настраиваем сеть, hostname, фаервол и прочее, чем больше сделаем настроек, тем больше будет образ. Главное не забудьте сменить пароль на рута.

С нашим минимальным набором система получилась весом 200Мб.

Initramfs

В этом примере мы будем забирать образ корневой фс с веб-сервера, расположенного на нашем сервере сетевой загрузки, то есть на 10.0.0.1. Решение было таким просто потому, что в нашем initramfs была утилита wget. Чтобы не тянуть большой объем данных по сети, мы решили сжать образ. Это можно было бы сделать и обычным tar, но можно попробовать squashfs, тем более, что обычно в initramfs tar не встроен, с другой стороны, ничего не мешает его туда добавить.

Squashfs
Squashfs — это сжимающая файловая система, которая включена в ядро с версии 2.6.29. С ее помощью можно заархивировать каталог, примонтировать на loop устройство и читать с него, для записи же необходимо провести процедуру добавления файлов в архив. Так как при обращении к squashfs, вы читаете из архива, то это дает дополнительную нагрузку на cpu.

Далее надо научить init из initramfs забирать образ корня и помещать его в оперативную память.

init в initramfs — это скрипт на sh, который производит разбор опций из cmdline, монтирует фс, делает switch_root и запускает гланый init-процесс системы.
Воспользуемся этим и допишем свои опции для cmdline. Напишем скрипт ram, который будет вызываться при значении опции boot=ram.

Через параметр rooturl можно указывать откуда качать образ корневой фс. Для работы со squashfs необходимо подгрузить ее модуль в ядро. Указываем в /etc/initramfs-tools/initramfs.conf BOOT=ram и пересобираем initramfs

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

В это примере, мы использовали squashfs просто для сжатия образа, но почему бы нам не попробовать примонтировать корневой раздел в squashfs и не посмотреть, что получится? Меняем наш скрипт, в функции do_rammount() оставляем только монтирование squashfs.

Пересобираем initramfs, запускаем, смотрим. Система загружается в режиме ro, но зато занимает в памяти всего около 180Мб.
В каких-то случаях монтирование в режиме ro это хорошо, но нас это не устраивает, но и просто так тратить оперативную память нам тоже не хочется. Выход же был найден при помощи Aufs.

Aufs
Aufs позволяет делать каскадно-объединённое монтирование файловых систем — одну в режиме только на чтение, а вторую в rw. Работает она в режиме copy-on-write, то есть все изменения записываются на rw систему и после этого чтение производится с нее же.
Опять переписываем наш скрипт.
В фукнцию mountroot() добавляем

А фукнцию do_rammount() приводим к следующему виду:

Пересобираем initramfs, запускаем, смотрим. Система занимает в памяти 181Мб, при этом мы можем менять ее, писать, читать. Все изменения хранятся отдельно в /mnt/rw, а сама система хранится в /mnt/ro.

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

Все вышеперечисленные способы имеют право на жизнь. Надеюсь, что эта информация вам пригодится, а мне же будет интересно почитать/послушать ваши комментарии.
Спасибо за внимание.

Источник

Развивающий портал