Mit Kickstart-Installationen können wir unbeaufsichtigte oder halb unbeaufsichtigte Installationen von Fedora, Red Hat Enterprise Linux oder CentOS einfach skripten und replizieren. Die für die Installation des Betriebssystems erforderlichen Anweisungen werden mit einer speziellen Syntax in einer Kickstart-Datei angegeben, die an das Anaconda-Installationsprogramm übergeben wird. In diesem Tutorial werden wir sehen, wie man ein bereits existierendes LUKS wiederverwendet (Linux Unified Keys Setup)-Container bei der Durchführung einer Kickstart-Installation:Dies ist etwas, das nicht nur mit Kickstart-Anweisungen erreicht werden kann und einige zusätzliche Schritte erfordert.
In diesem Tutorial lernen Sie:
- Wie man einen vorhandenen LUKS-Container verwendet, wenn man eine Kickstart-Installation von Fedora, RHEL oder CentOS durchführt
- Erstellen und Verwenden einer updates.img-Datei zur Verwendung mit dem Anaconda-Installationsprogramm.
So installieren Sie Fedora/RHEL/CentOS über Kickstart auf einem vorhandenen LUKS-Gerät Softwareanforderungen und verwendete Konventionen
| Kategorie | Anforderungen, Konventionen oder verwendete Softwareversion |
|---|---|
| System | Fedora/Rhel/CentOS |
| Software | Für dieses Tutorial ist keine spezielle Software erforderlich. |
| Andere |
|
| Konventionen | # – erfordert, dass bestimmte Linux-Befehle mit Root-Rechten ausgeführt werden, entweder direkt als Root-Benutzer oder durch Verwendung von sudo Befehl$ – erfordert, dass bestimmte Linux-Befehle als normaler, nicht privilegierter Benutzer ausgeführt werden |
Einführung
Kickstart ermöglichte es uns, Betriebssysteminstallationen auf eine Weise zu replizieren und anzupassen, die mit dem grafischen Installationsprogramm von Anaconda einfach unmöglich zu erreichen ist. Wir können beispielsweise angeben, welche Pakete oder Paketgruppen auf dem System installiert werden sollen und welche stattdessen ausgeschlossen werden sollen.
Wir haben auch die Möglichkeit, benutzerdefinierte Befehle vor oder nach der Installation auszuführen, indem wir sie im dedizierten %pre angeben und %post Abschnitte der Kickstart-Datei. Wir werden diese letztgenannte Funktion nutzen, um ein bereits vorhandenes LUKS zu verwenden Gerät während des Installationsvorgangs.
Verschlüsselung mit nativer Kickstart-Syntax
Das Erstellen von LUKS-Containern ist recht einfach und kann einfach mit nativen Kickstart-Anweisungen durchgeführt werden. Hier ist ein Beispiel:
part pv.01 --ondisk=sda --encrypted --luks-type=luks1 --cipher=aes-xts-plain64 --pbkdf-time=5000 --passphrase=secretpassphrase
Im obigen Beispiel durch Verwendung des part Anweisung erstellen wir ein verschlüsseltes lvm physisches Volume auf /dev/sda Scheibe. Wir spezifizieren das LUKS zu verwendende Version (luks1 in diesem Fall – zumindest in neueren Versionen von Fedora ist luks2 zum Standard geworden), die chiffre , und die Zeit, ausgedrückt in Millisekunden, die für PBKDF aufzuwenden ist (Password-Based Key Derivation Function) Passphrase-Verarbeitung (dies entspricht der Verwendung von --iter-time Option von cryptsetup ).
Auch wenn es keine sichere Angewohnheit ist, haben wir auch die --passphrase verwendet die Verschlüsselungs-Passphrase bereitzustellen:Ohne diese Option würde der Installationsvorgang unterbrochen und wir würden aufgefordert, interaktiv eine Passphrase bereitzustellen.
Wir können deutlich sehen, wie wir mit Kickstart viel mehr Flexibilität im Vergleich zu einer herkömmlichen Installation erhalten; warum müssten wir dann zusätzliche Schritte ausführen? Es gibt immer noch einige Aufgaben, die wir mit der standardmäßigen Kickstart-Syntax nicht bewältigen können. Unter anderem können wir LUKS nicht erstellen Container auf Raw-Geräten (nur auf Partitionen) oder geben Sie den Hash-Algorithmus an, der für LUKS verwendet werden soll key setup, das standardmäßig auf sha256 eingestellt ist (Daran ist nichts auszusetzen).
Aus diesen Gründen möchten wir vielleicht unser Partitions-Setup erstellen, bevor wir die Installation durchführen, entweder manuell oder mithilfe von Tools wie parted innerhalb von %pre Abschnitt der Kickstart-Datei selbst. Möglicherweise haben wir auch nur ein vorhandenes LUKS Setup, das wir nicht zerstören wollen. In all diesen Fällen müssen wir die zusätzlichen Schritte ausführen, die wir gleich sehen werden.
Die Kickstart-Sektion %pre
Der %pre Abschnitt einer Kickstart-Datei ist der erste, der geparst wird, wenn die Datei abgerufen wird. Es wird verwendet, um benutzerdefinierte Befehle auszuführen, bevor die Installation beginnt, und muss explizit mit %end geschlossen werden Anleitung.
In %pre , wird standardmäßig der Bash-Shell-Interpreter verwendet, aber andere können über --interpreter angegeben werden Option (um Python zu verwenden, würden wir %pre --interpreter /usr/bin/python schreiben ). Wir können diesen Abschnitt verwenden, um die Befehle auszuführen, die zum Öffnen des vorhandenen LUKS erforderlich sind Container. Folgendes können wir schreiben:
%pre
iotty="$(tty)"
exec > "${iotty}" 2> "${iotty}"
while true; do
cryptsetup luksOpen /dev/sda1 cryptroot - && break
done
%end
Schauen wir uns den obigen Code an. Zunächst speichern wir das Ergebnis des tty Befehl, der den Dateinamen des mit der Standardeingabe verbundenen Terminals in iotty ausgibt Variable.
Mit dem exec> "${iotty}" 2> "${iotty}" Befehl haben wir Standardausgabe und Standardfehler auf dasselbe Terminal umgeleitet:
Auf diese Weise können wir das Container-Passwort eingeben, wenn crytpsetup luksOpen Der Befehl wird ausgeführt und die Eingabeaufforderung wird auf dem Bildschirm angezeigt. Der Befehl wird in einer Endlosschleife gestartet, die nur unterbrochen wird, wenn LUKS Container wurde erfolgreich geöffnet.
Wenn wir eine vollständig unbeaufsichtigte Installation ausführen möchten, müssen wir die Passphrase direkt an cryptsetup übergeben (auch dies wird nicht empfohlen). Wir würden schreiben:
%pre echo -n "ourverysecretpassphrase" | cryptsetup luksOpen /dev/sda1 cryptroot - %end
Im obigen Beispiel haben wir die Passphrase über eine Pipe | an die Standardeingabe des cryptsetup-Befehls übergeben :wir haben das echo verwendet Befehl mit dem -n Option, um zu vermeiden, dass am Ende der Passphrase ein Zeilenumbruchzeichen angehängt wird.
Fedora 31 Anaconda-Installationsprogramm patchen
Wenn wir versuchen, bei der Installation von Fedora 31 über Kickstart einen entsperrten LUKS-Container zu verwenden, erhalten wir die folgende
Meldung und der Vorgang wird abgebrochen:
Das vorhandene entsperrte LUKS-Gerät kann ohne einen für dieses
Gerät spezifizierten Verschlüsselungsschlüssel nicht für die Installation verwendet werden. Bitte scannen Sie den Speicher erneut.
Dies geschieht aufgrund dieses Commit, das in der Fedora 31-Version des Anaconda-Installationsprogramms eingeführt wurde. Der Code überprüft grundsätzlich, ob ein vorhandenes LUKS-Gerät einen registrierten Schlüssel hat, wenn dies nicht der Fall ist, wird die Installation abgebrochen. Das Problem ist, dass blivet , die Python-Bibliothek, die von Anaconda zum Verwalten der Partition verwendet wird, erhält den Schlüssel nur, wenn der Container von ihr geöffnet wird:Dies kann über das grafische Installationsprogramm erfolgen, aber zum Zeitpunkt des Schreibens gibt es keine Kickstart-Anweisung zum Entsperren eines vorhandenen LUKS Container. Ich persönlich habe den Commit kommentiert und die Situation erklärt, und ein Fehler wurde auf Red Hat Bugzilla geöffnet.
Erstellen einer updates.img-Datei
Im Moment besteht die einzige mir bekannte Problemumgehung darin, den Anaconda-Quellcode zu patchen und die Zeile zu kommentieren, die das mit dem oben erwähnten Commit eingeführte Steuerelement ausführt. Die gute Nachricht ist, dass die Bedienung sehr einfach ist.
Als erstes müssen wir das Anaconda-Git-Repository klonen, insbesondere die f31-release Zweig:
$ git clone https://github.com/rhinstaller/anaconda -b f31-release
Sobald das Repo geklont ist, geben wir den anaconda ein Verzeichnis und ändern Sie die pyanaconda/storage/checker.py Datei:Alles, was wir tun müssen, ist die Zeile 619 zu kommentieren :
def set_default_checks(self):
"""Set the default checks."""
self.checks = list()
self.add_check(verify_root)
self.add_check(verify_s390_constraints)
self.add_check(verify_partition_formatting)
self.add_check(verify_partition_sizes)
self.add_check(verify_partition_format_sizes)
self.add_check(verify_bootloader)
self.add_check(verify_gpt_biosboot)
self.add_check(verify_swap)
self.add_check(verify_swap_uuid)
self.add_check(verify_mountpoints_on_linuxfs)
self.add_check(verify_mountpoints_on_root)
#self.add_check(verify_unlocked_devices_have_key)
self.add_check(verify_luks_devices_have_key)
self.add_check(verify_luks2_memory_requirements)
self.add_check(verify_mounted_partitions)
Wir speichern die Änderung und starten vom Stammverzeichnis des Repositorys aus makeupdates Skript, das in scripts zu finden ist Verzeichnis. Damit das Skript ausgeführt werden kann, müssen wir python2 haben installiert:
$ ./scripts/makeupdates
Das Skript generiert die updates.img Datei, die unsere Änderungen enthalten wird. Um seinen Inhalt zu überprüfen, können wir die lsinitrd verwenden Befehl:
$ lsinitrd updates.img Image: updates.img: 8.0K ======================================================================== Version: Arguments: dracut modules: ======================================================================== drwxr-xr-x 3 egdoc egdoc 0 Jan 30 09:29 . drwxr-xr-x 3 egdoc egdoc 0 Jan 30 09:29 run drwxr-xr-x 3 egdoc egdoc 0 Jan 30 09:29 run/install drwxr-xr-x 3 egdoc egdoc 0 Jan 30 09:29 run/install/updates drwxr-xr-x 3 egdoc egdoc 0 Jan 30 09:29 run/install/updates/pyanaconda drwxr-xr-x 2 egdoc egdoc 0 Jan 30 09:29 run/install/updates/pyanaconda/storage -rw-r--r-- 1 egdoc egdoc 25443 Jan 30 09:29 run/install/updates/pyanaconda/storage/checker.py ========================================================================
Wir werden diese Datei verwenden, um das Installationsprogramm von Fedora 31 zu „patchen“.
Anwendung des Patches
Um die in der gerade erstellten Datei enthaltenen Änderungen anzuwenden, müssen wir sie irgendwo platzieren, wo wir leicht darauf zugreifen können, vielleicht über ftp oder http, oder sogar auf einem lokalen Blockgerät, und die inst.updates -Parameter, um ihn aus dem Fedora-Installer-Image zu referenzieren. Aus dem Grub-Menü markieren wir den Menüeintrag „Fedora installieren“:

