PXE-сервер для нескольких архитектур

В данной статье будет описано как настроить PXE-сервер на базе openScaler 22.03-LTS-SP2 с поддержкой нескольких архитектур: как минимум x86_64 и aarch64.

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

Необходимо создать ВМ следующей конфигурации:

  • 4 CPU
  • 4 GB RAM
  • 25 GB boot disk
  • 100 GB data disk
  • Gb/sec management interface
  • Gb/sec production interface
После создания ВМ произвести установку ОС openScaler 22.03-LTS-SP2, достаточно будет минимального варианты установки.
В данной статье сетевой интерфейс управления имеет имя enp1s0 и его настройка не важна.
Продуктивный же интерфейс имеет имя enp2s0 и будет обслуживать подсеть 192.168.20.0/24 и иметь адрес 192.168.1.1.
Параметры настройки интерфейса задаются в файле /etc/sysconfig/network-scripts/ifcfg-enp2s0:
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
NAME=enp2s0
UUID=7e6c450b-c710-4015-ad5f-0425b8fcffff
DEVICE=enp2s0
ONBOOT=yes
IPADDR=192.168.20.1
PREFIX=24
IPV6_DISABLED=yes
Второй диск будет размечен и смонтирован в процессе настройки.
Для работы PXE-сервер требуется связка из DHCP и TFTP серверов для осуществления загрузки ядра, а также HTTP сервера для загрузки файлов ОС и/или NFS-сервер для бездисковых станций.
Установить необходимый пакеты можно командой:

dnf install dhcp tftp-server httpd syslinux-tftpboot

Первым делом производится настройка DHCP-сервера, для этого в конфигурационный файл /etc/dhcp/dhcpd.conf необходимо добавить следующую конфигурацию:

authoritative;
allow bootp;
allow booting;
max-lease-time 86400;
default-lease-time 3600;
log-facility local7;

option ip-forwarding false;
option mask-supplier false;

subnet 192.168.20.0 netmask 255.255.255.0 {
  option routers 192.168.20.1;
  option domain-name-servers 77.88.8.8;
  range 192.168.20.50 192.168.20.250;
  next-server 192.168.20.1;
}

option architecture-type code 93 = unsigned integer 16;
class “pxeclients” {
  match if substring (option vendor-class-identifier, 0, 9) = “PXEClient”;
  if option architecture-type = 00:00 {
    filename “lpxelinux.0”;
  } elsif option architecture-type = 00:07 {
    filename “EFI/grubx64.efi”;
  } else {
    filename “pxelinux.0”;
  }
}

Перед запуском сервиса необходимо ограничить список интерфейсов, на которых DHCP будет отвечать на запросы, для этого необходимо добавить в конец команды запуска список интерфейсов, для этого необходимо запустить команду и добавить в конец строки запуска enp2s0:

systemctl edit –full dhcpd
ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd –no-pid $DHCPDARGS enp2s0
systemctl daemon-reload


Запустить сервис и добавить в его автозапуск при старте системы можно командой:

systemctl enable –now dhcpd

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

