Начальный сетевой PXE загрузчик iPXE

Начальный сетевой PXE загрузчик iPXE

Внезапно, эта статья — продолжение предыдущих статей «Настройка PXE окружения» и «PXE-загрузка с использованием dnsmasq». Здесь я опишу начальный pxe-загрузчик (network bootloader) ipxe, который очень элитен и тот, кто в него умеет элитен также.

Некоторое отступление про ipxe. Вышеупомянутые статьи описывают что такое PXE и как оно вообще работает, если вы не — то читать. Одним из элементов PXE является начальный pxe-загрузчик, читаемый из ROM сетевой карты или по сети с TFTP-сервера. Его работа — загрузить с TFTP-сервера и отобразить загрузочное меню в каком-либо виде, загрузить выбранный код (например, ядро операционной системы) и запустить его. Этим он похож на MBR, которая только и делает, что находит активный загрузочный диск и читает с него загрузочный код. pxelinux.0 — довольно простой загрузчик, который умеет показать загрузочное меню в каком-то виде, загрузить выбранное по TFTP и запустить. gpxe — более продвинутый загрузчик, умеет в DNS, HTTP, iSCSI и подобное, появился как результат проекта Etherboot. ipxe — существенно переработанный форк gpxe, с собственной системой меню, команд и с поддержкой довольно экзотических протоколов, таких как AoE и HTTP. Что будет важно в следующей статье — он умеет san-boot, то есть умеет представлять LUN розданный по сети или с хранилища как локальный диск данной машины с доступом через функции BIOS-a. Это значит, что код, не имеющий понятия о сети или SAN, такой как GRUB или MSDOS, может видеть и иметь доступ к такому диску.

Для начала настроим простую конфигурацию PXE с ipxe и проверим, что она работает, чтобы в дальнейшем извращать всяко. Полигон для извращений следующий. Свежая минимальная инсталляция RHEL 6.6 с выключенными SELinux и файрволлом, которая будет работать как pxe-сервер. На этом сервере — три сетевых интерфейса, eth2 смотрит в интернеты, eth0 и eth1 — в локальную сеть. Есть инсталляционный диск с дистрибутивом RHEL 6.6, который мы собираемся устанавливать на другие сервера по PXE, диск смонтирован в, допустим, /media. Путь к корню TFTP-сервера — /var/lib/pxeboot, этот путь — произвольный, у нас будет такой.

Установим необходимый пакет dnsmasq для DHCP и TFTP сервера. В самом конце конфиг-файла /etc/dnsmasq.conf раскомментируем опцию conf-file, чтобы положить настройки относящиеся к PXE в отдельный файл /etc/dnsmasq.pxe.conf. Так же можно раскомментировать только опцию conf-dir и складывать конфиг-файлы с любым именем в каталог /etc/dnsmasq.d. Также установим всякую фигню, которая нужна, но не устанавливается в минимальной инсталляции.

Скачаем сам ipxe. В пакетах его нет, поэтому качаем с его сайта http://ipxe.org/ с вот этой страницы, вот ссылка на сам файл. Все ссылки рабочие на момент написания статьи, если что, вот локальная копия, билд dea6. Номер версии ipxe уже долгое время 1.0.0+, а номер патча/билда — начало id последнего коммита в git-репозитории проекта. Так что простого способа узнать какая версия старее или новее нет — надо клонировать себе git-репо ipxe и проверять какой коммит раньший.

Подготовим каталог /var/lib/pxeboot — корень TFTP-сервера.

Далее — конфиг dnsmasq, включающий DHCP и TFTP сервисы. Создадим простой конфиг-файл /etc/dnsmasq.pxe.conf с учётом того, что этому серверу статически назначены IP-адреса 12.0.0.10/24 и 13.0.0.10/24 на интерфейсы eth0 и eth1 (да, я знаю, что они белые и их, типа, нельзя использовать во внутренней сети, но мне пофиг).

После этого запускаем dnsmasq.