Fedora 31 Installationsmenü
Sobald die Menüzeile ausgewählt ist, drücken wir die Tabulatortaste:Die mit dem Eintrag verknüpfte Kernel-Befehlszeile wird am unteren Rand des Bildschirms angezeigt:

Die vom „Install Fedora“-Eintrag verwendete Kernel-Kommandozeile Jetzt müssen wir nur noch die
inst.updates anhängen Anweisung und geben Sie den Pfad zur updates.img an Datei, die wir erstellt haben. Angenommen, sowohl Kickstart als auch die Datei updates.img sind über http auf einem lokalen Server mit IP 192.168.0.37 zugänglich, würden wir schreiben:vmlinuz initrd=initrd.img inst.stage2=hd:LABEL=Fedora-S-dvd-x86_31-31 quiet inst.updates=http://192.168.0.37/updates.img inst.ks=http://192.168.0.37/ks.cfg
An dieser Stelle können wir die Eingabetaste drücken, um zu booten. Mit der obigen Änderung beschwert sich der Installer nicht mehr über
das entsperrte LUKS Gerät, und die Installation wird ohne Probleme fortgesetzt.
Schlussfolgerungen
In diesem Artikel haben wir gesehen, wie man eine Kickstart-Installation optimiert, um ein bereits vorhandenes LUKS wiederzuverwenden Gerät, indem Sie es im %pre entsperren Abschnitt der Kickstart-Datei und wie man eine kleine Problemumgehung auf das Fedora 31 Anaconda-Installationsprogramm anwendet, das andernfalls fehlschlagen würde, wenn eine solche Art von Installation versucht wird. Wenn Sie neugierig auf die Kickstart-Syntax sind, werfen Sie bitte einen Blick in die Online-Dokumentation.