[root@pxe-server ~]# systemctl status dhcpd
● dhcpd.service – DHCPv4 Server Daemon
Loaded: loaded (/etc/systemd/system/dhcpd.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2024-01-16 12:12:59 MSK; 3s ago
Docs: man:dhcpd(8)
man:dhcpd.conf(5)
Main PID: 5144 (dhcpd)
Status: “Dispatching packets…”
Tasks: 1 (limit: 16540)
Memory: 4.3M
CGroup: /system.slice/dhcpd.service
└─ 5144 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd –no-pid enp2s0

янв 16 12:12:59 pxe-server dhcpd[5144]: All rights reserved.
янв 16 12:12:59 pxe-server dhcpd[5144]: For info, please visit https://www.isc.org/software/dhcp/
янв 16 12:12:59 pxe-server dhcpd[5144]: Source compiled to use binary-leases
янв 16 12:12:59 pxe-server dhcpd[5144]: Wrote 0 class decls to leases file.
янв 16 12:12:59 pxe-server dhcpd[5144]: Wrote 0 leases to leases file.
янв 16 12:12:59 pxe-server dhcpd[5144]: Listening on LPF/enp2s0/56:6f:5a:05:00:32/192.168.20.0/24
янв 16 12:12:59 pxe-server dhcpd[5144]: Sending on LPF/enp2s0/56:6f:5a:05:00:32/192.168.20.0/24
янв 16 12:12:59 pxe-server dhcpd[5144]: Sending on Socket/fallback/fallback-net
янв 16 12:12:59 pxe-server dhcpd[5144]: Server starting service.
янв 16 12:12:59 pxe-server systemd[1]: Started DHCPv4 Server Daemon.


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

[root@pxe-server ~]# firewall-cmd –permanent –add-service=dhcp
success
[root@pxe-server ~]# firewall-cmd –reload
success

Прежде чем приступить к настройке TFTP проведём разметку второго диска и создадим его точку монтирования. Так как на диске планируется хранить данные для TFTP и HTTP, то создадим точку монтирования /var/lib/pxe и создадим логический том на новой логической группе, выполнив команды:[root@pxe-server ~]# mkdir /var/lib/pxe
[root@pxe-server ~]# vgcreate pxevg /dev/sdb
Physical volume “/dev/sdb” successfully created.
Volume group “pxevg” successfully created
[root@pxe-server ~]# lvcreate -n pxelv -l100%FREE pxevg
Logical volume “pxelv” created.
[root@pxe-server ~]# mkfs.ext4 /dev/pxevg/pxelv
mke2fs 1.46.4 (18-Aug-2021)
Discarding device blocks: done
Creating filesystem with 26213376 4k blocks and 6553600 inodes
Filesystem UUID: df7cd642-d518-4d81-83a2-80addf0a87c4
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872

Allocating group tables: done
Writing inode tables: done
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information: done

Для автоматического монтирования при загрузке создадим запись в /etc/fstab:
/dev/mapper/pxevg-pxelv /var/lib/pxe ext4 defaults 1 2

Проверим, что все верно монтируется:
[root@pxe-server ~]# mount -a
[root@pxe-server ~]# df -h
Файловая система Размер Использовано Дост Использовано% Cмонтировано в
devtmpfs 4,0M 0 4,0M 0% /dev
tmpfs 1,3G 0 1,3G 0% /dev/shm
tmpfs 524M 7,2M 517M 2% /run
tmpfs 4,0M 0 4,0M 0% /sys/fs/cgroup
/dev/mapper/openscaler-root 20G 1,7G 17G 10% /
tmpfs 1,3G 0 1,3G 0% /tmp
/dev/sda2 974M 213M 694M 24% /boot
/dev/sda1 511M 6,2M 505M 2% /boot/efi
/dev/mapper/pxevg-pxelv 98G 24K 93G 1% /var/lib/pxe

Создадим каталоги для сервисов:
[root@pxe-server ~]# mkdir /var/lib/pxe/tftpboot
[root@pxe-server ~]# mkdir /var/lib/pxe/http

Внесём изменения в стартовую команду tftp и запустим его:
[root@pxe-server ~]# systemctl edit –full tftp.service
ExecStart=/usr/sbin/in.tftpd -s /var/lib/pxe/tftpboot
[root@pxe-server ~]# systemctl daemon-reload
[root@pxe-server ~]# setsebool -P tftp_home_dir 1
[root@pxe-server ~]# systemctl enable –now tftp.service
[root@pxe-server ~]# systemctl status tftp.service
● tftp.service – Tftp Server
Loaded: loaded (/etc/systemd/system/tftp.service; indirect; vendor preset: disabled)
Active: active (running) since Tue 2024-01-16 15:17:12 MSK; 5s ago
TriggeredBy: ● tftp.socket
Docs: man:in.tftpd
Main PID: 5797 (in.tftpd)
Tasks: 1 (limit: 16540)
Memory: 120.0K
CGroup: /system.slice/tftp.service
└─ 5797 /usr/sbin/in.tftpd -s /var/lib/pxe/tftpboot

янв 16 15:17:12 pxe-server systemd[1]: Started Tftp Server.

Помимо правки параметров доступа так же был изменен параметр SElinux, отвечающий за tftp, чтобы сервис мог работать из другого каталога. Для открытия сетевого доступа внесем изменения в файрвол:
[root@pxe-server ~]# firewall-cmd –permanent –add-service=tftp
success
[root@pxe-server ~]# firewall-cmd –reload
success
Первым образом доступным по сети будет openScaler 22.03-LTS-SP2 архитектуры x86_64, для этого подойдет установочный образ стандартного DVD, который должен быть доступен в ВМ. Произведем его монтирование и копирование всего содержимого в /var/lib/pxe/http:
[root@pxe-server ~]# mount /dev/sr0 /media/
mount: /media: WARNING: source write-protected, mounted read-only.
[root@pxe-server ~]# mkdir -p /var/lib/pxe/http/openScaler-22.03-SP2/x86_64
[root@pxe-server ~]# cp -a /media/* /var/lib/pxe/http/openScaler-22.03-SP2/x86_64
[root@pxe-server ~]# cp -a /media/.treeinfo
/var/lib/pxe/http/openScaler-22.03-SP2/x86_64/
[root@pxe-server ~]# cp -a /media/.discinfo
/var/lib/pxe/http/openScaler-22.03-SP2/x86_64/

Каталог для HTTP наполнен, теперь дело за TFTP:

[root@pxe-server ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/pxe/tftpboot/
[root@pxe-server ~]# cp /usr/share/syslinux/menu.c32 /var/lib/pxe/tftpboot/
[root@pxe-server ~]# cp /usr/share/syslinux/libcom32.c32 /var/lib/pxe/tftpboot/
[root@pxe-server ~]# cp /usr/share/syslinux/ldlinux.c32 /var/lib/pxe/tftpboot/
[root@pxe-server ~]# cp /usr/share/syslinux/libutil.c32 /var/lib/pxe/tftpboot/
[root@pxe-server ~]# mkdir /var/lib/pxe/tftpboot/pxelinux.cfg
[root@pxe-server ~]# mkdir -p /var/lib/pxe/tftpboot/images/openScaler-22.03-SP2/x86_64
[root@pxe-server ~]# cp /var/lib/pxe/http/openScaler-22.03-SP2/x86_64/isolinux/vmlinuz /var/lib/pxe/tftpboot/images/openScaler-22.03-SP2/x86_64/
[root@pxe-server ~]# cp /var/lib/pxe/http/openScaler-22.03-SP2/x86_64/isolinux/initrd.img /var/lib/pxe/tftpboot/images/openScaler-22.03-SP2/x86_64/

Создается файл /var/lib/pxe/tftpboot/pxelinux.cfg/default со следующим содержимым:
default menu.c32
prompt 0
timeout 600

menu title PXE Boot Options

label openScaler-x86
menu label openScaler 22.03 SP2 x86_64
kernel /images/openScaler-22.03-SP2/x86_64/vmlinuz
append initrd=/images/openScaler-22.03-SP2/x86_64/initrd.img ip=dhcp inst.repo=http://192.168.20.1/images/openScaler-22.03-SP2/x86_64/

Теперь необходимо настроить и запустить httpd, чтобы файлы установки стали доступны по сети, для этого добавить каталог /var/lib/pxe/http в конфигурацию httpd, в самом конце файла:
[root@pxe-server tftpboot]# vim /etc/httpd/conf/httpd.conf

Alias “/images” “/var/lib/pxe/http”

<Directory “/var/lib/pxe/http”>
AllowOverride None
Options Indexes FollowSymLinks
Require all granted
</Directory>


Теперь необходимо запустить сервис и сделать его доступным по сети:

[root@pxe-server tftpboot]# systemctl enable –now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@pxe-server tftpboot]# systemctl status httpd
● httpd.service – The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2024-01-17 11:00:16 MSK; 2min 36s ago
Docs: man:httpd.service(8)
Main PID: 7589 (httpd)
Status: “Total requests: 10; Idle/Busy workers 100/0;Requests/sec: 0.0671; Bytes served/sec: 93 B/sec”
Tasks: 177 (limit: 16540)
Memory: 33.3M
CGroup: /system.slice/httpd.service
├─ 7589 /usr/sbin/httpd -DFOREGROUND
├─ 7592 /usr/sbin/httpd -DFOREGROUND
├─ 7593 /usr/sbin/httpd -DFOREGROUND
├─ 7594 /usr/sbin/httpd -DFOREGROUND
└─ 7595 /usr/sbin/httpd -DFOREGROUND

янв 17 11:00:16 pxe-server systemd[1]: Starting The Apache HTTP Server…
янв 17 11:00:16 pxe-server httpd[7589]: AH00558: httpd: Could not reliably determine the server’s fully qualified domain name, using 172.17.1.48. Set the ‘ServerName’ directive globally to suppress this message
янв 17 11:00:16 pxe-server systemd[1]: Started The Apache HTTP Server.
[root@pxe-server tftpboot]# firewall-cmd –permanent –add-service=http
success
[root@pxe-server tftpboot]# firewall-cmd –reload
success
[root@pxe-server tftpboot]# chcon -R –reference=/var/www/html /var/lib/pxe/http

Видно что сервер запустился, попробуем создать ВМ с типом запуска MBR и посмотрим, что получилось:

Процесс получения сетевого адреса

Успешная загрузка загрузочного меню PXE

На рисунке ниже видно, что инсталлятор загружен с сетевого расположения:

Сетевой ресурс как источник установки

Загрузка в Legacy/MBR режиме настроена, теперь очередь за UEFI. Создаем каталог и копируем туда grub:
[root@pxe-server tftpboot]# mkdir /var/lib/pxe/tftpboot/EFI/
[root@pxe-server tftpboot]# cp /var/lib/pxe/http/openScaler-22.03-SP2/x86_64/EFI/BOOT/grubx64.efi /var/lib/pxe/tftpboot/EFI/

Создаем меню grub’а:
[root@pxe-server tftpboot]# vim /var/lib/pxe/tftpboot/EFI/grub.cfg
set timeout=60
menuentry ‘openScaler 22.03 SP2 x86_64’ {
  linuxefi /images/openScaler-22.03-SP2/x86_64/vmlinuz ip=dhcp inst.repo=http://192.168.20.1/images/openScaler-22.03-SP2/x86_64/
  initrdefi /images/openScaler-22.03-SP2/x86_64/initrd.img
}

Проверяем возможность загрузки из ВМ в режиме UEFI:

Загрузка в режиме PXE под UEFI

Меню grub в режиме UEFI

Инсталятор также успешно загрузился с сетевого источника

Настроенная связка позволить установить openScaler 22.03-SP2 в любом режиме на оборудование архитектуры x86_64, добавить другие версии и дистрибутивы можно аналогичным образом, путем копирования установочных дисков и добавления записей в конфигурационные файлы pxeconfig и grub.
Добавление поддержки архитектуры aarch64 начнем с получения установочного диска:
[root@pxe-server ~]# wget https://repo.openscaler.ru/openScaler-22.03-LTS-SP2/ISO/aarch64/openScaler-22.03-LTS-SP2-aarch64-dvd.iso

Смонтируем образ и скопируем данные с него:
[root@pxe-server ~]# umount /media/
[root@pxe-server ~]# mount openScaler-22.03-LTS-SP2-aarch64-dvd.iso -o loop,ro /media/
[root@pxe-server ~]# mkdir /var/lib/pxe/http/openScaler-22.03-SP2/aarch64
[root@pxe-server ~]# cp -a /media/* /var/lib/pxe/http/openScaler-22.03-SP2/aarch64/
[root@pxe-server ~]# cp -a /media/.treeinfo /var/lib/pxe/http/openScaler-22.03-SP2/aarch64/
[root@pxe-server ~]# cp -a /media/.discinfo /var/lib/pxe/http/openScaler-22.03-SP2/aarch64/

Подготовим данные для TFTP:
[root@pxe-server ~]# mkdir /var/lib/pxe/tftpboot/aarch64
[root@pxe-server ~]# mkdir /var/lib/pxe/tftpboot/images/openScaler-22.03-SP2/aarch64
[root@pxe-server ~]# cp /var/lib/pxe/http/openScaler-22.03-SP2/aarch64/images/pxeboot/vmlinuz /var/lib/pxe/tftpboot/images/openScaler-22.03-SP2/aarch64/
[root@pxe-server ~]# cp /var/lib/pxe/http/openScaler-22.03-SP2/aarch64/images/pxeboot/initrd.img /var/lib/pxe/tftpboot/images/openScaler-22.03-SP2/aarch64/
[root@pxe-server ~]# cp /var/lib/pxe/http/openScaler-22.03-SP2/aarch64/EFI/BOOT/grubaa64.efi /var/lib/pxe/tftpboot/aarch64/

Подготовим конфиг grub.cfg
[root@pxe-server ~]# vim /var/lib/pxe/tftpboot/aarch64/grub.cfg
set timeout=60
menuentry ‘openScaler 22.03 SP2 aarch64’ {
  linux /images/openScaler-22.03-SP2/aarch64/vmlinuz ip=dhcp inst.repo=http://192.168.20.1/images/openScaler-22.03-SP2/aarch64/
  initrd /images/openScaler-22.03-SP2/aarch64/initrd.img
}

Теперь добавим поддержку aarch64 в DHCP:
[root@pxe-server ~]# vim /etc/dhcp/dhcpd.conf
class “pxeclients” {
  match if substring (option vendor-class-identifier, 0, 9) = “PXEClient”;
  if option architecture-type = 00:00 {
    filename “pxelinux.0”;
  } elsif option architecture-type = 00:07 {
    filename “EFI/grubx64.efi”;
  } elsif option architecture-type = 00:0b {
    filename “aarch64/grubaa64.efi”;
  } else {
    filename “pxelinux.0”;
  }
}

И перезапустим DHCP:
[root@pxe-server ~]# systemctl restart dhcpd

Создаем ВМ архитектуры aarch64 и пробуем загрузится:

Загрузка aarch64 ВМ

Меню grub в режиме UEFI  на aarch64

Успешная загрузка инсталлятора с сетевого устройства на aarch64

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