====== Crossbuilding FreeBSD ======
{{infobox|OS|FreeBSD}}
Dieser Artikel zeigt auf wie sowohl Kernel und Welt für verschiedene Rechner und Architekturen von einem Rechner aus gebaut werden können. Wer den Artikel lesen will sollte mit [[http://www.freebsd.org/doc/de/books/handbook/kernelconfig.html|Kapitel 8 des FreeBSD Handbuchs]] vertraut sein.
===== Verschiedene Kernel mit ihren Welten verwalten =====
Dem Vorschlag des FreeBSD Handbuchs folgend sollten Kernel Konfigurationen im Verzeichnis ''/root/kernels'' gesammelt werden. Dort können auch **make(1)** Einstellungen gesammelt werden, die auf einem gewöhnlichen System in der Datei ''/etc/make.conf'' wären. Wenn ein Kernel Konfiguration ''MYKERNEL'' genannt ist sollte die make Konfiguration entsprechend ''MYKERNEL.mk'' genannt werden. In der Datei ''/root/kernels/MYKERNEL.mk'' können dann diverse Variablen wie **CPUTYPE**, **CFLAGS**, **TARGET** oder **PORTS_MODULES** gesetzt werden. Eine Auswahl und Beschreibung der Variablen findet sich in der Manpage **make.conf(5)**. Die Beschreibung für **TARGET** befindet sich in der Datei ''/usr/src/Makefile''.
In einem Netz mit mehreren Rechnern kann sich der Einsatz von [[anwendungen:Distcc]] lohnen.
==== make Konfiguration einbinden ====
Damit die passende make Konfiguration automatisch geladen wird, müssen folgende Zeilen der ''make.conf'' hinzugefügt werden:
.if exists(/root/kernels/${KERNCONF}.mk)
.include "/root/kernels/${KERNCONF}.mk"
.endif
Die Verwendung von ''CPUTYPE?='' in der Datei ''/etc/make.conf'' darf erst hinter diesem Block stattfinden, damit ein Kernel-spezifischer Aufruf von ''CPUTYPE?='' Vorrang hat.
Hier ist ein Beispiel ''THINKPAD.mk'' für das Thinkpad des Autors, um die Funktion der Datei zu verdeutlichen:
CPUTYPE?= pentium-m
TARGET= i386
PORTS_MODULES= net/iwi-firmware-kmod
NO_PROFILE= yes
Die Option **PORTS_MODULES** bereitet hier übrigens keine Probleme, da die angegebenen Ports erst beim Aufruf von **installkernel** neu gebaut werden. Hier ist allerdings vorsicht angesagt. Wenn einer der angegebenen Ports scheitert, bricht die Installation ab und das Kernelverzeichnis **/boot/kernels** ist unvollständig. Deshalb vorher immer ein Backup machen.
==== OBJDIR nach Kernel trennen ====
Beim Kompilieren von verschiedenen Kerneln und Welten entsteht das Problem, dass alle in **/usr/obj** landen, was es verhindert verschiedene Systeme vorrätig zu halten. Dem kann abgeholfen werden indem der Bauvorgang folgendermaßen gestartet wird:
# env MAKEOBJDIRPREFIX=/usr/obj/MYKERNEL make buildworld buildkernel KERNCONF=MYKERNEL
Diese Lösung ist allerdings umständlich. Aus dem Autor nicht erfindlichen Gründen darf **MAKEOBJDIRPREFIX** nur auf diese Weise gesetzt werden. Mit einem Trick kann das aber trotzdem in der **make.conf** getan werden. Dazu wird einfach folgendes eingetragen:
.if !make(dummy)
.if defined(TARGET) && ${TARGET} != ${MACHINE}
MAKEOBJDIRPREFIX?= /usr/obj/${KERNCONF}
.else
MAKEOBJDIRPREFIX?= /usr/obj/${KERNCONF}/${MACHINE}
.endif
.endif
So reicht bereits der Aufruf
# make buildworld buildkernel KERNCONF=MYKERNEL
aus.
===== Gebaute Systeme verteilen ======
Die einfachste Möglichkeit solche fertigen Systeme zu verteilen ist über NFS.
Im folgenden gibt es mehrmals die Anweisung die Zeile ''nfslocking_enable="YES"'' in die Datei ''/etc/rc.conf'' aufzunehmen. Ab FreeBSD 7 **entfällt** diese genau so wie das Kommando ''/etc/rc.d/nfslocking start''.
==== NFS Server einrichten ====
Der Rechner auf dem die Systeme gebaut werden muss die Verzeichnisse **/usr/src** und **/usr/obj** freigeben. Dazu wird der Datei **/etc/exports** folgende Zeile hinzugefügt:
/usr/src /usr/obj -ro -maproot=root CLIENT
**CLIENT** muss mit der IP oder dem Hostnamen des Rechners der zugreifen soll ersetzt werden. Wer volles vertrauen in die Clients hat kann den Parameter **-ro** weglassen. Dann ist allerdings voller Schreibzugriff möglich. Wenn PORTS_MODULES definiert ist, ist Schreibzugriff auf /usr/obj obligatorisch.
In der Datei **/etc/rc.conf** müssen folgende Eintragungen vorgenommen werden:
nfs_server_enable="YES"
nfslocking_enable="YES"
mountd_flags="-r"
rpc_statd_enable="YES"
rpc_lockd_enable="YES"
Nun kann der NFS Server mit den Kommandos
# /etc/rc.d/nfsd start
# /etc/rc.d/nfslocking start
gestartet werden. Nach Änderungen an der **/etc/exports** sollte der Befehl
# /etc/rc.d/mountd onerestart
aufgerufen werden.
==== NFS Client einrichten ====
Beim Client Rechner müssen in der **/etc/rc.conf** folgende Einträge gemacht werden:
nfs_client_enable="YES"
nfslocking_enable="YES"
rpc_statd_enable="YES"
rpc_lockd_enable="YES"
Zum Starten müssen nun die folgenden Kommandos ausgeführt werden:
# /etc/rc.d/nfsclient start
# /etc/rc.d/nfslocking start
Als nächstes sollten an der Datei **/etc/make.conf** die gleichen Änderungen wie am Rechner der das System gebaut hat vorgenommen werden. Außerdem sollte das Verzeichnis **/root/kernels** angelegt werden und die Dateien für das zu installierende System enthalten.
Nun kann mit dem Befehl
# showmount -e SERVER
ausprobiert werden ob die NFS Freigabe des Servers funktioniert hat. SERVER ist dabei natürlich mit dem Hostnamen oder der IP des Servers zu ersetzen.
==== Installation durchführen ====
Zur Installation bleibt nur noch die Freigaben zu mounten. Der Einfachheit halber sollten sie in die **/etc/fstab** eingetragen werden:
SERVER:/usr/src /usr/src nfs ro,-b,-T,-R=5 0 0
SERVER:/usr/obj /usr/obj nfs rw,-b,-T,-R=5 0 0
Nach vollendeter Installation sollte die Option noauto hinzugefügt werden. Mit den Befehlen
# mount /usr/src
# mount /usr/obj
können die Freigaben sofort gemountet werden. Es ist wichtig, dass bei jedem Aufruf von make auch **KERNCONF** angegeben wird. Alternativ kann **KERNCONF** natürlich auch in der **/etc/make.conf** eingetragen werden.
# cd /usr/src
# make installkernel KERNCONF=MYKERNEL
# reboot
Hier im Loader den Single User Mode auswählen. Im Single User Mode muss ersteinmal einiges gemountet und gestartet werden, damit über NFS gearbeitet werden kann:
# mount -a
# /etc/rc.d/netif start INTERFACE
# /etc/rc.d/nfsclient start
# /etc/rc.d/nfslocking start
# mount -a
**INTERFACE**' muss natürlich durch die Inteface Bezeichnung der Netzwerkkarte ersetzt werden (zum Beispiel fxp0). Mit dem Befehl **mount** kann geprüft werden ob alle benötigten Verzeichnisse tatsächlich gemountet sind.
# cd /usr/src
# mergemaster -p
# make installworld KERNCONF=MYKERNEL
# mergemaster
# reboot
===== Verweise =====
* Ein eigener Kernel im [[http://www.freebsd.org/doc/de/books/handbook/kernelconfig.html|FreeBSD Handbuch]].
* Die Manpage **make(1)**.
* Die Manpage **make.conf(5)** und **src.conf(5)** für **MYKERNEL.mk**.
* [[anwendungen:Distcc]] für verteiltes Kompilieren.
* Die Manpage **exports(5)** für die Konfiguration des NFS Servers.
* Die Manpage **rc.conf(5)**.
* Die Manpage **build(7)** für das Bauen von Welt und Kernel.
* Auch Lesenswert sind die ersten 69 Zeilen von **/usr/src/Makefile**.
{{tag>kategorie:HowTo kategorie:FreeBSD}}