Fullmoon System

PXE und Kickstart einrichten: Rocky Linux 9 unbeaufsichtigt per UEFI installieren

EdwardMoon

Dieser Artikel beschreibt UEFI-x86_64-Clients, die signierte shim- und GRUB-Dateien sowie den Kernel über PXE/TFTP beziehen und den Rocky-Linux-Installationsbaum und die Kickstart-Datei über HTTP laden. UEFI HTTP Boot und Legacy BIOS benötigen andere Bootdateien und DHCP-Verzweigungen. Sie müssen gesondert eingerichtet werden und sind nicht Bestandteil dieses Beispiels.

Als Beispiel dient Rocky Linux 9.8. Kernel, initrd und Paketbaum des Installationsmediums müssen zwingend aus derselben Version stammen. Da DHCP das gesamte Netzwerk beeinflusst, testen Sie zuerst in einem isolierten VLAN ohne Überschneidung mit dem produktiven DHCP-Dienst.

Komponenten der PXE-/Kickstart-Umgebung

Komponente Aufgabe Betriebliche Anforderungen
DHCP IP-Adresse, Bootdatei und Bootserver mitteilen Keine konkurrierende DHCP-Zuständigkeit erzeugen
TFTP/PXE UEFI-shim, GRUB, Kernel und initrd übertragen Nur kleine Bootdateien bereitstellen
HTTP Installationsbaum und ks.cfg bereitstellen Zugriffsprotokolle führen und Erreichbarkeit begrenzen
Kickstart Antworten für das Anaconda-Installationsprogramm automatisieren Prüfen, versionieren und Geheimnisse getrennt verwalten

Schritt 1: ISO prüfen und den Installationsbaum vorbereiten

# Zuerst das offizielle Rocky-9.8-x86_64-DVD-ISO in das aktuelle Verzeichnis herunterladen.
curl --fail --location --remote-name https://download.rockylinux.org/pub/rocky/9.8/isos/x86_64/CHECKSUM
test -f Rocky-9.8-x86_64-dvd.iso
sha256sum --check --ignore-missing CHECKSUM
# Nur fortfahren, wenn die obige Prüfung für genau dieses DVD-ISO OK meldet.

sudo dnf install -y httpd rsync dnsmasq tcpdump
sudo install -d -m 0755 /mnt/rocky9 /var/www/html/rocky/9.8
sudo mount -o loop,ro Rocky-9.8-x86_64-dvd.iso /mnt/rocky9
# Das folgende Ziel ist der neu bereitgestellte Installationsbaum für 9.8; --delete kann vorhandene Dateien löschen.
sudo rsync -aH --delete /mnt/rocky9/ /var/www/html/rocky/9.8/
sudo restorecon -RFv /var/www/html/rocky

Prüfen Sie in der über die offizielle HTTPS-Adresse bezogenen CHECKSUM-Datei genau den Eintrag des DVD-ISO-Abbilds für 9.8. Ein OK für eine andere Datei bestätigt dieses ISO nicht. Verlangt Ihre Lieferkettenrichtlinie eine Signaturprüfung, prüfen Sie auch die von Rocky bereitgestellte Signatur und den vertrauenswürdigen offiziellen Schlüssel. Hängen Sie das ISO schreibgeschützt ein und übernehmen Sie den vollständigen Installationsbaum.

Schritt 2: Den HTTP-Dienst einrichten

Konfigurieren Sie vorher die Serveradresse 192.0.2.10/24 auf der eigens für die Testumgebung vorgesehenen NIC ens192 und ordnen Sie deren Verbindung der firewalld-Zone internal zu. Passen Sie Gateway, DNS und Schnittstellenname an das isolierte VLAN an. Prüfen Sie vor der folgenden Dienstfreigabe, dass firewall-cmd --get-zone-of-interface=ens192 internal zurückgibt. Verschieben Sie keine produktive NIC in diese Testzone.

sudo dnf install -y httpd
sudo systemctl enable --now httpd
sudo firewall-cmd --permanent --zone=internal --add-service=http
sudo firewall-cmd --reload

curl --fail --head http://192.0.2.10/rocky/9.8/.treeinfo
sudo journalctl -u httpd --since '-10 min' --no-pager

Schritt 3: TFTP-Bootdateien bereitstellen

Verwenden Sie die signierten UEFI-Dateien desselben geprüften DVD-ISO-Abbilds. shim lädt grubx64.efi aus demselben Verzeichnis; GRUB verwendet Kernel und initrd derselben Version. Starten Sie nicht zusätzlich tftp.socket. UDP-Port 69 wird im nächsten Schritt von dnsmasq bedient.

