Die nachfolgende Erklärung beschreibt die Installation und Konfiguration eines PXE-Servers und basiert zu großen Teil auf Informationen von hier und weiteren Netzfundstellen.
Für die Geraer Teilnahme an der bundesweiten Hey, Alter!-Aktion haben wir uns (aus blanker, technischer Neugier) dazu entschlossen, nicht einfach auf das Aufsetzen der PCs per USB-Stick (Ventoy ist sehr empfehlenswert für die Erstellung von Multiboot-USB-Sticks) zu setzen.
Stattdessen wollten wir das ganze automatisiert per PXE-Server umsetzen und weitere Anpassungen vornehmen.
Das (über Gitlab) bereitgestellte Image sollte nicht verändert, das Endergebnis aber trotzdem für Thüringer Umstände (bspw. das Vorhandensein einer Schulcloud) angepasst sein.
schematische Netzstruktur
(Unsere reale Netzstruktur sieht anders aus. Es sind nur die relevanten Teile dargestellt und das ganze noch etwas vereinfacht.)
Grundidee
- manueller Download des "Hey, Alter!"-ISOs
- Einbindung/mount ins Dateisystem
- Anpassung der PXE-grub-Konfiguration
- Anpassung von zusätzlichen Startskripten usw., separate/eigene preseed-Datei
Vorbereitung des Servers(UEFI ist vorbereitet, aber ungetestet)
apt install openssh-server mc nmap net-tools screen nginx nfs-kernel-server dnsmasq qemu-guest-agent
zusätzliche Pfade
mkdir /tftp /tftp/bios /tftp/boot /tftp/grub /tftp/bios/pxelinux.cfg mkdir /var/www/html /var/www/html/iso mkdir /var/www/html/IRGENDWAS
PXE
nano /tftp/bios/pxelinux.cfg/default DEFAULT menu.c32 NU TITLE ULTIMATE PXE SERVER - By Griffon - Ver 2.0 PROMPT 0 TIMEOUT 0 MENU COLOR TABMSG 37;40 #ffffffff #00000000 MENU COLOR TITLE 37;40 #ffffffff #00000000 MENU COLOR SEL 7 #ffffffff #00000000 MENU COLOR UNSEL 37;40 #ffffffff #00000000 MENU COLOR BORDER 37;40 #ffffffff #00000000
NFS
nano /etc/exports /var/www/html/linuxmint/20.3 192.168.0.0/16(ro,no_subtree_check,no_root_squash,async,all_squash) /var/www/html/heyalter 192.168.0.0/16(ro,no_subtree_check,no_root_squash,async,all_squash) /var/www/html/iso 192.168.0.0/16(ro,no_subtree_check,no_root_squash,async,all_squash)
fstab
nano /etc/fstab /var/www/html/heyalter-setup_extensions /var/www/html/heyalter/setup/setup_extensions none bind 0 0
Syslinux
mkdir -p ~/Downloads/syslinux cd ~/Downloads/syslinuxwget https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.03.zip unzip syslinux-6.03.zip
cp ~/Downloads/syslinux/bios/com32/elflink/ldlinux/ldlinux.c32 /tftp/bios cp ~/Downloads/syslinux/bios/com32/libutil/libutil.c32 /tftp/bios cp ~/Downloads/syslinux/bios/com32/menu/menu.c32 /tftp/bios cp ~/Downloads/syslinux/bios/com32/menu/vesamenu.c32 /tftp/bios cp ~/Downloads/syslinux/bios/core/pxelinux.0 /tftp/bios cp ~/Downloads/syslinux/bios/core/lpxelinux.0 /tftp/bios
grub
UEFI
apt-get download shim.signed apt-get download grub-efi* apt-get download grub-efi-amd-signed #dpkg -x <%name of deb package%> shim #dpkg -x <%name of deb package%> grub dpkg -x shim-signed_1.38+15.4-7_amd64.deb shim dpkg -x grub-efi-amd64-signed_1+2.04+20_amd64.deb grub cp ~/Downloads/shim/usr/lib/shim/shimx64.efi.signed /tftp/grub/bootx64.efi cp ~/Downloads/grub/usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed /tftp/grubx64.efi
Firewall eventuell unnötig
nano /etc/hosts.allow portmap: 192.168.90.0/24 nano /etc/hosts.deny portmap: ALL
für Hey, Alter! (das läuft noch nicht!)
Um das fertige Image anzupassen, werden hooks verwendet, die direkt in der setup.sh des Images mit übergeben bzw. angesteuert werden.
Die Skripte überlagern das gemountete (schreibgeschützte) Image.
# Vergeben eines eindeutigen Hostnamens
nano /var/www/html/heyalter-setup_extensions/10-hostname.sh
#!/usr/bin/sh
sudo hostnamectl set-hostname "heyalter-gera-`ip a|grep ether|head -n 1 | sed 's/ *$//g' | sed 's/^ *//g' | cut -d" " -f2 | sed 's/://g'`"
# Installieren eines Inventarisierers
nano /var/www/html/heyalter-setup_extensions/20-fusioninventory.sh
#!/usr/bin/sh
sudo apt install fusioninventory-agent -y
sudo fusioninventory-agent --server=https://ticket.ffggrz.de/plugins/fusioninventory/ --tag="Hey, Alter!"
# Deinstallieren von unbenötigter Software
nano /var/www/html/heyalter-setup_extensions/30-uninstall.sh
#!/usr/bin/sh
#apt remove zoom teams teams-for-linux telegram skype discord
sudo snap remove discord
sudo snap remove skype
sudo snap remove teams
sudo snap remove teams-for-linux
sudo snap remove telegram-desktop
sudo snap remove zoom-client
Für jede neue ISO (händische Lösung)
cd /var/www/html/iso
wget https://ftp.fau.de/mint/iso/stable/20.3/linuxmint-20.3-xfce-64bit.iso mkdir -p /var/www/html/linuxmint/20.3
nano /etc/fstab /var/www/html/iso/linuxmint-20.3-xfce-64bit.iso /var/www/html/linuxmint/20.3/ iso9660 loop 0 0
mkdir -p /tftp/bios/boot/casper cp /var/www/html/linuxmint/20.3/casper/vmlinuz /tftp/boot/casper cp /var/www/html/linuxmint/20.3/casper/initrd /tftp/boot/casper
ln -s /tftp/boot /tftp/bios/boot nano /tftp/bios/pxelinux.cfg/default #LABEL LinuxMint-20.3-XFCE-ISO
LABEL LinuxMint-20.3-XFCE-ISO
MENU LABEL Linux Mint 20.3 XFCE - Autoinstall
KERNEL /boot/dist/linuxmint/20.3/casper/vmlinuz
INITRD /boot/dist/linuxmint/20.3/casper/initrd.lz
APPEND netboot=nfs ip=dhcp boot=casper nfsroot=192.168.90.11:/var/www/html/linuxmint/20.3 url=http://192.168.90.11/_preseed/linuxmint.seed automatic-ubiquity locale=de_DE keyboard-configuration/layoutcode=de console-setup/layoutcode=de netcfg/get_hostname=install netcfg/get_domain=install
Einrichtung per Halbautomatik
# nur die entpackte Datei verwenden/verlinken export src=https://gitli.stratum0.org/heyalter/heyalter-ubuntu-iso/-/jobs/3228/artifacts/raw/artifacts/heyalter-master-20220303-b170-e3d2fa90.iso export dest=heyalter #export base=`basename ${src}` export base=${dest}-`date +%Y%m%d` cd /var/www/html/iso wget ${src} -O ${base}.iso
mkdir -p /var/www/html/${dest}
umount -lf /var/www/html/${dest} echo "/var/www/html/iso/${base}.iso /var/www/html/${dest} iso9660 loop 0 0" >> /etc/fstab
# anschließend den bisherige loop-Eintrag löschen
nano /etc/fstab
/var/www/html/heyalter-setup_extensions /var/www/html/heyalter/setup/setup_steps none bind 0 0
# aktuelle Installationsschritte kopieren
cp /var/www/html/heyalter/setup/setup_steps/*.sh /var/www/html/heyalter-setup_extensions/
# eigene und mitgelieferte Schritte einbinden
mount -o bind /var/www/html/heyalter-setup_extensions/ /var/www/html/heyalter/setup/setup_steps/
cp /var/www/html/${dest}/preseed/ubuntu.seed /var/www/html/${dest}.seed
#/var/www/html/${dest}/preseed/ubuntu.seed # Pfade (kernel, initrd) ggf. noch anpassen echo "LABEL ${base}" >> /tftp/bios/pxelinux.cfg/default echo " MENU LABEL Wipe disk and install ${base}" >> /tftp/bios/pxelinux.cfg/default echo " KERNEL /boot/dist/${dest}/casper/vmlinuz" >> /tftp/bios/pxelinux.cfg/default echo " INITRD /boot/dist/${dest}/casper/initrd" >> /tftp/bios/pxelinux.cfg/default echo " APPEND netboot=nfs ip=dhcp boot=casper nfsroot=192.168.90.11:/var/www/html/${dest} url=http://192.168.90.11/${dest}/preseed/ubuntu.seed locale=de_DE keyboard-configuration/modelcode=SKIP automatic-ubiquity console-setup/layoutcode=de netcfg/get_hostname=install netcfg/get_domain=install" >> /tftp/bios/pxelinux.cfg/default