Загрузка тонких клиентов разделена на этапы:
- Получение от DHCP сервера информации с адресом TFTP сервера
- Загрузка с TFTP сервера iPXE клиента
- Загрузка iPXE клиентом сценария boot_scrept.ipxe
- Загрузка 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;
}
}
}
Полезные ссылки: