\subsection{Provisionierung}
\label{sub:provisionierung}

\subsubsection{Vorbereitung}

\begin{sloppypar}

Für die Provisionierung wurde Clonezilla verwendet. Wir haben uns für dieses
Verfahren entschieden. 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 Computenodes 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.

Außerdem haben wir ein Script \emph{ cluster} geschrieben, mit dem die Computenodes verwaltet werden können. Mit
\begin{lstlisting}
cluster add <HOSTNAME> <IP> <MAC>
\end{lstlisting}
wird ein neuer Node hinzugefügt (DHCP- und DNS-Eintrag). Mit
\begin{lstlisting}
cluster set-<MODE> <HOSTNAME>
\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} (Clonen 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 Computenodes}

\begin{sloppypar}

Um den Clone-Vorgang zu starten, führten wir nun mit dem Befehl \emph{sudo
cluster set-clone <HOSTNAME>} aus. Durch Neustart des Nodes wird das Clonezilla
Live Image gebootet. Dieses holt sich nun vom Headnode ein Script und führt es
aus. In diesem Script haben wir alle nötigen Befehle eingetragen, um das Clonen
vorzubereiten und zu starten (siehe \emph{aufgabe4.4/clone.sh}). Dazu wird per
NFS das \emph{/cluster}-Verzeichnis des Headnodes eingebunden und dort im
Unterverzeichnis \emph{images} das Image der Festplatte abgelegt. Geclont werden
nur die \emph{/}- und die \emph{/boot}-Partition.

Zum Wiederherstellen des Images wird mit \emph{sudo cluster set-restore
<HOSTNAME>} wieder der entsprechende Boot-Modus gesetzt und der Node
neugestartet. Dort wird nun ein anderes Script vom Headnode 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. Es 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 wir in unserem Cluster gemischte Boards haben (Intel und Zotac), 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 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 Ethernet-Interface nicht nach
dem neuen Schema enpXsY sondern fest den Namen eth0 erhalten.

\end{sloppypar}
