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.
В результате мы получили систему, которая грузится по сети, занимает небольшой объем в памяти, при этом после каждой перезагрузки пропадают все изменения (поэтому надо заранее собирать все нужные продукты жизнедеятельности системы в надежное место).
Все вышеперечисленные способы имеют право на жизнь. Надеюсь, что эта информация вам пригодится, а мне же будет интересно почитать/послушать ваши комментарии.
Спасибо за внимание.