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.)

PXE-Struktur
PXE-Struktur

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