Загрузочный сервер PXE

Установка загрузочного сервера PXE.

Содержание

1 Общая настройка

2 Сетевые сервисы

2.1 tftp

  • Установите сервер tftp:
    1dnf -y install tftp-server
    
  • Настройте брандмауэр:
    1firewall-cmd --add-service=tftp --permanent
    2firewall-cmd --reload
    
  • Активируйте сервис:
    1systemctl enable --now tftp.socket
    

2.2 web-сервер

  • Для снижения нагрузки на tftp будем загружать образы по http.
  • Установим сервер nginx:
    1dnf -y install nginx
    
  • Настройте брандмауэр:
    1firewall-cmd --add-service=http --permanent
    2firewall-cmd --reload
    

2.2.1 Конфигурация

  • Создадим файл конфигурации /etc/nginx/conf.d/pxe.conf:
     1server {
     2    listen   80 default_server;
     3    listen       [::]:80;
     4    root /var/lib/tftpboot;
     5    server_name pxe.example.com;
     6
     7    location / {
     8    }
     9    index index.html index.htm;
    10    autoindex on;
    11
    12    # Load configuration files for the default server block.
    13    include /etc/nginx/default.d/*.conf;
    14}
    

2.2.2 SELinux

  • Зададим переключатели SELinux:
    1setsebool -P httpd_serve_cobbler_files 1
    2setsebool httpd_serve_cobbler_files 1
    
  • Создадим файл с описанием политики nginx-tftp.te:
     1module nginx-tftp 1.0;
     2
     3require {
     4        type httpd_t;
     5        type cobbler_var_lib_t;
     6        type tftpdir_rw_t;
     7        class dir read;
     8        class file { getattr open read };
     9        class lnk_file read;
    10}
    11
    12#============= httpd_t ==============
    13
    14#!!!! This avc is allowed in the current policy
    15allow httpd_t cobbler_var_lib_t:dir read;
    16
    17#!!!! This avc is allowed in the current policy
    18allow httpd_t tftpdir_rw_t:dir read;
    19
    20#!!!! This avc is allowed in the current policy
    21allow httpd_t tftpdir_rw_t:file { getattr open read };
    22allow httpd_t tftpdir_rw_t:lnk_file read;
    
  • Применим его:
    1semodule -i nginx-tftp.te
    

2.2.3 Запуск

  • Запустим nginx:
    1systemctl enable --now nginx.service
    

2.3 Настройки DHCP-сервера

2.3.1 Настройки сервера ISC DHCP

  • Настройки для сервера ISC DHCP.
  • Файл конфигурации /etc/dhcp/dhcpd.conf.
  • Настройка основных опций:
     1option pxe-system-type code 93 = unsigned integer 16;
     2option rfc3442-classless-static-routes code 121 = array of integer 8;
     3option ms-classless-static-routes code 249 = array of integer 8;
     4
     5option space pxelinux;
     6option pxelinux.magic code 208 = string;
     7option pxelinux.configfile code 209 = text;
     8option pxelinux.pathprefix code 210 = text;
     9option pxelinux.reboottime code 211 = unsigned integer 32;
    10option architecture-type   code 93 = unsigned integer 16;
    11option pxelinux.mtftp-ip    code 1 = ip-address;
    12option pxelinux.mtftp-cport code 2 = unsigned integer 16;
    13option pxelinux.mtftp-sport code 3 = unsigned integer 16;
    14option pxelinux.mtftp-tmout code 4 = unsigned integer 8;
    15option pxelinux.mtftp-delay code 5 = unsigned integer 8;
    
  • Необходимо также настроить next_server, который должен указывать на tftp-сервер:
    1next-server     10.100.0.1;
    

2.3.2 Настройки сервера ISC Kea DHCP

  • Настройки для сервера ISC Kea DHCP.
  • Файл конфигурации /etc/kea/kea-dhcp4.conf.
  • Необходимо также настроить next_server, который должен указывать на tftp-сервер:
    1{
    2    "Dhcp4": {
    3        "next-server": "10.100.0.1",
    4        ...
    5    }
    6}
    

3 Сетевые загрузчики

  • Возможно использовать любой сетевой загрузчик:
    • pxelinux
    • ipxe
    • grub2

3.1 pxelinux

3.1.1 Общая информация

3.1.2 Установка

  • Скачаем файлы для pxelinux:
    1cd /tmp
    2wget https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/Testing/6.04/syslinux-6.04-pre1.tar.xz
    3tar xJvf syslinux-6.04-pre1.tar.xz
    
  • Скопируем файлы в наш корень tftp:
    1mkdir -p /var/lib/tftpboot/boot/pxelinux/{bios,efi64,efi32}
    2find /tmp/syslinux-6.04-pre1/bios -regex  '.*\(c32\|0\)$' -exec cp '{}' /var/lib/tftpboot/boot/pxelinux/bios/ \;
    3find /tmp/syslinux-6.04-pre1/bios -name "memdisk" -type f -exec cp '{}' /var/lib/tftpboot/boot/pxelinux/bios/ \;
    4find /tmp/syslinux-6.04-pre1/efi32 -regex  '.*\(c32\|efi\)$' -exec cp '{}' /var/lib/tftpboot/boot/pxelinux/efi32 \;
    5find /tmp/syslinux-6.04-pre1/efi64 -regex  '.*\(c32\|efi\|e64\|elf\|lnx\)$' -exec cp '{}' /var/lib/tftpboot/boot/pxelinux/efi64 \;
    

3.1.3 Настройки DHCP-сервера

  1. Настройки сервера ISC DHCP

    • Настройки для сервера ISC DHCP.
    • Файл конфигурации /etc/dhcp/dhcpd.conf.
    • Настройка файлов загрузки:
       1option architecture-type code 93 = unsigned integer 16;
       2class "pxeclients" {
       3    match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
       4    if option architecture-type = 00:00 {
       5            filename "/boot/pxelinux/bios/lpxelinux.0";
       6        } elsif option architecture-type = 00:09 {
       7            filename "/boot/pxelinux/efi64/syslinux.efi";
       8        } elsif option architecture-type = 00:07 {
       9            filename "/boot/pxelinux/efi64/syslinux.efi";
      10        } elsif option architecture-type = 00:06 {
      11            filename "/boot/pxelinux/efi32/syslinux.efi";
      12        } else {
      13            filename "/boot/pxelinux/bios/lpxelinux.0";
      14        }
      15}
      
  1. Настройки сервера ISC Kea DHCP

    • Настройки для сервера ISC Kea DHCP.
    • Файл конфигурации /etc/kea/kea-dhcp4.conf.
    • Настройка файлов загрузки:
       1{
       2    "Dhcp4": {
       3        "client-classes": [
       4            {
       5                "name": "pxe-legacy",
       6                "test": "option[93].hex == 0x0000",
       7                "boot-file-name": "/boot/pxelinux/bios/lpxelinux.0"
       8            },
       9            {
      10                "name": "pxe-uefi",
      11                "test": "option[93].hex == 0x0009 or option[93].hex == 0x0007",
      12                "boot-file-name": "/boot/pxelinux/efi64/syslinux.efi"
      13            }
      14        ],
      15        ...
      16    }
      17}
      

3.1.4 Файл конфигурации pxelinux

  • Создать каталог /var/lib/tftpboot/boot/pxelinux/pxelinux.cfg/:
    1mkdir -p /var/lib/tftpboot/boot/pxelinux/pxelinux.cfg
    
  • Создадим файл /var/lib/tftpboot/boot/pxelinux/pxelinux.cfg/default
     1# -*- mode:conf -*-
     2default menu.c32
     3ontimeout chain.c32 hd0
     4timeout 100
     5prompt 0
     6implicit 1
     7
     8NOESCAPE 1
     9ALLOWOPTIONS 0
    10
    11say Enter command line for bootup:
    12menu title Syslinux Bootup
    13label disk
    14menu label ^Boot from local drive
    15menu default
    16     kernel chain.c32
    17     append hd0
    
  • Создадим символические ссылки для разного типа загрузки:
    1ln -s /var/lib/tftpboot/boot/pxelinux/pxelinux.cfg /var/lib/tftpboot/boot/pxelinux/bios/pxelinux.cfg
    2ln -s /var/lib/tftpboot/boot/pxelinux/pxelinux.cfg /var/lib/tftpboot/boot/pxelinux/efi64/pxelinux.cfg
    3ln -s /var/lib/tftpboot/boot/pxelinux/pxelinux.cfg /var/lib/tftpboot/boot/pxelinux/efi32/pxelinux.cfg
    

3.2 ipxe

3.2.1 Настройки DHCP-сервера

  • Настройки для сервера ISC DHCP.
  • Файл конфигурации /etc/dhcp/dhcpd.conf.
  • Настройка файлов загрузки:
    1option architecture-type code 93 = unsigned integer 16;
    2class "pxeclients" {
    3    match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
    4    if option architecture-type != 00:00 {
    5            filename "/boot/ipxe/ipxe.efi";
    6        } else {
    7            filename "/boot/ipxe/undionly.kpxe";
    8        }
    9}
    

3.3 grub2

3.3.1 Установка

  • Установим необходимые пакеты для grub2:
    1dnf -y install grub2-efi-x64-modules grub2-tools-extra grub2-pc-modules
    
  • Установим файлы в каталог tftpd:
    1grub2-mknetdir --net-directory=/var/lib/tftpboot/
    2restorecon -vR /var/lib/tftpboot
    
  • Можно также внедрить все модули в загружаемый файл (скорее, для отладки):
    1grub2-mkimage -O x86_64-efi -o /var/lib/tftpboot/boot/grub2/x86_64-efi/core.efi --prefix='' /var/lib/tftpboot/boot/grub2/x86_64-efi/*.mod
    

3.3.2 Настройки DHCP-сервера

  • Настройки для сервера ISC DHCP.
  • Файл конфигурации /etc/dhcp/dhcpd.conf.
  • Настройка файлов загрузки:
     1option architecture-type code 93 = unsigned integer 16;
     2class "pxeclients" {
     3    match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
     4    if option architecture-type = 00:07 {
     5            filename "boot/grub2/x86_64-efi/core.efi";
     6        } else if option architecture-type = 00:08 {
     7            filename "boot/grub2/x86_64-efi/core.efi";
     8        } else if option architecture-type = 00:09 {
     9            filename "boot/grub2/x86_64-efi/core.efi";
    10        } else if option architecture-type = 00:0a {
    11            # ArmHFP
    12            filename "boot/grub2/armv7a-efi/core.efi";
    13        } else if option architecture-type = 00:0b {
    14            # aarch64
    15            filename "boot/grub2/aarch64-efi/core.efi";
    16        } else {
    17            # BIOS boot
    18            filename "boot/grub2/i386-pc/core.0";
    19        }
    20}
    

3.3.3 Файл конфигурации grub

  • Создадим основной файл конфигурации:
    1touch /var/lib/tftpboot/boot/grub2/grub.cfg
    
  • Создадим в нём базовую конфигурацию:
    1set default=0
    2set timeout=60
    3
    4menuentry 'Local Boot' {
    5    exit
    6}
    
  • Создадим символическую ссылку на этот файл в каждом каталоге, содержащим core.*:
    1cd /var/lib/tftpboot/boot/grub2/x86_64-efi; ln -snf ../grub.cfg
    2cd /var/lib/tftpboot/boot/grub2/i386-pc; ln -snf ../grub.cfg
    
  • Можно добавить дополнительные пункты (скорее для забавы):
     1menuentry 'EFI Firmware System Setup' $menuentry_id_option 'uefi-firmware' {
     2  fwsetup
     3}
     4
     5menuentry 'Reboot' {
     6  reboot
     7}
     8
     9menuentry 'Shutdown' {
    10  halt
    11}
    

4 Приложения

4.1 Memtest86+

  • Сайт: https://memtest.org/
  • Скачайте необходимую версию:
    1mkdir -p /var/lib/tftpboot/utils/memtest
    2cd /var/lib/tftpboot/utils/memtest
    3wget https://memtest.org/download/v6.20/mt86plus_6.20.binaries.zip
    4unzip mt86plus_6.20.binaries.zip
    5rm mt86plus_6.20.binaries.zip
    

4.1.1 pxelinux

  • Конфигурация для загрузки memtest86+ будет следующей:
    1label memtest
    2menu label Memory test
    3    kernel utils/memtest/memtest64.bin
    

4.1.2 grub

  • Конфигурация для загрузки memtest86+ будет следующей:
    1menuentry "Memory test" --class tools {
    2    if [ "${grub_platform}" = pc ]; then
    3        linux (http)/utils/memtest/memtest64.bin
    4    else
    5        linuxefi (http)/utils/memtest/memtest64.efi
    6    fi
    7}
    

5 Дистрибутивы Linux

5.1 Fedora

5.1.1 Grub

  • Файл конфигурации будет следующим:
     1submenu 'Fedora Linux' --class fedora --class gnu-linux --class gnu --class os {
     2
     3   menuentry 'Install Fedora Linux (EFI)' --class fedora --class gnu-linux --class gnu --class os {
     4     linuxefi fedora-x86_64/vmlinuz inst.repo=http://dl.fedoraproject.org/pub/fedora/linux/releases/39/Everything/x86_64/os inst.stage2=http://dl.fedoraproject.org/pub/fedora/linux/releases/39/Everything/x86_64/os ip=dhcp
     5     initrdefi fedora-x86_64/initrd.img
     6   }
     7   menuentry 'Install Fedora Linux (Classic)' --class fedora --class gnu-linux --class gnu --class os {
     8     linux16 fedora-x86_64/vmlinuz inst.repo=http://dl.fedoraproject.org/pub/fedora/linux/releases/39/Everything/x86_64/os/ inst.stage2=http://dl.fedoraproject.org/pub/fedora/linux/releases/39/Everything/x86_64/os/ ip=dhcp
     9     initrd16 fedora-x86_64/initrd.img
    10   }
    11   menuentry 'Install Fedora Linux (ARM)' --class fedora --class gnu-linux --class gnu --class os {
    12     linux fedora-aarch64/vmlinuz inst.repo=http://dl.fedoraproject.org/pub/fedora/linux/releases/39/Everything/aarch64/os/ inst.stage2=http://dl.fedoraproject.org/pub/fedora/linux/releases/39/Everything/aarch64/os/ ip=dhcp
    13     initrd fedora-aarch64/initrd.img
    14   }
    15}
    

No notes link to this note

Дмитрий Сергеевич Кулябов
Дмитрий Сергеевич Кулябов
Профессор кафедры теории вероятностей и кибербезопасности

Мои научные интересы включают физику, администрирование Unix и сетей.

Похожие