Пробуем загрузиться по PXE на втором сервере. Второй сервер должен запросить у dnsmasq-а IP и скачать по TFTP файл undionly.kpxe, вот что по этому поводу должны написать в лог:

На самом же втором сервере (PXE-клиенте) должны написать что-нибудь вроде:

Если написали что-то подобное, то ура, самое сложное сделано и кто-то внезапно не совсем неудачник и лузер. И теперь, если не нажать Ctrl-B происходит интересная штука — бесконечный цикл. А именно:

  • - Сетевая карта, умеющая в PXE (этот код расположен в её ROM), посылает в локальную сеть DHCP-запрос, получает IP и указание, что надо скачать c TFTP-сервера и запустить код из файла /var/lib/pxeboot/undionly.kpxe
  • - Сетевая карта скачивает этот код и передаёт ему управление
  • - Код из undionly.kpxe тоже запрашивает DHCP-сервер, получает IP и, внезапно, то же самое указание, что надо скачать и запустить /var/lib/pxeboot/undionly.kpxe
  • - Сервер застрял в бесконечном цикле, потому что ipxe, как сказано ему DHCP-сервером, загружает ipxe, который загружает ipxe, который угадайте что

Поэтому надо как-то сказать DHCP-серверу, чтобы он говорил PXE-клиенту загружать код ipxe (файл undionly.kpxe) только на первый DHCP запрос (от сетевой карты), а на DHCP запрос от самого ipxe говорил загружать что-то другое, например меню загрузки. К счастью, систему PXE и сам ipxe писали ни разу не идиоты, и такая возможность есть, так как ipxe добавляет в свой DHCP-запрос специальную опцию 175, наличие которой может проверить DHCP-сервер (ну, то есть, должен уметь, dnsmasq это умеет, какой-то другой DHCP-сервер, возможно, нет).

Итак, в файле /etc/dnsmasq.pxe.conf закомментируем строчку «dhcp-boot=undionly.kpxe» и напишем вот эти магические заклинания:

Не забыть сказать dnsmasq-у перечитать свой конфиг:

Теперь при загрузке по PXE на втором сервере (PXE-клиенте) ipxe должен послать свой DHCP-запрос и после инициализации написать:

Что ни разу не удивительно, потому что файла bootmenu.ipxe у нас как бы нет, но тем не менее, это значит, что внезапно кто-то чуть меньше неудачник. Поэтому напишем своё загрузочное меню ipxe, с которым будем далее извращаться. Начнём с простого: загрузка ядра и initrd RHEL 6.6:

Так как это установочный initrd, после загрузки начнётся процесс установки RHEL 6.6. Разумеется для установки потребуются все остальные установочные файлы и для этого, разумеется, нужно будет поднять HTTP или NFS сервер, где они будут лежать, а инсталлятор сможет их оттуда взять. Здесь мы заниматься этим не будем, здесь мы играемся с ipxe, стремящимся пацанам смотреть раздел «Настройка HTTP и DNS-серверов для установки ОС используя kickstart» в статье «Настройка PXE окружения».

У ipxe адски крутая система команд, интересующимся смотреть документацию и примеры, особенно пример элитного загрузочного меню здесь (вот локальная копия). Здесь мы напишем простое меню, с загрузкой RHEL 6.6, memtest-a и, just for lulz, с загрузкой из интернетов. Для последней опции, разумеется интернеты должны быть на интерфейсе, на котором мы получили настройки IP по DHCP и сайт, предоставляющий этот сервис, должен работать и быть доступен. Memtest должен быть специальной версией http://boot.ipxe.org/memtest.bin (вот локальная копия), скачайте его и положите в /var/lib/pxeboot/.

Теперь при загрузке по PXE на втором сервере должно показываться это меню и все его пункты должны, внезапно, работать, а если нет — то угадайте, что (подсказка: в ответе есть слово «неудачник»).

📎📎📎📎📎📎📎📎📎📎