sudo install -d -m 0755 /var/lib/tftpboot/rocky9
sudo install -m 0644 /mnt/rocky9/EFI/BOOT/BOOTX64.EFI /var/lib/tftpboot/shimx64.efi
sudo install -m 0644 /mnt/rocky9/EFI/BOOT/grubx64.efi /var/lib/tftpboot/grubx64.efi
sudo install -m 0644 /mnt/rocky9/images/pxeboot/vmlinuz /var/lib/tftpboot/rocky9/vmlinuz
sudo install -m 0644 /mnt/rocky9/images/pxeboot/initrd.img /var/lib/tftpboot/rocky9/initrd.img
sudo restorecon -RFv /var/lib/tftpboot
ls -l /var/lib/tftpboot/{shimx64.efi,grubx64.efi,rocky9/vmlinuz,rocky9/initrd.img}
Fehlt der Pfad auf dem Installationsmedium oder weicht der Dateiname ab, stoppen Sie den Kopiervorgang und prüfen Sie Architektur und Inhalt des ISO-Abbilds. Bei Secure Boot müssen die Signaturkette aus shim, GRUB und Kernel sowie der Vertrauensspeicher der Firmware zusammenpassen.

Schritt 4: DHCP- und TFTP-Konfiguration

Speichern Sie die folgende Konfiguration in /etc/dnsmasq.d/pxe.conf und prüfen Sie sie auf Überschneidungen mit bestehenden dnsmasq-Einstellungen. Die DHCP-Architekturwerte 7 und 9 werden hier als UEFI x86_64 behandelt. Für andere Architekturen wird keine Bootdatei angeboten.

sudoedit /etc/dnsmasq.d/pxe.conf

Die folgende dnsmasq-Konfiguration ist ein Beispiel für ein separates Test-VLAN. Existiert im Produktionsnetz bereits DHCP, wenden Sie sie dort nicht an. Stattdessen müssen die zuständigen DHCP-Administratoren bootfile und next-server passend zur Architektur konfigurieren.

port=0
interface=ens192
bind-interfaces
dhcp-range=192.0.2.100,192.0.2.180,255.255.255.0,12h
dhcp-option=3,192.0.2.1
dhcp-option=6,192.0.2.53

enable-tftp
tftp-root=/var/lib/tftpboot
dhcp-match=set:efi64,option:client-arch,7
dhcp-match=set:efi64,option:client-arch,9
dhcp-boot=tag:efi64,shimx64.efi
log-dhcp
sudo dnsmasq --test
sudo systemctl enable --now dnsmasq
sudo firewall-cmd --permanent --zone=internal --add-service=dhcp
sudo firewall-cmd --permanent --zone=internal --add-service=tftp
sudo firewall-cmd --reload
sudo journalctl -u dnsmasq -f

Schritt 5: Das Bootmenü erstellen

UEFI-GRUB-Menü

Speichern Sie das folgende Menü im TFTP-Stammverzeichnis unter /var/lib/tftpboot/grub.cfg. Prüfen Sie im Test anhand der dnsmasq-Protokolle oder eines Paketmitschnitts auch, welchen Pfad GRUB tatsächlich anfordert.

sudoedit /var/lib/tftpboot/grub.cfg
sudo restorecon -RFv /var/lib/tftpboot
set timeout=5

menuentry 'Install Rocky Linux 9.8 with Kickstart' {
    linuxefi /rocky9/vmlinuz ip=dhcp       inst.repo=http://192.0.2.10/rocky/9.8/       inst.ks=http://192.0.2.10/ks/rocky9.cfg
    initrdefi /rocky9/initrd.img
}

Gleichen Sie die GRUB-Befehle mit der tatsächlichen Bootkonfiguration des Installationsmediums ab. Je nach Kombination aus Firmware und GRUB werden auch linux und initrd verwendet. Testen Sie den Systemstart deshalb zuerst in einer VM desselben Typs.

Schritt 6: Eine Kickstart-Datei mit begrenzten Berechtigungen erstellen

Speichern Sie das folgende Beispiel in /var/www/html/ks/rocky9.cfg. Ersetzen Sie den Passworthash für opsadmin unbedingt durch einen tatsächlichen Hash und begrenzen Sie HTTP-Zugriffe auf das Installations-VLAN. Mit dem unveränderten Platzhalter ist keine reguläre Administratoranmeldung möglich.

