1.24. Crossbuilding 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 Kapitel 8 des FreeBSD Handbuchs vertraut sein.
1.24.1. 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 Distcc lohnen.
1.24.1.1. 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
Warnung
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.
1.24.1.2. 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.
1.24.2. Gebaute Systeme verteilen
Die einfachste Möglichkeit solche fertigen Systeme zu verteilen ist über NFS.
Warnung
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
.
1.24.2.1. 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.
1.24.2.2. 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.
1.24.2.3. 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
1.24.3. Verweise
Ein eigener Kernel im FreeBSD Handbuch.
Die Manpage make(1).
Die Manpage make.conf(5) und src.conf(5) für MYKERNEL.mk.
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.
Zuletzt geändert: 2023-07-22