PXE загрузка может показаться чем-то сложным на первый взгляд, однако! Собрать систему которая бы реализовывала загрузку можно минут за пять.
Где может понадобиться PXE?
Наверно те, кто сталкивался с частой установкой операционных систем могут заметить, что каждый раз необходимо готовить флешку, конечно можно изготовить флешку с которой будет грузиться все что угодно, но флешек размер ограничен, а что если необходимо установить операционную систему на 10 или скажем 100 компьютеров?
Ответ
Вот тут и поможет загрузка по сети. Какие возможности открываются при этом? Можно загрузить множество систем одновременно на различном количестве ПК не использую физический носитель для загрузки, скорость загрузки остается вполне не плохой, приятным бонусом может стать возможность автоматизации, особенно если вы выполняете сервисное обслуживание.
Еще одно применением загрузки по сети может являться создание тонких клиентов, для этих целей очень подходит операционная система Linux.
Что необходимо для PXE
Первое что необходимо — это локальная сеть, действительно, у нас ведь загрузка через сеть.
Еще нам понадобиться ПК, сервер или роутер чтобы выдавать ip адреса и настройки, в общем DHCP сервер.
Я рассмотрю вариант на Windows 2008R2, isc-dhc-server и dnsmasq, как наиболее часто используемые.
Также нам понадобится tftp, samba и nfs сервера — tftp для первоначальной загрузки все начинается с нее.
В общем то и все что нужно. Все эти службы могут быть установлены как на одном физическом сервере так и на нескольких серверах, сут от этого не поменяется.
Настройка DHCP
Windows server 2008R2
Тут все просто: добавляем две опции в параметры области сети
Первая опция — адрес сервера на котором установлен tftp сервер.
Вторая — имя файла через который будет осуществлятся загрузка, по сути он является ядром сетевой загрузки.
DHCP сервер dnsmasq
Добавляем строку в конфигурационный файл
1 2 3 4 5 | nano /etc/dnsmasq.conf #Если TFTP находится на тоже сервер что и dnsmasq dhcp-boot=pxelinux.0 #Если на стороннем сервере, то добавляем адрес tftp сервера dhcp-boot=pxelinux.0,server-name,192.168.2.1 |
DHCP сервер ISC-DHCP-SERVER
В секцию описания зоны добавляем название файла (pxelinux.0) для загрузки
и адрес TFTP сервера
1 2 | option bootfile-name "pxelinux.0"; next-server "192.168.0.1"; |
TFTP сервер
В качестве TFTP сервера могут использоваться служба tftpd, tftpd-hpa или встроенный tftp сервер в dnsmasq,
стоит отметить что tftpd и tftp в dnsmasq не подходят для загрузки систем у которых пути к файлам имею обратный слеш «\» так как они не поддерживают автозамену путей на лету, поэтому если планируется загружать WinPE то стоит использовать tftpd-hpa.
Настройка tftpd-hpa
Открываем файл /etc/default/tftpd-hpa
1 2 3 4 5 6 7 | nano /etc/default/tftpd-hpa # /etc/default/tftpd-hpa TFTP_USERNAME="tftp" TFTP_DIRECTORY="/srv/tftp" TFTP_ADDRESS=":69" TFTP_OPTIONS="--secure -c -v" |
Где взять файлы для загрузки
Для простой загрузки нам понадобится всего два файла — это pxelinux.0 и конфигурационный файл pxelinux.cfg
pxelinux.0 — загрузчик из пакета syslinux, взял версию 4.06, остальные версии не получилось завести.
1 2 3 4 5 6 | #Устанавливать систему буду в /srv/tftp wget https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/syslinux-4.06.tar.xz tar -xvf syslinux-4.06.tar.xz cd syslinux-4.06/ #Теперь выполним поиск необходимых файлов find ./ -name "pxelinux.0" -type f|xargs -I {} cp '{}' /srv/pxeboot/ |
Первый файл готов, теперь необходимо решить что будем грузить.
Самое простое что можно загрузить — это меню и выполнить загрузку с первого жесткого диска. (Самое бесполезное использование загрузки по сети)
Для этого скопируем необходимые компоненты из syslinux
1 | find ./ -name "*.c32"|xargs -I {} cp '{}' /srv/tftp |
Скопируются целая куча модулей, нам нужны будут не все, не используемые выявим в процессе настройки.
И так, составляем конфигурационный файл default в каталоге /srv/tftp/pxelinux.cfg/
default — конфигурационный файл который грузится по умолчанию, можно создать конфигурационные файлы по шалону и если ни к одному шаблону не применится правило, то загрузится файл default, но об этом позже, и так, открываем файл
1 2 3 4 | nano /srv/tftp/pxelinux.0/default label hdd menu default KERNEL chain.c32 |
Сохраняем, попробуем загрузиться на клиенте, устанавливаем в БИОС PXE ROM enable (или подобную настройку, часто находится во вкладке advenced) и ставим сетевой адаптер первым в списке загрузке во вкладке boot, сохраняем и перезагружаем
Вводим название пункта (у меня написано hdd) и начинается загрузка с жесткого диска.
Двигаемся дальше, а то загрузка с диска, которая в общем-то загружается и родным способом нормально в целом не несет много пользы, попробуем загрузить liveCD Ubuntu.
Эта система удобна тем что в ней есть режим casper, который позволяет запустить систему без установки.
Скачиваем свеженький образ дистрибутива с официального сайта:ubuntu.ru
помещу его в свой каталог с образами ~/images/iso
Образ не обязательно распаковывать, я его просто монтирую.
Создадим каталог для наших образов для PXE загрузки:
1 2 3 | mkdir -p /srv/tftp/linux/ubuntu/16.04/ #Монтируем образ в этот каталог (для каждой из версий я создаю соответствующие подкаталоги) mount ~/images/ubuntu-16.04.4-desktop-amd64.iso /srv/tftp/linux/ubuntu/16.04/ |
Затем переходим в каталог /srv/tftp/linux/ubuntu/16.04/casper и ищем как записано ядро и образ памяти
1 2 3 4 5 | qq@mybook:/srv/tftp/linux/ubuntu/16.04/casper$ ls filesystem.manifest filesystem.squashfs vmlinuz.efi filesystem.manifest-remove filesystem.squashfs.gpg filesystem.size initrd.lz qq@mybook:/srv/tftp/linux/ubuntu/16.04/casper$ |
В данном случае ядро называется vmlinuz.efi, а образ памяти initrd.lz, запоминаем эту информацию и правим конфигурационный файл /srv/tftp/pxelinux.cfg/default
1 2 3 4 | label linux menu label ubuntu 16.04 KERNEL linux/ubuntu/16.04/casper/vmlinuz.efi APPEND root=/dev/nfs boot=casper netboot=nfs nfsroot=192.168.0.1:/srv/tftp/linux/ubuntu/16.04/ initrd=/linux/ubuntu/16.04/casper/initrd.lz -- |
Для образа с Ubuntu 18.04 пришлось вносить изменения в строку APPEND, необходимо добавить параметр toram
1 2 3 4 | label linux menu label ubuntu 18.04 KERNEL linux/ubuntu/16.04/casper/vmlinuz.efi APPEND root=/dev/nfs boot=casper netboot=nfs nfsroot=192.168.0.1:/srv/tftp/linux/ubuntu/18.04/ initrd=/linux/ubuntu/18.04/casper/initrd.lz toram-- |
Как успели заметить тут есть параметр nfs, эту службу необходимо настроить:
в файл конфигурации /etc/exports я вношу строку:
1 | /srv/tftp/linux/ubuntu/16.04/ *(ro,sync,no_wdelay,insecure_locks,no_root_squash,insecure) |
И перезапускаю nfs
1 | systemctl restart nfs-kernel-server |
Готово, можно попробовать загрузиться
Создание меню в PXE
Чтобы каждый раз не вводить имя образа можно либо прописать автозагрузку определенного образа, либо создать графическое меню.
Создается автозагрузка следующим образом, добавляем параметр default с названием метки:
1 2 3 4 | default ubuntu label ubuntu KERNEL linux/ubuntu/16.04/casper/vmlinuz.efi APPEND root=/dev/nfs boot=casper netboot=nfs nfsroot=192.168.1.26:/srv/tftp/linux/ubuntu/16.04/ initrd=/linux/ubuntu/16.04/casper/initrd.lz -- |
Графическое меню очень полезно когда у нас множество различных образов, тут нам поможет создать модуль vesamenu.c32
Хороший мануал по настройке меню предвствлен на сайте syslinux
Привожу пример своих настроек цветов, добавляю вначале в /srv/tftp/pxelinux.cfg/default
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | default vesamenu.c32 ALLOWOPTIONS 0 PROMPT 0 FONT psf/Cyr_a8x16.psf MENU BACKGROUND back2.jpg MENU TITLE Boot PXE from Jake Dog`s MENU RESOLUTION 800 600 MENU COLOR border 30;40 #000000ff #000000ff none MENU COLOR title 1;36;40 #ffff6801 #ff010003 std MENU COLOR unsel 37;40 #ff000000 #00000000 none MENU COLOR hotkey 1;37;40 #ffffffff #00000000 std MENU COLOR sel 0;37;40 #c0ff6801 #ff010003 none MENU COLOR scrollbar 30;40 #ff000000 #ff000000 std MENU COLOR help 30;40 #ffff6801 #ff010003 none MENU COLOR timeout_msg 37;40 #ffff6801 #ff010003 none MENU COLOR timeout 1;37;40 #ffff6801 #ff010003 none MENU WIDTH 40 MENU MARGIN 1 MENU ENDROW -1 MENU HELPMSGROW 32 MENU HELPMSGENDROW -1 MENU TIMEOUTROW 12 MENU HSHIFT 0 MENU VSHIFT 0 TIMEOUT 200 |
Обращаю внимание что коды цветов идут после решетки! причем первые два — это прозрачность, остальные RGB формат, все значения HEX.
Устанавливаю картинку разрешением 800×600 так как указал параметр MENU RESOLUTION 800 600, если его не указать то будет разрешение 640×480
В итоге получилась такое симпатичное загрузочное меню