sudo install -d -m 0755 /var/www/html/ks
sudoedit /var/www/html/ks/rocky9.cfg
text
url --url=http://192.0.2.10/rocky/9.8/
lang ko_KR.UTF-8
keyboard kr
timezone Asia/Seoul --utc
network --bootproto=dhcp --device=link --activate

rootpw --lock
user --name=opsadmin --groups=wheel --iscrypted   --password='$6$REPLACE_WITH_A_REAL_HASH'

ignoredisk --only-use=sda
zerombr
clearpart --all --initlabel --drives=sda
autopart --type=lvm
selinux --enforcing
firewall --enabled --service=ssh
reboot

%packages
@^minimal-environment
chrony
%end

%post --log=/root/ks-post.log
systemctl enable chronyd
%end
clearpart --all löscht die Daten auf dem angegebenen Datenträger. Prüfen Sie für jedes Servermodell Gerätenamen und WWN und testen Sie den Ablauf zuerst in einer leeren VM. Ersetzen Sie den Beispiel-Passworthash durch einen tatsächlichen starken Hash. Geheimnisse gehören jedoch weder auf einen öffentlich zugänglichen Webserver noch in ein Git-Repository.

Schritt 7: Die Kickstart-Syntax prüfen

sudo dnf install -y pykickstart
ksvalidator -v RHEL9 /var/www/html/ks/rocky9.cfg

curl --fail http://192.0.2.10/ks/rocky9.cfg | head
curl --fail http://192.0.2.10/rocky/9.8/.treeinfo | head
sudo restorecon -RFv /var/www/html/ks

Schritt 8: Die Installation in einer UEFI-VM testen

  1. Eine UEFI-VM mit leerem Datenträger im separaten VLAN bereitstellen.
  2. Adresse, next-server und bootfile des DHCP-Angebots in einem Paketmitschnitt prüfen.
  3. Die Antworten der in den Kernel-Argumenten angegebenen Adressen inst.repo und inst.ks prüfen.
  4. Während der Installation sowohl Anaconda-Protokolle als auch HTTP-Zugriffsprotokolle beobachten.
  5. Nach dem Neustart SELinux, Firewall, Zeitsynchronisierung und Administrationskonto prüfen.
sudo tcpdump -ni ens192 -vvv 'port 67 or port 68 or port 69'
sudo tail -f /var/log/httpd/access_log /var/log/httpd/error_log

# In der Shell des Installationsprogramms prüfen
ip address
cat /proc/cmdline
curl --fail http://192.0.2.10/ks/rocky9.cfg
journalctl -b --no-pager | tail -200

Schritt 9: Das installierte System prüfen

cat /etc/rocky-release
uname -r
sudo dnf upgrade --refresh -y
sudo systemctl --failed --no-pager
getenforce
sudo firewall-cmd --list-all
chronyc tracking
sudo journalctl -p err -b --no-pager

Verwalten Sie das Installationsergebnis als reproduzierbares Build-Ergebnis. Bewahren Sie ISO-Prüfsumme, Kickstart-Version, Hashes der Bootdateien, getesteten Firmwaretyp und Protokolle erfolgreicher Installationen gemeinsam auf.

Sicherheit und Betrieb

  • Die Kickstart-URL nur aus dem benötigten Installations-VLAN erreichbar machen.
  • Registrierungstoken und private SSH-Schlüssel nicht direkt in der Datei hinterlegen.
  • HTTP-Zugriffsprotokolle auf ungewöhnlich viele Anfragen überwachen.
  • TFTP ausschließlich für Bootdateien und HTTP für Installationspakete verwenden.
  • Änderungen am produktiven DHCP-Dienst prüfen und einen Rückkehrplan vorbereiten.
  • Den PXE-Zugang außerhalb vorgesehener Installationsfenster sperren.

Offizielle Quellen und weitere Artikel

Ein durchgängig geprüftes Installationsverfahren

PXE und Kickstart verbinden DHCP, die Übertragung der Bootdateien, einen HTTP-Installationsbaum und eine geprüfte Kickstart-Datei zu einem gemeinsamen Ablauf. In diesem UEFI-x86_64-Beispiel wird das Zusammenspiel von PXE/TFTP und HTTP-Installationsbaum geprüft. Erst nach erfolgreicher ISO-Prüfsummenprüfung, Syntaxprüfung, Installation in einer leeren VM und Kontrolle des Sicherheitszustands nach der Installation sollte das unbeaufsichtigte Verfahren produktiv eingesetzt werden.