Betrifft OS: |
---|
![]() |
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.
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.
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
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.
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.
Die einfachste Möglichkeit solche fertigen Systeme zu verteilen ist über NFS.
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
.
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.
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.
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