Настройка iPXE-загрузки тонкого клиента

Загрузка тонких клиентов разделена на этапы:

  1. Получение от DHCP сервера информации с адресом TFTP сервера
  2. Загрузка с TFTP сервера iPXE клиента
  3. Загрузка iPXE клиентом сценария boot_scrept.ipxe
  4. Загрузка iPXE клиентом файлов с ОС
anatoliy@silenthost:~ % uname -or
FreeBSD 13.0-RELEASE-p6

Необходимо установить DHCP, HTTP сервера и пакеты ipxe, memtest86, включить службы autofs(автомонтирования) и inetd

root@silenthost:~ $ pkg info | egrep "isc-dhcp44-server|ipxe|memtest"
ipxe-g20210910,1               Open source network boot firmware
isc-dhcp44-server-4.4.2P1_1    ISC Dynamic Host Configuration Protocol server
memtest86-4.3.7                Stand-alone memory test for x86 architecture computers

root@silenthost:~ $ grep "tftpboot" /etc/fstab
/usr/local/share/ipxe           /var/tftpboot/ipxe                      nullfs  ro,noauto       0       0
/usr/local/share/memtest86      /var/tftpboot/boot/tools/memtest86      nullfs  ro,noauto       0       0
/usr/local/share/syslinux       /var/tftpboot/syslinux                  nullfs  ro,noauto       0       0

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

# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#
 
# option definitions common to all supported networks...
# option domain-name "silenthost.local";
# option domain-name-servers ns1.example.org, ns2.example.org;
# option domain-name-servers 8.8.8.8;
 
default-lease-time 86400; #24h
max-lease-time 604800; #7d
 
# Use this to enble / disable dynamic dns updates globally.
#ddns-update-style none;
ddns-update-style interim;
update-static-leases on;
 
# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;
 
class "pxeclients" {
        match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
 
        next-server 192.168.1.2;
        option tftp-server-name "192.168.1.2";
 
        if exists user-class and option user-class = "iPXE" {
                filename "http://192.168.1.2/boot/ipxe/boot_script.ipxe";
        } elsif substring (option vendor-class-identifier, 15, 5) = "00000" {
                filename "/ipxe/ipxe.pxe";
        } elsif substring (option vendor-class-identifier, 15, 5) = "00006" {
                filename "/ipxe/ipxe.efi";
        } elsif substring (option vendor-class-identifier, 15, 5) = "00007" {
                filename "/ipxe/ipxe.efi";
        } elsif substring (option vendor-class-identifier, 15, 5) = "00009" {
                filename "/ipxe/ipxe.efi";
        }
}
 
subnet 192.168.1.0 netmask 255.255.255.0 {
 range 192.168.1.128 192.168.1.254;
 option routers 192.168.1.2;
 option broadcast-address 192.168.1.255;
 option domain-name "silenthost.local";
 option domain-name-servers 192.168.1.2;
 option ntp-servers 192.168.1.2;
}

Для настройки DHCP сервера на ОС семейства Windows, необходимо предварительно добавить пользовательский класс iPXE:

Настройки TFTP сервера:

root@silenthost:~ $ grep tftp /etc/inetd.conf
tftp    dgram   udp     wait    root    /usr/libexec/tftpd      tftpd -l -s /var/tftpboot
#tftp   dgram   udp6    wait    root    /usr/libexec/tftpd      tftpd -l -s /tftpboot

Содержимое TFTP сервера:

anatoliy@silenthost:~ % tree /var/tftpboot
/var/tftpboot
├── boot
│   ├── ipxe
│   │   ├── boot_script.ipxe
│   ├── tools
│   │   └── memtest86
│   │       └── memtest86-usb.img
│   └── ts
│       ├── initrd
│       └── vmlinuz
└── ipxe
    ├── 10222000.rom
    ├── 15ad07b0.rom
    ├── 8086100f.mrom
    ├── 808610d3.mrom
    ├── ipxe.dsk
    ├── ipxe.efi-i386
    ├── ipxe.efi-i386.usb
    ├── ipxe.efi-x86_64
    ├── ipxe.efi-x86_64.usb
    ├── ipxe.iso
    ├── ipxe.lkrn
    ├── ipxe.pxe
    ├── ipxe.usb
    ├── snp.efi-i386
    ├── snp.efi-x86_64
    ├── snponly.efi-i386
    ├── snponly.efi-x86_64
    └── undionly.kpxe

iPXE сценарий:

$ cat /var/tftpboot/boot/ipxe/boot_script.ipxe
#!ipxe
 
set memtest86_img http://192.168.1.2/boot/tools/memtest86/memtest86-usb.img
set syslinux_memdisk http://192.168.1.2/syslinux/bios/memdisk/memdisk
set ts_initrd http://192.168.1.2/boot/ts/initrd
set ts_vmlinuz http://192.168.1.2/boot/ts/vmlinuz
 
menu Please choose an operating system to boot
item --key l local   Boot from local disk
item --gap Operating systems:
item --key 8 ts ThinStation
item --gap Tools:
item memtest86 Memtest86
item
item --key s shell (S)hell
item --key r reboot (R)eboot
 
choose --default local --timeout 3000 target && goto ${target}
 
:reboot
reboot
 
:shell
shell
 
:memtest86
kernel ${syslinux_memdisk}
initrd ${memtest86_img}
imgargs memdisk
boot

:ts
kernel ${ts_vmlinuz} initrd=initrd splash=silent,theme:default console=tty1 LM=3
initrd ${ts_initrd}
boot

Часть настроек HTTP-сервера:

http {
     # ...
     server {
        listen       192.168.1.2:80;
        server_name  localhost 192.168.1.2 _;
 
        # ...
        location /boot {
          root /var/tftpboot;
        }
        location /ipxe {
          root /var/tftpboot;
        }
        location /syslinux {
          root /var/tftpboot;
        }
    }
}

Полезные ссылки:

  1. https://ipxe.org/
  2. https://www.isc.org/dhcp/
  3. https://www.memtest86.com/
  4. https://www.nginx.com/

This entry was posted in FreeBSD, Net. Bookmark the permalink.

Leave a Reply