\subsection{Provisionierung} \label{sub:provisionierung} \subsubsection{Vorbereitung} \begin{sloppypar} Für die Provisionierung wurde Clonezilla verwendet. Bei einem Netzwerk-Boot beispielsweise, bei dem das gesamte Dateisystem per NFS eingebunden wird, wäre in unserem Fall ineffektiv, da auf den Festplatten der Compute-Nodes genügend Speicher für das Betriebssystem vorhanden ist und bei jedem Zugriff auf das Dateisystem unnötigen Latenzen entstehen würden. Um Clonezilla auf den Compute-Nodes zu booten, haben wir den \emph{in.tftpd}-Server installiert und das Service-File für \emph{Systemd} angepasst (siehe \emph{aufgabe4.4/tftpd.service}). Außerdem haben wir die Konfiguration des DHCP-Servers so angepasst, dass nun jede Compute-Node eine eigene Konfigurationsdatei in \emph{/etc/dhcpd.d/} hat, die jeweils von \emph{/etc/dhcpd.d/all} inkludiert wird. Um die Compute-Nodes zu verwalten, haben wir das Script \emph{cluster} geschrieben. Mit dem Befehl \begin{lstlisting} cluster add \end{lstlisting} wird ein neuer Node hinzugefügt (DHCP- und DNS-Eintrag). Mit \begin{lstlisting} cluster set- \end{lstlisting} kann der Modus für den nächsten Boot des Nodes festgelegt werden. Hier kann zwischen \emph{local} (Boot von lokaler Festplatte), \emph{live} (Boot in das Clonezilla Image), \emph{clone} (Klonen nach Boot) und \emph{restore} (Image laden nach Boot) gewechselt werden. Um den Netzwerk-Boot zu ermöglichen, haben wir \emph{pxelinux} unter \emph{/srv/tftp/pxelinux} installiert und konfiguriert. In dieses Verzeichnis haben wir die Dateien \emph{vmlinuz}, \emph{initrd.img} und \emph{filesystem.squashfs} aus der Clonezilla-Live-ISO kopiert, sowie außerdem noch \emph{ldlinux.c32, libcom32.c32, libutil.c32, menu.c32, chain.c32} und \emph{pxelinux.0} aus der \emph{syslinux}-Installation. Die Konfigurationsdateien liegen in \emph{/srv/tftp/pxelinux/pxelinux.cfg}. \end{sloppypar} \subsubsection{Provisionierung der Compute-Nodes} \begin{sloppypar} Um den Klonvorgang zu starten, führten wir den Befehl \texttt{sudo cluster set-clone } aus. Durch Neustart des Nodes wird das Clonezilla Live Image gebootet. Dieses holt sich nun vom Head-Node ein Script und führt es aus. In diesem Script haben wir alle nötigen Befehle eingetragen, um das Klonen vorzubereiten und zu starten (siehe \emph{aufgabe4.4/clone.sh}). Dazu wird per NFS das \emph{/cluster}-Verzeichnis des Head-Nodes eingebunden und dort im Unterverzeichnis \emph{images} das Image der Festplatte abgelegt. Geklont werden die \emph{Root}- und die \emph{Boot}-Partition. Zum Wiederherstellen des Images wird mit \emph{sudo cluster set-restore } wieder der entsprechende Boot-Modus gesetzt und der Node neu gestartet. Dort wird nun ein anderes Script vom Head-Node geholt (siehe \emph{ aufgabe4.4/restore.sh}) und die beiden Partitionen wiederhergestellt. Anschließend werden noch die Swap-Partition und die Daten-Partition für das verteilte Dateisystem neu formatiert und die alten UUIDs gesetzt. Da Clonezilla bei uns das Dateisystemformat \emph{ext4} nicht als solches erkannt hat, fiel auf das generische Programm \emph{partclone.dd} zurück, welches allerdings sehr langsam ist, weil es die komplette Partition klont und freie Blöcke nicht überspringt. Deswegen haben wir zwei kleine Wrapper-Scripts geschrieben.Diese Skripte verwenden stattdessen das schnellere \emph{partclone.ext4} (siehe \emph{aufgabe4.4/partclone.dd-clone} und \emph{partclone.dd-restore}). Da in unserem Cluster gemischte Boards (Intel und Zotac) sind, mussten wir anschließend außerdem noch das Ziel-Root-Verzeichnis mounten und dort mit Befehl \emph{mkinitcpio -p linux} ein neue Init-Ramdisk erstellen lassen, welches die entsprechenden Treiber für den Bootvorgang enthält. Um die automatische Umbenennung der Netzwerk-Interfaces vorzubeugen, haben wir außerdem einen Symlink \emph{/etc/udev/rules.d/80-net-name-slot.rules -> /dev/null} erstellt. Dadurch wird verhindert, dass das Ethernet-Interface nicht nach dem neuen Schema enpXsY, sondern fest den Namen eth0 erhält. \end{sloppypar}