PXE загрузка — загружаем LiveCD Ubuntu

PXE загрузка может показаться чем-то сложным на первый взгляд, однако! Собрать систему которая бы реализовывала загрузку можно минут за пять.

Где может понадобиться PXE?

Наверно те, кто сталкивался с частой установкой операционных систем могут заметить, что каждый раз необходимо готовить флешку, конечно можно изготовить флешку с которой будет грузиться все что угодно, но флешек размер ограничен, а что если необходимо установить операционную систему на 10 или скажем 100 компьютеров?

Ответ

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

Что необходимо для PXE

Первое что необходимо — это локальная сеть, действительно, у нас ведь загрузка через сеть.
Еще нам понадобиться ПК, сервер или роутер чтобы выдавать ip адреса и настройки, в общем DHCP сервер.
Я рассмотрю вариант на Windows 2008R2, isc-dhc-server и dnsmasq, как наиболее часто используемые.

Также нам понадобится tftp, samba и nfs сервера — tftp для первоначальной загрузки все начинается с нее.
В общем то и все что нужно. Все эти службы могут быть установлены как на одном физическом сервере так и на нескольких серверах, сут от этого не поменяется.

Настройка DHCP

Windows server 2008R2

Тут все просто: добавляем две опции в параметры области сети
DHCP в MS Windows Server2008R2

Первая опция — адрес сервера на котором установлен tftp сервер.
Вторая — имя файла через который будет осуществлятся загрузка, по сути он является ядром сетевой загрузки.

Поле настроек для области DHCP

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, сохраняем и перезагружаем

Окно BIOS

Вводим название пункта (у меня написано 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
Процесс загрузки PXE

Создание меню в 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

Тыква

В итоге получилась такое симпатичное загрузочное меню

Пример меню Syslinux

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.