Es gibt dafür mehrere Gründe, obwohl das Kompilieren eines eigenen Kernels eher für erfahrenere Benutzer geeignet ist, die bereits ein gutes Allgemeinverständnis vom System besitzen.
In den meisten Fällen wirst du keinen eigenen Kernel kompilieren müssen. Ein GENERIC Kernel wird normalerweise alles beinhalten, das du brauchst. Es gibt sogar mehrere Gründe, warum du keinen eigenen Kernel kreieren willst. Der Hauptgrund ist, daß man zwar logisch aussehende Änderungen an der Kernelkonfiguration auf einfache Weise durchführen kann, aber dein Kernel funktioniert dann nicht. Dies soll dein Warnsignal sein. Wenn etwas nicht zu funktionieren scheint, dann probiere bitte vorher einen GENERIC Kernel zu starten, bevor du einen Fehlerbericht einschickst.
Kernelkonfigurationsoptionen bieten dir die Möglichkeit, zusätzliche Unterstützung zu deinem Kernel hinzuzufügen. Dies erlaubt dir, nur die von dir gewünschten Geräte zu unterstützen. Es gibt eine Vielzahl von Möglichkeiten, deinen Kernel auf deine Wünsche abzustimmen. Hier werden wir nur auf einige der am häufigsten benutzten Möglichkeiten eingehen. Siehe options(4) für eine komplette Liste der Optionen. Es stehen auch Beispielkonfigurationsdateien für deine Architektur bereit.
Nicht alle Kerneloptionen sind auf Kompatibilität mit allen anderen Optionen getestet worden. Daher solltest du keine Option in deinem Kernel setzen, wenn du nicht einen triftigen Grund dafür hast! Am meisten wird der GENERIC Kernel getestet. Dies ist normalerweise die Kombination der Optionen in /usr/src/sys/arch/<deine Arch>/conf/GENERIC und /usr/src/sys/conf/GENERIC.
Wenn du diese Dateien genauer betrachtest, dann wird dir eine Zeile
wie diese auffallen:
include "../../../conf/GENERIC"
Dies bedeutet, daß ein Verweis auf eine andere Konfigurationsdatei
vorhanden ist.
Diese Datei beinhält architekturunabhängige Optionen. Wenn du also
deinen eigenen Kernel konfigurieren willst, dann mußt du auch
/sys/conf/GENERIC
beachten. Dort SIND Optionen enthalten, die BENÖTIGT werden.
Alle nachfolgend aufgelisteten Optionen sollten in deiner Kernelkonfigurationsdatei im Format von:
option OPTION
angeführt sein. Um die Option debug im Kernel zu plazieren, füge eine
Zeile wie diese ein:
option DEBUG
Die Optionen im OpenBSD Kernel werden in Compilerpräprozessoroptionen übersetzt, daher würde eine Option wie DEBUG den Quelltext mit der Option -DDEBUG kompilieren, was einem #define DEBUG im Kernel entspricht.
OpenBSD hat viele Kompatibilitätsmöglichkeiten, die dir erlauben, Binärdateien von anderen Betriebsystemen zu benützen. Nicht alle Optionen sind auf jeder Architektur vorhanden, daher lies die entsprechende Manualseite, ob die Architektur unterstützt wird.
Es ist immer hilfreich, Probleme mit dem Kernel debuggen zu können. Aber viele wollen diese Optionen nicht in ihren Kernel setzen, weil diese Optionen den Kernel sehr vergrößern. Sie sind aber extrem hilfreich im Falle eines Fehlers. Ein Entwickler wird die Quelle deiner Probleme viel schneller finden können. Hier eine Liste der debug Optionen:
Dateisystemoptionen.
Diverse Optionen
Netzwerkoptionen
Siehe auch das Netzwerk FAQ oder das Netzworking Performancetuning FAQ.
PCVT Optionen (nur gültig auf i386 Architektur)
SCSI Subsystemoptionen
Vollständige Instruktionen zum Kreieren deines eigenen Kernels findest du hier: afterboot(8).
Um deinen eigenen Kernel von Cdrom zu kompilieren, mußt du zunächst den Quelltext haben. Dafür benötigst du nur den Kernelquelltext, den du auf der CD findest. So kopierst du den Quelltext von CD (CD1 ist hier im Beispiel unter /mnt gemountet.):
# mkdir -p /usr/src/sys # cd /mnt/sys # tar cf - . | ( cd /usr/src/sys; tar xvf - )
Am einfachsten ist es, mit einem GENERIC Kernel zu beginnen. Dieser befindet sich unter /usr/src/sys/arch/${arch}/conf/GENERIC, wobei ${arch} deine Architektur ist. In diesem Verzeichnis befinden sich auch weitere Beispielskonfigurationen. Hier zwei Beispiele fürs Kompilieren deines Kernels. Das erste Beispiel behandelt das Kompilieren von einem Quelltextbaum, der nur Leseberechtigung hat. Das zweite Beispiel zeigt, wie es auf einem Quelltextbaum mit Schreibberechtigung funktioniert.
# cd /irgendwo # cp /usr/src/sys/arch/$ARCH/conf/IRGENDEINEDATEI . # vi IRGENDEINEDATEI (um deine gewünschten Änderung durchzuführen) # config -s /usr/src/sys -b . IRGENDEINEDATEI
Um einen Kernel von einem Quelltextbaum mit Schreibberechtigung zu bauen, tue folgendes:
# cd /sys/arch/$ARCH/conf # vi IRGENDEINEDATEI (um deine gewünschten Änderung durchzuführen) # config IRGENDEINEDATEI (hier mehr darüber : config(8)) # cd ../compile/IRGENDEINEDATEI # make
Wobei $ARCH für die von dir benutzte Architektur ist (z.B. i386). Du kannst auch ein make depend durchführen, um die Abhängigkeiten fürs nächste Kernelkompilieren zu schaffen.
Jetzt muß der Kernel noch an den richtigen Platz.
# cp /bsd /bsd.old # cp /sys/arch/$ARCH/compile/IRGENDEINEDATEI/bsd /bsd
Um deinen alten Kernel zu starten, mußt du nur
boot> bsd.old
beim Starten eingeben, und dein alter Kernel wird anstelle von /bsd geladen.
Manchmal wirst du auch neue Bootblöcke installieren müssen, wenn du einen Kernel gebaut hast. Um dies zu tun, siehe FAQ 14.8 Über den OpenBSD's Bootloader. Dies wird dir eine Übersicht vom Gebrauch des OpenBSD Bootloaders geben.
Manchmal findet der Kernel beim Booten dein Gerät, aber eventuell den falschen IRQ. Und vielleicht brauchst du dieses Gerät sofort. Nun, ohne den Kernel neu zu bauen, kannst du mit der OpenBSD eigenen Boot-Time Konfiguration dieses Problem lösen. Dies wird aber dein Problem nur einmal lösen. Wenn du rebootest, dann mußt du diese Prozedur wiederholen. Daher ist dies nur als vorübergehende Lösung gedacht, und du solltest das Problem durch das Neukompilieren deines eigenen Kernels lösen. Dein Kernel wird die option BOOT_CONFIG benötigen, die GENERIC bereits beinhält.
Den Großteil dieses Dokumentes kannst du in der Manualseite boot_config(8) finden.
Um in die Benutzerkernelkonfiguration (User Kernel Config) oder UKC zu gelangen, mußt du beim Starten die -c Option verwenden.boot> boot wd0a:/bsd -c
Oder welchen Kernel du auch immer laden willst. So kommst du in die UKC. Hier kannst du Befehle ausführen, die kernelspezifische Geräte ändern oder deaktivieren.
Hier eine Liste der gängigen Befehle in der UKC.
add device - Füge ein Gerät durch Kopieren eines anderen hinzu
change devno | device - Ändere ein oder mehrere Geräte
disable devno | device - Deaktiviere ein oder mehrere Geräte
enable devno | device - Aktiviere ein oder mehrere Geräte
find devno | device - Suche ein oder mehrere Geräte
help - Kurze Zusammenfassung dieser Befehle
list - Liste ALLE bekannten Geräte auf
exit/quit - Setze Starten fort
show [attr [val]] - Zeige alle Geräte mit Eigenschaft (attribute) und optional mit einem spezifierten Wert (value)
Wenn du einmal dein Gerät konfiguriert hast, dann steige mit quit oder exit aus UKC aus und setze das Starten fort. Nun solltest du deine Kernelkonfiguration korrigieren und einen eigenen Kernel kompilieren. Siehe Einen eigenen Kernel kompilieren für weitere Hilfe.
Mehr Lognachrichten während des Startens zu bekommen kann sehr hilfreich sein, wenn man Bootprobleme lösen will. Wenn du ein Problem hast und du zuwenig Informationen beim Starten erhältst, dann gib beim Starten bei "boot>" wieder "-c" ein, um zur UKC zu gelangen, dann:
UKC> verbose autoconf verbose enabled UKC> quit
Nun wirst du extrem ausführliche Meldungen beim Booten erhalten.
Mit der Version 2.6 kamen die Optionen -e und -u zu config(8). Diese Optionen können extrem hilfreich sein und Zeit einsparen, die du sonst zum Kernelkompilieren benötigst. Die -e Option erlaubt dir die UKC auf einem laufenden System zu benutzen. Die Änderungen werden dann beim nächsten Reboot wirksam. Die -u Option testet, ob irgendwelche Änderungen am laufenden Kernel während des Bootens gemacht wurden. D.h., ob du mittels boot -c die UKC beim Starten benutzt hast.
Das folgende Beispiel zeigt das Deaktivieren des ep* Gerätes aus dem Kernel. Zur Sicherheit mußt du die -o Option benutzen, die Änderung in die angegebene Datei schreibt. Z.B.: config -e -o bsd.new /bsd wird die Änderungen in bsd.new schreiben. Das folgende Beispiel verwendet die -o Option nicht, daher werden die Änderungen einfach ignoriert und nicht in eine Kernelbinärdatei geschrieben. Für weitere Informationen über Fehler- und Warnmeldungen siehe die config(8) Manualseite.
$ sudo config -e /bsd
OpenBSD 2.6 (GENERIC) #1: Tue Nov 16 21:25:10 EST 1999
ericj@oshibana:/usr/src/sys/arch/i386/compile/GENERIC
warning: no output file specified
Enter 'help' für information
ukc> ?
help Command help list
add dev Add a device
base 8|10|16 Base on large numbers
change devno|dev Change device
disable attr val|devno|dev Disable device
enable attr val|devno|dev Enable device
find devno|dev Find device
list List configuration
lines count # of lines per page
show [attr [val]] Show attribute
exit Exit, mitout saving changes
quit Quit, saving current changes
ukc> list
0 audio* at sb0|sb*|gus0|pas0|sp0|ess*|wss0|wss*|ym*|eap*|eso*|sv*
1 midi* at sb0|sb*|opl*|opl*|opl*|ym*|mpu*
2 nsphy* at xe*|ef*|sf*|xl*|tl*|rl*|fxp* phy -1
3 inphy* at xe*|ef*|sf*|xl*|tl*|rl*|fxp* phy -1
4 iophy* at xe*|ef*|sf*|xl*|tl*|rl*|fxp* phy -1
5 exphy* at xe*|ef*|sf*|xl*|tl*|rl*|fxp* phy -1
6 rlphy* at xe*|ef*|sf*|xl*|tl*|rl*|fxp* phy -1
7 icsphy* at xe*|ef*|sf*|xl*|tl*|rl*|fxp* phy -1
8 sqphy* at xe*|ef*|sf*|xl*|tl*|rl*|fxp* phy -1
9 ukphy* at xe*|ef*|sf*|xl*|tl*|rl*|fxp* phy -1
10 scsibus* at bt0|bt1|bt2|aha0|aha1|aha*|ahb*|ahc0|ahc*|ahc*|isp*|aic0|aic*|ncr*|adv*|adw*|sea0|uha0|uha1|uha*|wds0|atapiscsi*
11 cd* at scsibus* target -1 lun -1
12 ch* at scsibus* target -1 lun -1
13 sd* at scsibus* target -1 lun -1
14 st* at scsibus* target -1 lun -1
15 ss* at scsibus* target -1 lun -1
16 uk* at scsibus* target -1 lun -1
17 atapiscsi* at wdc0|wdc1|wdc*|wdc*|pciide* channel -1
--- more ---
[snip]
ukc> disable ep
31 ep0 disabled
32 ep* disabled
33 ep* disabled
87 ep0 disabled
88 ep0 disabled
89 ep* disabled
90 ep* disabled
136 ep* disabled
ukc> quit
not forced
Im obigen Beispiel werden alle ep* Geräte aus dem Kernel entfernt und werden auch nicht abgefragt. In einigen Situationen, in denen du die UKC beim Booten mittels boot -c benutzt hast, willst du diese Änderungen dauerhaft niederschreiben. Dafür brauchst du die -u Option. Im folgenden Beispiel wurde die UKC gestartet und das wi(4) Gerät deaktiviert. Da diese Änderung mit boot -c NICHT dauerhaft sind, müssen die Änderungen erst geschrieben werden. Dieses Beispiel schreibt die Änderung in boot -c in eine neue Kernelbinärdatei namens bsd.new.
$ sudo config -e -u -o bsd.new /bsd
OpenBSD 2.6 (GENERIC) #1: Tue Nov 16 21:25:10 EST 1999
ericj@oshibana:/usr/src/sys/arch/i386/compile/GENERIC
Processing history...
151 wi* disabled
Enter 'help' for information
ukc> quit
[Zurück zum Hauptindex] [Zu Kapitel 4.0 - Installationsleitfaden] [Zu Kapitel 6.0 - Netzwerk Einstellungen]