Тук ще покажем простичко инсталиране и дефиниране на PXE сървър за клиенти с UEFI.
Модулите които ще инсталираме са нужни както при инсталирането на машини с Linux така и с Windows.
apt install syslinux-common syslinux-efi isc-dhcp-server tftpd-hpa See "systemctl status isc-dhcp-server.service" and "journalctl -xe" for details. invoke-rc.d: initscript isc-dhcp-server, action "start" failed. ● isc-dhcp-server.service - LSB: DHCP server Loaded: loaded (/etc/init.d/isc-dhcp-server; generated) Active: failed (Result: exit-code) since Fri 2023-02-17 13:43:14 EST; 4ms a go Docs: man:systemd-sysv-generator(8) Process: 1135 ExecStart=/etc/init.d/isc-dhcp-server start (code=exited, stat us=1/FAILURE) CPU: 17ms Feb 17 13:43:12 pxe dhcpd[1150]: before submitting a bug. These pages explain the proper Feb 17 13:43:12 pxe dhcpd[1150]: process and the information we find helpful for debugging. Feb 17 13:43:12 pxe dhcpd[1150]: Feb 17 13:43:12 pxe dhcpd[1150]: exiting. Feb 17 13:43:14 pxe isc-dhcp-server[1135]: Starting ISC DHCPv4 server: dhcpdchec k syslog for diagnostics. ... Feb 17 13:43:14 pxe isc-dhcp-server[1155]: failed! Feb 17 13:43:14 pxe isc-dhcp-server[1156]: failed! Feb 17 13:43:14 pxe systemd[1]: isc-dhcp-server.service: Control process exited, code=exited, status=1/FAILURE Feb 17 13:43:14 pxe systemd[1]: isc-dhcp-server.service: Failed with result 'exit-code'. Feb 17 13:43:14 pxe systemd[1]: Failed to start LSB: DHCP server. Processing triggers for libc-bin (2.31-13+deb11u5) ... Processing triggers for man-db (2.9.4-2) ...
syslinux-common - PEX сървър, основните модули syslinux-efi - PEX сървър модул за UEFI isc-dhcp-server - DHCP сървър tftpd-hpa - TFTP сървър Не обърщайте внимание на грешките. DHCP сървъра не е настроен и затова дава грешки. За сега просто ще го спрем.
service isc-dhcp-server stop
Подготвяме се за дефиниране на PXE сървъра. Създаваме папка където ще се разполагат файловете за споделяне от TFTP сървъра. Всяка ОС която ще споделяте за инсталиране по мрежата ще се намира тук.
mkdir /tftpboot
В тази папка трябва да бъдат и модулите на syslinux за зареждане на различните видове ОС, примерно за EFI.
cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /tftpboot cp /usr/lib/syslinux/modules/efi64/libutil.c32 /tftpboot cp /usr/lib/syslinux/modules/efi64/menu.c32 /tftpboot cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /tftpboot ls -l /tftpboot total 360 -rw-r--r-- 1 root root 136880 Feb 17 14:08 ldlinux.e64 -rw-r--r-- 1 root root 23840 Feb 17 14:10 libutil.c32 -rw-r--r-- 1 root root 31592 Feb 17 14:11 menu.c32 -rw-r--r-- 1 root root 171456 Feb 17 14:14 syslinux.efi
Забележете за сега сложихме само модулите за поддръжка на UEFI. За BIOS ще покажа в друга статия. За да имаме меню при стартиране по мрежата, ще създадем папка в /tftpboot
mkdir /tftpboot/pxelinux.cfg
В груб вариант сме готови. Сега трябва да настроим TFTP сървъра. Казахме, че той ще споделя файловете по мрежата за отдалечено стартиране или инсталиране на ОС. Самата му настройка е много лесна:
nano /etc/default/tftpd-hpa # /etc/default/tftpd-hpa TFTP_USERNAME="tftp" TFTP_DIRECTORY="/tftpboot" TFTP_ADDRESS=":69" TFTP_OPTIONS="--secure"
Забележете услугата работи на порт 69. Ако имате защитна стена отворете този порт. Особено е важно ако ползвате сървър на Ubuntu. Командата за Ubuntu e:
sudo ufw status sudo ufw list sudo ufw 69/udp allow
За Debian това не важи, освен ако не сте сложили допълнително защитна стена. Да стартираме услугата TFTP.
service tftpd-hpa start service tftpd-hpa status ● tftpd-hpa.service - LSB: HPA's tftp server Loaded: loaded (/etc/init.d/tftpd-hpa; generated) Active: active (running) since Fri 2023-02-17 13:43:12 EST; 45min ago Docs: man:systemd-sysv-generator(8) Tasks: 1 (limit: 4674) Memory: 668.0K CPU: 7ms CGroup: /system.slice/tftpd-hpa.service └─1097 /usr/sbin/in.tftpd --listen --user tftp --address :69 --secure /sr> Feb 17 13:43:12 pxe systemd[1]: Starting LSB: HPA's tftp server... Feb 17 13:43:12 pxe tftpd-hpa[1090]: Starting HPA's tftpd: in.tftpd. Feb 17 13:43:12 pxe systemd[1]: Started LSB: HPA's tftp server.
Услугата работи без грешка. За да може клиента да се свързва към сървъра ще е необходимо DHCP сървър даващ му IP в същата мрежа. Имаме инсталиран DHCP сървър но не е настроен. Ако имате DHCP в мрежата, може да го използвате. Ако пък нямате може да се дефинира. Ще покаже един смесен вариант. Имаме DHCP, ще го ползваме, но ако нямаме това пак ще работи.
nano /etc/dhcp/dhcpd.conf #My subnet configuration subnet 10.25.0.0 netmask 255.255.248.0 { range 10.25.0.70 10.25.0.80; option routers 10.25.0.1; default-lease-time 3600; max-lease-time 86400; next-server 10.25.0.22; option bootfile-name "syslinux.efi"; } authoritative; # option definitions common to all supported networks... option domain-name "example.org"; # option domain-name-servers ns1.example.org, ns2.example.org; option domain-name-servers 1.1.1.1, 1.0.0.1; # default-lease-time 600; # max-lease-time 7200;
До тук: - Дефинирахме DHCP да работи в мрежа 10.25.0.0 с маска 255.255.248.0 - Ще се раздават адреси от 10.25.0.70 до 10.25.0.80. Рутера който имаме в мрежата също раздава адреси но от 10.25.0.70 до 10.25.0.90. На практика нашия DHCP раздава адреси в пула на DHCP на рутера. - Казваме, че руера с IP 10.25.0.1 също раздава адреси и той е водещ. - Следващия DHCP сървър с IP 10.25.0.22 (нашия) ще се ръководи от рутерския DHCP и ще е вторичен. - option bootfile-name "syslinux.efi" - когато клиента се стартира по мрежата ще му се появи меню което ще дефинираме в тоя файл. Имаме още работа в настройката на DHCP сървъра.
ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:e8:e8:db brd ff:ff:ff:ff:ff:ff altname enp2s0 inet 10.25.0.22/21 brd 10.25.7.255 scope global ens32 valid_lft forever preferred_lft forever inet 10.25.0.86/21 brd 10.25.7.255 scope global secondary dynamic ens32 valid_lft 368sec preferred_lft 368sec inet6 fe80::20c:29ff:fee8:e8db/64 scope link valid_lft forever preferred_lft forever
Запомнете името на мрежовия интерфейс ens32 и съответния IP адрес който има. Продължаваме с настройката на DHCP сървъра.
nano /etc/default/isc-dhcp-server # On what interfaces should the DHCP server (dhcpd) serve DHCP requests? # Separate multiple interfaces with spaces, e.g. "eth0 eth1". INTERFACESv4="ens32" INTERFACESv6=""
Указваме на кой интерфейс на сървъра ще работи DHCP услугата. В случая имаме един интерфейс и той е ens32. Сега още нещо ще трябва да дефинираме в DHCP сървъра. Ще обвържем IP адреси с MAC адреси. Първия ще е интерфейса ens32. Ако адреса му беше в пула с раздаване на адреси за да се изключи раздаването на неговия адрес твърдо ще укажем на този MAC трябва да се присвои това IP. Да го направим.
ip link show ens32 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 00:0c:29:e8:e8:db brd ff:ff:ff:ff:ff:ff nano /etc/dhcp/dhcpd.conf # option definitions common to all supported networks... option domain-name "example.org"; option domain-name-servers ns1.example.org, ns2.example.org; host pxe { hardware ethernet 00:0c:29:e8:e8:db; fixed-address 10.25.0.22; } default-lease-time 600; max-lease-time 7200;
Първо видяхме интерфейса ens32 какъв MAC адрес има. След това казахме за хоста phe с мрежови интерфейс с МАС адрес 00:0c:29:e8:e8:db да се присвои IP адрес 10.25.0.22. Така никой друг няма да може да има IP адрес 10.25.0.22. Ако искате още някой да дефинирате с твърд адрес то това е начина. Добавяте отдолу още една дефиниция (host име {....}). Ами готови сме. Да рестартираме DHCP сървъра.
service isc-dhcp-server restart service isc-dhcp-server status ● isc-dhcp-server.service - LSB: DHCP server Loaded: loaded (/etc/init.d/isc-dhcp-server; generated) Active: active (running) since Fri 2023-02-17 15:44:00 EST; 8s ago Docs: man:systemd-sysv-generator(8) Process: 2380 ExecStart=/etc/init.d/isc-dhcp-server start (code=exited, status=0/SUCCESS) Tasks: 4 (limit: 4674) Memory: 4.9M CPU: 20ms CGroup: /system.slice/isc-dhcp-server.service └─2395 /usr/sbin/dhcpd -4 -q -cf /etc/dhcp/dhcpd.conf ens32 Feb 17 15:43:58 pxe systemd[1]: Starting LSB: DHCP server... Feb 17 15:43:58 pxe isc-dhcp-server[2380]: Launching IPv4 server only. Feb 17 15:43:58 pxe dhcpd[2395]: Wrote 0 deleted host decls to leases file. Feb 17 15:43:58 pxe dhcpd[2395]: Wrote 0 new dynamic host decls to leases file. Feb 17 15:43:58 pxe dhcpd[2395]: Wrote 0 leases to leases file. Feb 17 15:43:58 pxe dhcpd[2395]: Server starting service. Feb 17 15:44:00 pxe isc-dhcp-server[2380]: Starting ISC DHCPv4 server: dhcpd. Feb 17 15:44:00 pxe systemd[1]: Started LSB: DHCP server.
Всичко е наред. Да тестваме и PXE сървъра. Ще инсталираме по мрежата Debian 11 netinst. За целта смъкваме ISO файла в папка /home/името на потребителя с който работим.
cd ~/ wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-11.6.0-amd64-netinst.iso --2023-02-17 15:51:59-- https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-11.6.0-amd64-netinst.iso Resolving cdimage.debian.org (cdimage.debian.org)... 194.71.11.173, 194.71.11.165, 194.71.11.163, ... Connecting to cdimage.debian.org (cdimage.debian.org)|194.71.11.173|:443... connected. HTTP request sent, awaiting response... 302 Found Location: https://gemmei.ftp.acc.umu.se/debian-cd/current/amd64/iso-cd/debian-11.6.0-amd64-netinst.iso [following] --2023-02-17 15:51:59-- https://gemmei.ftp.acc.umu.se/debian-cd/current/amd64/iso-cd/debian-11.6.0-amd64-netinst.iso Resolving gemmei.ftp.acc.umu.se (gemmei.ftp.acc.umu.se)... 194.71.11.137, 2001:6b0:19::137 Connecting to gemmei.ftp.acc.umu.se (gemmei.ftp.acc.umu.se)|194.71.11.137|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 406847488 (388M) [application/x-iso9660-image] Saving to: ‘debian-11.6.0-amd64-netinst.iso’ debian-11.6.0-amd64-netinst. 100%[===========================================>] 388.00M 11.1MB/s in 37s 2023-02-17 15:52:37 (10.5 MB/s) - ‘debian-11.6.0-amd64-netinst.iso’ saved [406847488/406847488] ls -l /root total 397312 -rw-r--r-- 1 root root 406847488 Dec 17 07:26 debian-11.6.0-amd64-netinst.iso
Готово, ISO файла е тук. За да може да работим с него ще го монтираме в /mnt.
mount /root/debian-11.6.0-amd64-netinst.iso /mnt mount: /mnt: WARNING: source write-protected, mounted read-only.
Файловете в debian....iso са ни нужни в отделна папка в /tftpboot. За целта първо ще я създадем.
mkdir /tftpboot/debian
И сега вътре да прехвърлим файловете от ISO-то.
cp -r /mnt/* /tftpboot/debian ls -l /tftpboot/debian/ total 728 -r--r--r-- 1 root root 146 Feb 17 16:00 autorun.inf dr-xr-xr-x 3 root root 4096 Feb 17 16:00 boot dr-xr-xr-x 2 root root 4096 Feb 17 16:00 css lrwxrwxrwx 1 root root 1 Feb 17 16:00 debian -> . dr-xr-xr-x 3 root root 4096 Feb 17 16:00 dists dr-xr-xr-x 4 root root 4096 Feb 17 16:00 doc dr-xr-xr-x 4 root root 4096 Feb 17 16:00 EFI dr-xr-xr-x 3 root root 4096 Feb 17 16:00 firmware -r--r--r-- 1 root root 184032 Feb 17 16:00 g2ldr -r--r--r-- 1 root root 8192 Feb 17 16:00 g2ldr.mbr dr-xr-xr-x 2 root root 4096 Feb 17 16:00 install dr-xr-xr-x 4 root root 4096 Feb 17 16:00 install.amd dr-xr-xr-x 2 root root 4096 Feb 17 16:00 isolinux -r--r--r-- 1 root root 92460 Feb 17 16:00 md5sum.txt dr-xr-xr-x 2 root root 4096 Feb 17 16:00 pics dr-xr-xr-x 3 root root 4096 Feb 17 16:00 pool -r--r--r-- 1 root root 8509 Feb 17 16:00 README.html -r--r--r-- 1 root root 291 Feb 17 16:00 README.mirrors.html -r--r--r-- 1 root root 86 Feb 17 16:00 README.mirrors.txt -r--r--r-- 1 root root 543 Feb 17 16:00 README.source -r--r--r-- 1 root root 5192 Feb 17 16:00 README.txt -r--r--r-- 1 root root 364571 Feb 17 16:00 setup.exe dr-xr-xr-x 2 root root 4096 Feb 17 16:00 tools -r--r--r-- 1 root root 233 Feb 17 16:00 win32-loader.ini
Файловете са прехвърлени. Сега да създадем файл с меню. Там ще се дефинира какво ще инсталираме и от къде.
nano /tftpboot/pxelinux.cfg/default UI menu.c32 LABEL Debian Net Boot MENU LABEL Debian KERNEL debian/install.amd/vmlinuz append initrd=debian/install.amd/initrd.gz TEXT HELP The debian minimal install! ENDTEXT
Готови сме за тест. Примерно от виртуална машина, или от физическа ще се стартираме по мрежата. Няколко грешки. Забравили сме да рестартираме TFTP сървъра.
service tftpd-hpa restart
Всичко тръгва нормално до момента на зареждане на ядрото на Debian.
Loading menu .32... failed: No such file or directory Loading menu .32... failed: No such file or directory boot:
Ако напишем Debian и натиснем Enter всичко тръгва, но това означава, че файла Меню нещо сме го объркали.
DHCP 192.168.0.1 (pull 110-199 DNS 1.1.1.1)