[OpenBSD]

[FAQ-Index] [Zum Kapitel 4 - Installationsanleitung] [Zum Kapitel 6 - Netzwerk]

5 - Das System aus dem Source-Code erzeugen


Inhaltsverzeichnis



5.1 - OpenBSDs ,flavors'

Es gibt drei ,flavors' von OpenBSD: Grafisch sieht die Entwicklung dieser ,flavors' ungefähr so aus:
       ,------o-----------o----X                    3.5 Stable
       |      .           .
       |      .    ,------o---------o----X          3.6 Stable
       |      .    |      .         .
       |      .    |      .    ,----o----------o--> 3.7 Stable
       |      .    |      .    |    .          .
       |      .    |      .    |    .    ,-----o--> 3.8 Stable
       |      .    |      .    |    .    |     .
       |      .    |      .    |    .    |     .
 -->3.5Rel----->3.6Rel----->3.7Rel----->3.8Rel----> Current

          Zeit --->

-Current ist der Ort, an dem die aktive Arbeit gemacht wird und wird dann das nächste -release von OpenBSD. Alle sechs Monate, wenn eine neue Version von OpenBSD veröffentlicht wird, wird -current markiert (tagged) und wird -release: ein fester Punkt in der Geschichte des Source-Trees. Kein -release wird jemals verändert; es ist das, was auf den CDs und FTP-Servern vorliegt.

-Stable basiert auf -release und ist ein ,branch' des Hauptentwicklungsweges von OpenBSD. Wenn sehr wichtige Korrekturen in -current durchgeführt wurden, werden sie zurück in die -stable-,branches' portiert. Das ist der Grund, warum -stable auch als ,patch branch' bezeichnet wird. In der obigen Illustration sind die vertikalen gepunkteten Linien Fehlerkorrekturen, die in die -stable-,branches' eingefügt wurden. Du wirst auch erkennen, dass der Lebenszyklus des 3.5-stable-,branch' im obigen Beispiel mit Erscheinen des 3.7-release und der 3.6-stable-,branch' mit Erscheinen von 3.8-release beendet war - alte Versionen werden typischerweise noch zwei Releases lang weitergepflegt. Es braucht nunmal Ressourcen und Zeit, ältere Versionen zu pflegen, und obwohl wir das gerne tun würden, konzentrieren wir uns doch lieber auf neue Funktionen. Der -stable-,branch' kann vom Design her sehr leicht aus dem -release-,branch' der selben Version erzeugt werden (z. B. von 3.8-release zu 3.8-stable).

Der -stable-,branch' ist -release plus Patches, die man auf der Errataseite findet, und ein paar einfachen Fixes, die keinen Errata-Eintrag verdienen. Normalerweise ist die Bedienung und der Betrieb von -stable genauso wie der des -release, auf dem er basiert. Wenn die Manualseiten geändert werden müssen, wird es wahrscheinlich nicht in -stable eingefügt werden. Mit anderen Worten, Unterstützung für neue Hardware wird NICHT in -stable eingefügt und neue Funktionen werden nur dann eingefügt, wenn das als sehr wichtig erachtet wird.

An dieser Stelle sei erwähnt, dass der Name ,-stable' nicht ausdrücken soll, dass -current unzuverlässig sei. Stattdessen ändert und entwickelt sich current, während die Funktionsweise von -stable nicht mehr geändert wird, so dass du dein System nicht neu erlernen musst. In der Tat kann es sein, da unsere Bemühungen darin bestehen, OpenBSD zu verbessern, dass du die Zuverlässigkeit von -current besser als bei -stable empfindest.

Warnung: -current ist ein sich bewegendes Ziel. Es ändert sich fast minütlich und kann sich genauso gut mehrere Male in der Zeit ändern, die man braucht, um dem Source-Code zu holen. Obwohl die Entwickler hart daran arbeiten, sicherstellen zu können, dass das System immer compiliert und dass es keine großen Fehler gibt, ist es durchaus möglich, -current-Source herunterzuladen, der nicht compiliert, während es fünf Minuten später wieder einwandfrei funktioniert. Es gibt ebenfalls ,flag days' und große Systemänderungen, die die Entwickler mit Tools navigieren, die nur einmal genutzt werden können, was bedeutet, dass source-basierendes Aktualisieren nicht möglich ist. Wenn du damit nicht umgehen kannst, lass deine Finger von -current.

Die meisten Benutzer sollten also einfach -stable oder -release benutzen. Da das jetzt klar ist, sollte man aber auch wissen, dass viele Leute -current auf Produktionssystemen fahren, und das ist insofern wichtig, weil es hilft, Bugs zu finden und neue Funktionalitäten zu testen. Wenn du aber nicht weißt, wie man sauber Probleme beschreibt, diagnostiziert oder damit umgeht, rede dir (oder jemand anderem) besser nicht ein, du würdest ,dem Projekt helfen', indem du -current benutzt. ,Es funktioniert nicht!' ist keine nützliche Fehlermeldung. ,The recent changes to the pciide driver broke compatibility with my Slugchip-based IDE interface, dmesg of working and broken systems follow...' könnte dagegen durchaus ein sinnvoller und nützlicher Bericht sein.

Es mag Zeiten geben, in denen auch ein ,normaler' Benutzer gerne ,auf des Messers Schneide' leben will und -current benutzt. Der häufigste Grund dafür ist, dass er ein Gerät hat, was nicht von -release unterstützt wird (und daher natürlich auch nicht von -stable), oder er möchte eine neue Funktion aus -current benutzen. In diesem Fall hat er die Wahl zwischen -current oder dem Nichtbenutzen seines Gerätes, und dann ist eben das Benutzen von -current oftmals weniger schlimm. Man sollte dann aber auf keinen Fall ein Händchenhalten der Entwickler erwarten, falls es zu Problemen kommt.

Snapshots

Zwischen den formalen Veröffentlichungen neuer Versionen von OpenBSD werden Snapshots über die FTP-Seiten verfügbar gemacht. Wie der Name schon sagt, sind das Versionen vom Code, der gerade zu eben diesem Zeitpunkt aktuell war, als der Übersetzer des Snapshots sich eine Kopie des Source-Codes für eben diese Plattform gemacht hat. Denke bitte daran, dass es auf einigen Plattformen auch einige TAGE sein können, bis der Snapshot dann auch kompiliert und zur Verfügung gestellt wird. Es gibt auch keinerlei Garantien, dass die Snapshots funktionsfähig oder auch nur installationsfähig sind. Oftmals werden Snapshots dann erzeugt, wenn es eine Änderung gibt, die getestet werden muss. Bei einigen Plattformen werden Snapshots auf fast täglicher Basis erstellt, andere sind weniger regelmäßig. Wenn du unbedingt -current benutzen willst, ist ein aktueller Snapshot oft das einzige, was du dazu brauchst, und das Upgraden auf den aktuellen Snapshot ist auch eine Voraussetzung, um -current zu erzeugen.

Manchmal wird gefragt, ob es einen Weg gibt, genau den Source-Code zu bekommen, der zur Erzeugung eines Snapshot eingesetzt wurde. Die Antwort ist ,Nein'. Erstens ergibt sich daraus kein besonderer Vorteil. Zweitens werden Snapshots nach Bedarf erzeugt, wenn die Zeit es erlaubt oder es genügend Ressourcen gibt. Auf schnellen Plattformen könnten z.B. mehrere Snapshots an einem Tag freigegeben werden. Auf den langsameren kann das schon mal eine ganze Woche dauern. Und das Platzieren einer Markierung (Tag) für jeden Snapshot im Source-Code ist nun wirklich extrem unpraktisch.

Die Dinge synchron halten

Es ist wichtig zu verstehen, dass OpenBSD ein Betriebssystem ist und als ganzes gesehen werden muss, nicht ein Kernel mit einem Schwanz an Applikationen, die drangehängt sind. Du musst sicherstellen, dass dein Kernel, dein ,userland' (die unterstützenden Werkzeuge und Dateien) und dein Ports-Tree alle synchronisiert sind, oder es werden unangenehme Dinge passieren. Oder anders ausgedrückt (da es immer wieder Leute gibt, die das versuchen), kannst du keine brandneuen Ports auf einem System laufen lassen, das einen Monat alt ist oder einen Kernel aus -current neu erzeugen und dann erwarten, dass er mit einem release-,userland' zusammenarbeitet. Ja, das heißt, dass du dein System auf aktuellem Stand halten musst, wenn du ein neues Programm laufen lassen willst, das z.B. erst heute in den Ports-Tree eingefügt wurde. Tut uns erneut leid, aber OpenBSD hat nunmal nur sehr begrenzte Ressourcen, so dass wir sowas nicht ändern können.

Man sollte verstehen, dass der Update-Prozess nur in eine Richtung unterstützt wird: Von älter zu neuer und von -stable zu -current. Du kannst kein 3.8-current (oder einen Snapshot) laufen lassen und dich dann entscheiden, dass dir das zu gefährlich ist, und einfach nach 3.8-stable zurückgehen. Du bist auf dich allein gestellt, wenn du einen anderen Weg wählst als den normalen und unterstützten, nämlich dein System von Grund auf neu zu installieren; erwarte bitte keinerlei Hilfeleistung vom OpenBSD-Entwicklerteam.

Ja, das soll wirklich heißen, dass du lange und intensiv darüber nachdenken sollst, bevor du dich an -current wagst.

5.2 - Warum muss ich mein System vom Source aus erzeugen?

Eigentlich brauchst du das vermutlich nicht.

Einige Gründe, warum man NICHT vom Source aus erzeugen sollte:

Einige Gründe, warum du tatsächlich vom Source aus erzeugen möchtest oder musst:

Das OpenBSD-Team stellt neue Snapshots bereit, die auf -current-Code basieren, in einem sehr regulären Zeitrahmen für alle Plattformen bereit. Es ist sehr wahrscheinlich, dass das alles ist, das du benötigst, um -current laufen zu lassen.

Der häufigste Grund, vom Source aus zu erzeugen, ist das Folgen vom -stable-,branch', da das Erzeugen vom Source aus die einzige unterstützte Option ist ...

5.3 - OpenBSD vom Source aus erzeugen

5.3.1 - Überblick über den Erzeugungsprozess

OpenBSD vom Source aus zu erzeugen beinhaltet einige Schritte: Es gibt ein paar weitere Schritte, die einige Benutzer eventuell durchführen möchten, abhängig von dem Verwendungszweck der Erzeugung und ob X installiert ist:

5.3.2 - Zur naheliegendsten Binary aktualisieren oder diese installieren

Der erste Schritt beim Erzeugen vom Source aus besteht darin, sicherzustellen, dass du die verfügbare Binary, die am nächsten an deinem Ziel liegt, installiert hast. Verwende diese Tabelle, um zu sehen wo du bist, wo du hingehen möchtest und mit welcher Binary du starten solltest:

Du bist beim Ziel Binary-Upgrade auf dann ...
alten -release neues Release neuestes Release Fertig!
-release -stable neuestes Release downloade & erzeuge -stable
alten -stable -stable neuestes Release downloade & erzeuge -stable
-release -current aktuellsten Snapshot (optional) downloade & erzeuge -current
alten -current -current aktuellsten Snapshot (optional) downloade & erzeuge -current

Es ist empfohlen, dass du die Binary unter Verwendung der ,Upgrade'-Option des Installationsmediums verwendest. Wenn das nicht möglich ist, kannst du auch die Binaries entpacken, so wie es hier beschrieben steht. Unabhängig davon musst du den gesamten Upgradeprozess durchführen, einschließlich dem Erzeugen möglicher Benutzer oder notwendiger /etc-Verzeichnisänderungen.

5.3.3 - Den passenden Quelltext runterladen

OpenBSD-Source wird unter Verwendung vom CVS-Versionskontrollsystem verwaltet, und cvs(1) wird genutzt, um eine Kopie des gewünschten Sources auf deine lokale Maschine zum Compilieren zu ziehen. Dies kann unter Verwendung eines AnonCVS-Servers geschehen (einer Maschine, die eine öffentlich zugängliche Kopie vom gesamten CVS-Repository hält, das vom OpenBSD-Projekt genutzt wird) oder von einem lokalen CVS-Repository, das du unter Verwendung von CVSup oder CVSync pflegst, welche als Packages vorliegen. CVSup kann ebenfalls in einem ,checkout-Mode genutzt werden, aber das wird an dieser Stelle nicht behandelt. Wenn du mehrere Maschinen hast, auf denen du den Source-Code-Tree bewahren willst, kann es für dich durchaus nützlich sein, ein lokales CVS-Repository zu führen, erstellt und gepflegt unter Verwendung von CVSup oder CVSync.

Nach der Entscheidung, welchen AnonCVS-Server du gerne verwenden willst, musst du ein ,checkout' für den Source-Tree durchführen, danach musst du dann den Tree durch das Ausführen von ,updates' pflegen, um aktualisierte Dateien auf deinen lokalen Tree zu ziehen.

Das CVS(1)-Kommando hat viele Optionen, einige von ihnen sind notwendig, um ein ,checkout' und ,update' für einen nutzbaren Tree durchzuführen. Andere Kommandos können dazu führen, dass dein Tree unbrauchbar wird. Diesen Anweisungen hier zu folgen und sie zu verstehen ist wichtig.

-current folgen

In diesem Fall nehmen wir ann, dass wir einen öffentlichen AnonCVS-Server, anoncvs@anoncvs.example.org:/cvs, verwenden. Wir nehmen des weiteren an, dass du sh(1) als deine Kommandoshell verwendest, wenn du eine andere Shell nutzen solltest, musst du diese Kommandos dementsprechend anpassen.

Um ein ,checkout' für einen -current-CVS-src-Tree durchzuführen, kannst du folgendes nutzen:

    # cd /usr
    # export CVSROOT=anoncvs@anoncvs.example.org:/cvs
    # cvs -d$CVSROOT checkout -P src

Sobald du einen Tree hast, kannst du ihn später jederzeit aktualisieren:

    # cd /usr/src
    # export CVSROOT=anoncvs@anoncvs.example.org:/cvs
    # cvs -d$CVSROOT up -Pd
-Stable folgen
Wenn du einen ,checkout' für einen alternativen ,branch' des Trees durchführen willst, wie zum Beispiel dem -stable-,branch', musst du den ,-r'-Modifizierer deinem Checkout nutzen:
    # cd /usr
    # export CVSROOT=anoncvs@anoncvs.example.org:/cvs
    # cvs -d$CVSROOT checkout -rOPENBSD_3_8 -P src
Dies wird die src-Datieen vom OPENBSD_3_8-,branch' ziehen, welcher ebenfalls als ,patch branch' oder ,-stable' bekannt ist. Den Code würdest du ähnlich aktualisieren:
    # cd /usr/src
    # export CVSROOT=anoncvs@anoncvs.example.org:/cvs
    # cvs -d$CVSROOT up -rOPENBSD_3_8 -Pd
Tatsächlich ist CVS nett genug, eine Markierung (Tag) an die runtergeladene Dateisystem anzuhängen, so dass du dir den ,-rOPENBSD_3_8'-Teil der Kommandozeile nicht merken musst, CVS wird sich immer daran erinnern, bis du ihn explizit zurücksetzt oder eine neue Markierung unter Verwendung der ,-A'-Option mit ,update' verwendest. Jedoch ist es vermutlich besser, zu viele Informationen in deine CVS-Kommandozeilen zu packen als zu wenig.

Obwohl nur der ,src'-Tree soweit gezeigt wurde, wirst du die gleichen Schritte für ,XF4' und ,ports' durchführen. Da alle Teile von OpenBSD synchron gehalten werden müssen, sollten alle Trees, die du verwendest, zur gleichen Zeit einem ,checkout' und Update unterzogen werden. Du kannst die ,checkouts' in einer Zeile kombinieren (-stable gezeigt):

    # cd /usr
    # export CVSROOT=anoncvs@anoncvs.example.org:/cvs
    # cvs -d$CVSROOT checkout -rOPENBSD_3_8 -P src ports XF4
Jedoch müssen Updates Verzeichnis für Verzeichnis durchgeführt werden.

Zu diesem Zeitpunkt, ob du nun -stable oder -current folgst, solltest du einen einsetzbaren Source-Tree haben. Sei vorsichtig damit, welchen Tree du beziehst -- es ist einfach zu versuchen, -current zu kompilieren, obwohl du auf -stable aus bist.

Den Tree vorladen: src.tar.gz, sys.tar.gz

Obwohl du den gesamten Source-Tree von einem AnonCVS-Server herunterladen kannst, ist es möglich, eine Menge Zeit und Bandbreite zu sparen, indem du deinen Source-Tree mit den Quelltextdateien von der OpenBSD-CD oder einem FTP-Server »vorladen«. Dies ist insbesondere dann der Fall, wenn du -stable einsetzt, da nur wenige Dateien zwischen dieser Version und dem -release, auf dem es basiert, geändert werden.

Um den Source-Tree von der CD in /usr/src zu entpacken (unter der Annahme, dass die CD unter /mnt gemountet wurde):

    # cd /usr/src; tar xzf /mnt/src.tar.gz
    # cd /usr; tar xzf /mnt/XF4.tar.gz
    # tar xzf /mnt/ports.tar.gz
Die zum Download auf den FTP-Servern vorliegenden Quelltextdateien befinden sich in zwei Dateien, um die Downloadzeit für jene Benutzer zu minimieren, die nur mit einem Teil des Trees arbeiten wollen. Die beiden Dateien sind sys.tar.gz, das alle Dateien enthält, um einen Kernel zu erstellen, und src.tar.gz, das alle anderen Userlandwerkzeuge mit Ausnahme des Ports-Trees und den X11-Quellen enthält. Normalerweise wirst du jedoch beide installieren wollen. Angenommen, dass sich die heruntergeladenen Dateien src.tar.gz und sys.tar.gz in /usr befinden:
    # cd /usr/src
    # tar xzf ../sys.tar.gz
    # tar xzf ../src.tar.gz
    # cd /usr
    # tar xzf XF4.tar.gz
    # tar xzf ports.tar.gz

Nicht jeder möchte alle Dateisets extrahieren, doch das System muss synchron gehalten werden: normalerweise müssen alle Teile des Trees eingerichtet werden.

Allgemeine CVS-Tipps

Wie zuvor schon beschrieben, gibt es einige Optionen, die notwendig sind, um einen gültigen src-Tree in OpenBSD zu erhalten. Die obige ,-P'-Option ist eine solche: Es ,prunes' (entfernt) Verzeichnisse, die leer sind. Über die Jahre wurden Verzeichnisse im OpenBSD-Source-Tree erstellt und gelöscht, und ab und zu werden die Namen von alten Verzeichnissen als Dateinamen genutzt. Ohne dieser ,-P'-Option wird dein Tree NICHT erfolgreich kompilieren.

Größtenteils gilt das gleiche für die -d-Option beim ,update'-Kommando -- es erstellt neue Verzeichnisse, die eventuell zum Tree seit deinem ersten ,checkout' hinzugefügt worden sein.

Erfahrene CVS-Anwender wundern sich vielleicht, warum CVSROOT angegeben und in diesem Beispiel genutzt wurde, obwohl cvs(1) sich die Angaben über den Server vom Tree merkt, auf den ein ,checkout' ausgeführt wurde. Das ist korrekt, aber trotzdem gibt es Momente, in denen man den standardmäßigen Anoncvs-Server überschreiben muss, viele Leute empfehlen daher immer das explizite Angeben vom Repository. Es ist an dieser Stelle ebenfalls erwähnenswert, dass, obwohl die CVSROOT-Umgebungsvariable direkt von cvs(1) genutzt werden kann, sie nur genutzt wird, wenn nichts anderes sie überschreibt (z.B. würde cvs(1) einen Fehler ohne dieser haben), wogegen das Angeben in der cvs(1)-Kommandozeile alle anderen Werte überschreibt.

Denke daran, dass in diesem Beispiel ein -Pd als Parameter für das up-Kommando genutzt wurde. Dies ist eine weitere dieser BENÖTIGTEN Optionen, welche es erlaubt, dass neue Verzeichnisse, die bisher nicht in deinem vorherigen ,checkout' existieren, während dem Update-Prozess erstellt werden.

Es ist oft nützlich, eine .cvsrc in deinem Heimatverzeichnis zu verwenden, um Standardwerte für einige dieser Optionen anzugeben. Ein Beispiel einer solchen .cvsrc-Datei:

    $ more ~/.cvsrc
    cvs -q -danoncvs@anoncvs.example.org:/cvs
    diff -up
    update -Pd
    checkout -P
Diese Datei veranlasst cvs(1) dazu, den anoncvs@anoncvs.example.org:/cvs-Server zu verwenden, normalerweise unnötige Ausgaben aller Operationen zu unterdrücken (,-q' heißt ,quiet' (ruhig)), dass ein ,cvs up'-Kommando standardmäßig -Pd nutzt, ein ,cvs diff' standardmäßig ,unified diffs' wegen dem ,-u' bereitstellt und dass ein ,cvs checkout' die ,-P'-Option verwenden wird. Obwohl diese Datei praktisch ist, wirst du Probleme haben, wenn du vergisst, dass diese Datei existiert oder du versuchst, Kommandos auf einer Maschine auszuführen, auf der diese Datei nicht existiert.

Da der Source-Tree aus einer großen Anzahl kleiner Dateien besteht, wird das Aktivieren von Softupdates für die Partition, auf der sich der Source-Tree befindet, zu einer deutlich spürbaren Leistungssteigerung führen.

5.3.4 - Einen Kernel erzeugen

Wir nehmen an, dass du einen standardmäßigen (GENERIC oder GENERIC.MP) Kernel an dieser Stelle erzeugen möchtest. Normalerweise ist es genau das, was du machen möchtest. Ziehe nicht in Betracht, einen angepasten Kernel zu erzeugen, wenn du noch nicht über den standardmäßigen Erzeugungsprozess hinaus bist.

Es ist offensichtlich, dass der Kernel eine SEHR hardwareabhängige Komponente des Systems ist. Der Source für den Kernel ist in dem /usr/src/sys-Verzeichnis. Einige Teile des OpenBSD-Kernel-Codes werden auf allen Plattformen verwendet, andere sind sehr spezifisch für einen Prozessor oder eine Architektur. Wenn du in das /usr/src/sys/arch/-Verzeichnis guckst, wirst du eventuelle Dinge sehen, die etwas verwirrend wirken -- zum Beispiel gibt es dort mac68k-, m68k- und mvme68k-Verzeichnisse. In diesem Fall verwendet sowohl die mvme68k- als auch die mac68k-Systeme den gleichen Prozessor, aber die Maschinen, auf denen sie basieren, sind sehr unterschiedlich, und benötigen daher einen sehr unterschiedlichen Kernel (zu einem Computer-Design gehört mehr als nur der Prozessor!). Jedoch gibt es auch Teile des Kernels die allgemein sind, solche Teile werden in dem m68k-Verzeichnis aufbewahrt. Wenn du einfach einen Kernel erzeugst, musst du dir über Basis-Architektur-Verzeichnisse wie m68k keine Gedanken machen, du wirst ausnahmslos in den ,compound'-Architektur-Verzeichnissen arbeiten, zum Beispiel mvme68k.

Kernel werden basierend auf den Kernel-Konfigurationsdateien erzeugt, welche sich in dem /usr/src/sys/arch/<deine Plattform>/conf-Verzeichnis befinden. Das Erzeugen des Kernels besteht aus dem Verwenden des config(8)-Programms, um eine Kernel-Compilier-Verzeichnis zu erstellen und einzurichten, welches dann /usr/src/sys/arch/<deine Plattform>/compile/<KernelName> genannt wird. Für dieses Beispiel nehmen wir an, dass du die i386-Plattform verwendest.

# cd /usr/src/sys/arch/i386/conf
# config GENERIC
# cd ../compile/GENERIC
# make clean && make depend && make
    [...jedemenge Ausgabe...]
# make install
Ersetze ,i386' in der ersten Zeile mit deinem Plattformnamen. Das machine(1)-Kommando kann dir sagen, was dein Plattformname ist, so dass eine offensichtliche Generalisierung das Nutzen des Kommandos ,cd /usr/src/sys/arch/`machine`/conf' statt der ersten Zeile ist.

Starte deine Maschine nun neu, um den neuen Kernel zu aktivieren. Bedenke, dass der neue Kernel vor dem nächsten Schritt laufen sollte, wobei es eventuell egal sein kann, wenn du den oben angegeben Ratschlag, auf die am nähesten liegende Binary zu aktualisieren, befolgt hast. Manchmal jedoch ändern sich die APIs und der alte Kernel wird nicht in der Lage sein, neue Applikationen auszuführen, aber der neue Kernel wird normalerweise die alten unterstützen.

Variationen zu dem obigen Prozess: nur lesbarer Source-Tree

Manchmal möchtest du vielleicht sicherstellen, dass dein /usr/src/sys-Verzeichnis nicht modifiziert wird. Dies kann durch das Verwenden des folgenden Prozesses realisiert werden:
$ cd /irgendwo
$ cp /usr/src/sys/arch/i386/conf/GENERIC .
$ config -s /usr/src/sys -b . GENERIC
$ make clean && make depend && make
   ... jedemenge Ausgaben ...
Denke daran, dass du einen Kernel ohne root-Zugriff erzeugen kannst, aber du musst root sein, um den Kernel zu installieren.

5.3.5 - Das ,userland' erzeugen

Es existiert ein bestimmter Prozess, der von OpenBSD verwendet wird. Prozesse, die unter anderen Betriebssystemen, mit denen du vertraut bist, genutzt werden, werden vermutlich nicht unter OpenBSD funktionieren, und du wirst ausgelacht werden, wenn du fragst, warum.

5.4 - Ein Release erstellen

Was ist ein ,Release' und warum würde ich eines erstellen wollen?

Ein Release ist ein kompletter Satz an Dateien, die verwendet werden können, um OpenBSD auf einem anderen Rechner zu installieren. Wenn du nur einen Computer hast, auf dem OpenBSD läuft, hast du wirklich keinen Grund, ein Release zu erstellen, da der obige Erzeugungsprozess alles macht, was du brauchst. Eine Beispielanwendung für den Releaseprozess wäre das Erzeugen von -stable auf einer schnellen Maschine und dann das Erstellen von einem Release, das auf all deinen Maschinen in deinem Büro installiert werden kann.

Der Releaseprozess verwendet die Binaries, während dem obigen Erzeugungsprozess in dem Verzeichnis /usr/obj erstellt wurden, so dass du diesen Schritt erfolreich abschließen musst, und nichts das /usr/obj-Verzeichnis beeinflusst. Eine Situation, in der das ein Problem sein könnte, ist, wenn du eine memory disk für dein /usr/obj verwendest, um ein wenig Extraleistung während dem Erzeugungsprozess, daher wirst du sicherlich nicht dein System zwischen dem ,Erzeugungs'- und dem ,Release'-Schritt neustarten wollen!

Der Releaseprozess erfordert zwei Arbeitsverzeichnisse, welche wir DESTDIR und RELEASEDIR nennen werden. Alle Dateien, die Teil einer ,sauberen' OpenBSD-Installation sind, werden an ihre richtige Stelle im DESTDIR kopiert. Sie werden dann getar(1)t und in das RELEASEDIR gelegt. Am Ende des Prozesses wird RELEASEDIR ein fertiges OpenBSD-Release enthalten. Der Releaseprozess wird ebenfalls /mnt verwenden, so dass dieser Ort für keine anderen Dinge während dem Releaseprozess genutzt werden sollte. Als Beispiel werden wir nun DESTDIR mit dem Wert /usr/dest und RELEASEDIR mit /usr/rel verwenden.

Der Releaseprozess bezieht einige Utilitys mit ein, welche nicht Teil des Basis-OpenBSD-Systems, crunch und crunchgen(), welche genutzt werden, um eine einzelne ausführbare Datei aus mehreren individuellen Binaries zu erstellen. Der Name, mit der diese einzelne Binary aufgerufen wird, entscheidet, welche Komponenten-Binary ausgeführt wird. Auf diese Weise werden individuelle Programme in den Ramdisk-Kernel gequetscht, der auf Bootdisketten und anderen Bootmedien vorliegt. Diese Utilitys müssen vor dem Beginn des Releaseprozesses erstellt werden. Sie müssen nur ein einziges Mal erzeugt und installiert werden, aber Leute vergessen diesen Schritt häufig, und diese Programme werden schnell erzeugt, so dass einige Leute dazu tendieren, crunch und crunchgen einfach jedes Mal als Teil des Skriptes zu erzeugen, das sie zum Erstellen eines Releases nutzen.

Du musst root-Privilegien haben, um ein Release zu erstellen.

Ein Release erstellen

Zu aller erst, falls es auf dieser Maschine noch nicht geschehen ist, erzeuge crunch und crunchgen:
# cd /usr/src/distrib/crunch && make obj depend all install
Nun definieren wir unsere DESTDIR- und RELEASEDIR-Umgebungsvariablen:
# export DESTDIR=/usr/dest
# export RELEASEDIR=/usr/rel
Wir leeren das DESTDIR und erstellen die Verzeichnisse, wenn das notwendig ist:
# test -d ${DESTDIR} && mv ${DESTDIR} ${DESTDIR}.old && rm -rf ${DESTDIR}.old &
# mkdir -p ${DESTDIR} ${RELEASEDIR}
RELEASEDIR muss normalerweise nicht vor dem Beginn des Releaseprozesses leer sein, jedoch könnten alte Dateien rumliegen bleiben, wenn sich Releasedateien oder ihre Namen geändert haben. Eventuell möchtest du das Verzeichnis vor dem Beginn ebenfalls löschen.

Wir erstellen nun das eigentliche Release:

# cd /usr/src/etc
# make release
Es ist eine gute Idee, nachdem das Release erstellt wurde, das Release zu überprüfen, ob die Tar-Dateien mit dem übereinstimmen, was im DESTDIR-Verzeichnis liegt. Die Ausgabe von diesem Schritt sollte sehr gering sein.
# cd /usr/src/distrib/sets
# sh checkflist
Du hast nun vollständige und überprüfte Dateisets in dem RELEASEDIR. Diese Dateien können nun verwendet werden, um OpenBSD auf anderen Maschinen zu installieren oder zu aktualisieren.

Die maßgeblichen Anweisungen, wie man ein Release erstellt, sind in release(8).

Hinweis: Wenn du die daraus resultierenden Dateien über HTTP für die Upgrade- und Installationsskripte zur Verfügung stellen willst, musst du eine ,index.txt'-Datei hinzufügen, in der eine Liste aller Dateien enthalten ist, die sich in deinem neu erzeugten Release befinden.

# /bin/ls -1 >index.txt

5.5 - X erzeugen

X verwendet einen anderen Erzeugungsprozess als der Rest vom OpenBSD-Tree, da dieser auf imake- und nicht auf dem standardmäßigen make(1)-Prozess basiert. Eine Konsequenz hieraus ist, dass es kein ,obj'-Verzeichnis gibt, generierte Binaries werden unter den Source-Code gemixt, was zu Problemen führen kann (oder zumindest zu sehr viel Ausgabe) mit cvs(1). Eine Lösung für dieses Problem ist, lndir(1) zu verwenden, um ein ,Schattenverzeichnis' (shadow directory) zu erstellen, das symbolische Verweise zum tatsächlichen Source-Verzeichnis für den XF4-Tree beinhaltet.

nur i386: Die i386-Plattform setzt voraus, dass die Packages tcl und tk vor dem Erzeugen von X installiert sein müssen (sie können im Ports-Tree unter /usr/ports/lang/tcl/8.4/ und /usr/ports/x11/tk/8.4/ gefunden werden. Das tk-Package wird als Abhängigkeit von tcl installiert). Wie sonst auch ist das Installieren eines Packages schneller als das Installieren dieser Applikationen vom Source aus. Das Fehlschlagen beim Erzeugen dieser Packages vor dem Erzeugen von X ist recht frustrierend, da das System für einige Zeit laufen wird, bevor es wegen einem Fehler aufhört.

Um X unter Verwendung des ,Schattenverzeichnisses' /usr/Xbld zu kompilieren, verwende die folgenden Schritte, um neue Binaries in die passenden Verzeichnisse zu kopieren:

# rm -rf /usr/Xbld
# mkdir -p /usr/Xbld
# cd /usr/Xbld 
# lndir ../XF4
   [...jede Menge Ausgabe...]
# make build
   [...jede Menge Ausgabe...]

Ein X-Release erstellen

Dies ist dem Hauptsystem-Releaseprozess sehr ähnlich. Nach dem erfolgreichen Erzeugen von X wirst du DESTDIR und RELEASEDIR aus dem gleichen Grund wie weiter oben erzeugen. RELEASEDIR kann das gleiche Verzeichnis sein wie das Hauptsystem-RELEASEDIR, aber DESTDIR wird in diesem Prozess gelöscht und wieder erstellt. Wenn es vorsichtig angestellt wird, ist dies kein Problem, aber separate DESTDIRs zu verwenden, kann ,sicherer' sein.

Für dieses Beispiel werden wir DESTDIR und RELEASEDIR jeweils mit den Werten /usr/Xbld/dest und /usr/Xbld/rel nutzen. Dies muss vor dem obigen Erzeugungsprozess gemacht werden.

# export DESTDIR=/usr/Xbld/dest
# export RELEASEDIR=/usr/Xbld/rel
# cd /usr/Xbld
# rm -rf dest
# mkdir dest rel
# make release

Falls du vor hast, sowohl einen ,build' und ein Release von X zu erstellen, kannst du ein anderes make(1)-,target', ,b-r', nutzen, welches dann zuerst die ,build'- und danach die Release-Schritte durchläuft. Das ,b-r'-,target' nimmt an, dass DESTDIR und RELEASEDIR die Unterverzeichnisse ,rel' und ,dest' sind, die unter deinem ,build'-Unterverzeichnis liegen:

# rm -rf /usr/Xbld
# mkdir -p /usr/Xbld /usr/Xbld/dest /usr/Xbld/rel
# cd Xbld 
# lndir ../XF4
   [...jede Menge AUsgabe...]
# make b-r
   [...jede Menge Ausgabe...]

5.6 - Warum brauche ich einen selbsterstellten Kernel?

Eigentlich brauchst du ihn vermutlich nicht.

Ein angepasster Kernel ist ein Kernel, der mit einer anderen Konfigurationsdatei als der bereitgestellten GENERIC-Konfigurationsdatei erstellt wurde. Ein angepasster Kernel kann auf -release-, -stable- oder -current-Code basieren, genauso wie der GENERIC es tun kann. Während das Kompilieren deines eigenen GENERIC-Kernels vom OpenBSD-Team unterstützt ist, ist es das Kompilieren eines selbst angepassten Kernels nicht.

Die standardmäßige OpenBSD-Kernelkonfiguration (GENERIC) ist dafür ausgerichtet, für die meisten Leute einsetzbar zu sein. Mehrere Leute haben beim Versuch, das System zu optimieren, ihr System zerschossen, statt die Systemleistung zu verbessern. Es gibt Leute, die meinen, dass du deinen Kernel anpassen musst, um die optimale Leistung zu erhalten, doch das stimmt nicht für OpenBSD. Nur die fortgeschrittensten und erfahrensten Anwender mit den anspruchsvollsten Applikationen müssen sich Gedanken über einen angepassten Kernel oder ein angepasstes System machen.

Einige Gründe warum du vielleicht einen angepassten Kernel erzeugen möchtest:

Einige Gründe, warum du keinen eigenen angepassten Kernel erzeugen solltest:

Das Entfernen von Gerätetreibern mag den Bootprozess von deinem System beschleunigen, aber wird den Wiederherstellungsprozess erschweren, wenn du ein Problem mit der Hardware hast, und wird meistens falsch durchgeführt. Das Entfernen der Gerätetreiber wird nicht dazu beitragen, dass dein System spürbar schneller wird, obwohl es einen kleineren Kernel erzeugt. ,Debugging'-Informationen und Fehlerüberprüfungsroutinen zu entfernen, kann das System spürbar beschleunigen, doch wird es die Untersuchung eines Systems unmöglich machen, wenn etwas schief geht.

Es sei an dieser Stelle noch einmal erwähnt, dass Entwickler normalerweise Fehlerberichte ignorieren, außer wenn sie ebenfalls mit einem GENERIC-Kernel hervorgerufen werden können. Du wurdest gewarnt.

5.7 - Einen angepassten Kernel erzeugen

Es wird angenommen, dass du das vorherige gelesen hast und wirklich auf Schmerzen stehst. Es wird des Weiteren angenommen, dass du ein Ziel hast, das man weder durch das Nutzen einer Bootzeit-Konfiguration (UKC>) noch durch config(8)urieren eines GENERIC-Kernels erreicht werden kann. Wenn diesen beiden Annahmen falsch sind, solltest du beim Verwenden von GENERIC bleiben. Wirklich.

Die OpenBSD Kernelgenerierung wird über Konfigurationsdateien verwaltet, die sich standardmäßig im /usr/src/sys/arch/<arch>/conf/-Verzeichnis befinden. Alle Architekturen haben eine Datei, GENERIC, die verwendet wird, um den Standard-OpenBSD-Kernel für diese Architektur zu erzeugen. Dort können sich ebenfalls andere Konfigurationsdateien befinden, die Kernel erzeugen, die andere Ziele verfolgen, zum Beispiel minimalen RAM, ,diskless workstations', etc.

Die Konfigurationsdatei wird von config(8) verarbeitet, das ein Compilationsverzeichnis in ../compile erstellt und einrichtet; bei einer typischen Installation wäre es in /usr/src/sys/arch/<arch>/compile/. config(8) erstellt ebenfalls eine Makefile und weitere Dateien, die für eine erfolgreiche Erstellung des Kernels notwendig sind.

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 an Möglichkeiten, deinen Kernel auf deine Wünsche abzustimmen. Hier werden wir nur auf einige der am häufigsten benutzten Möglichkeiten eingehen. Siehe die options(4)-Manualseite für eine komplette Liste der Optionen und, da diese sich von Zeit zu Zeit ändert, solltest du sicherstellen, dass du auch eine Manualseite für die gleiche Version von OpenBSD verwendest, das du erzeugst. Du kannst auch die Beispielkonfigurationsdateien zu Rate ziehen, die für deine Architektur zur Verfügung stehen.

Ändere, entferne oder füge niemals Optionen hinzu, wenn du keinen triftigen Grund dazu hast! Editiere nicht die GENERIC-Konfigurationsdatei!! Die einzige Kernelkonfiguration, die vom OpenBSD-Team unterstützt wird, ist der GENERIC-Kernel, die eine Kombination der Optionen in /usr/src/sys/arch/<arch>/conf/GENERIC und /usr/src/sys/conf/GENERIC ist, so, wie sie vom OpenBSD-Team bereit gestellt worden sind (d.h. NICHT verändert). Das Berichten eines Fehlers, der mit einem modifizierten Kernel zustande kam, resultiert meistens darin, dass dir gesagt wird, dass du versuchen sollst, das Problem mit einem GENERIC-Kernel zu reproduzieren. Nicht alle Optionen sind kompatibel untereinander und viele Optionen sind notwendig, damit das System läuft. Es besteht keine Garantie, dass ein Kernel läuft, nur weil du ihn kompilieren konntest. Es besteht außerdem keine Garantie, dass ein Kernel, der ,config(1)uriert' werden kann, auch erzeugt werden kann.

Hier kannst du die plattformspezifischen Konfigurationsdateien sehen:

Wenn du diese Dateien genauer betrachtest, dann wird dir am Anfang eine Zeile wie diese auffallen:

     include "../../../conf/GENERIC"
Dies bedeutet, dass ein Verweis auf eine andere Konfigurationsdatei vorhanden ist, eine, die plattformunabhängige Optionen beinhaltet. Wenn du also deinen eigenen Kernel konfigurieren willst, stelle sicher, dass du auch /sys/conf/GENERIC beachtet hast.

Kernelkonfigurationsoptionen sollten in deiner Kernelkonfigurationsdatei im Format von:

option      Name
oder
option      Name=Wert
angeführt sein. Um beispielsweise die ,DEBUG'-Option in den Kernel zu bringen, füge eine Zeile wie die folgende 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.

Ab und zu möchtest du vielleicht Optionen deaktivieren, die bereits definiert wurden, typischerweise in der Datei ,src/sys/conf/GENERIC'. Obwohl du eine Kopie dieser Datei verändern könntest, ist das Verwenden der rmoption-Angabe eine bessere Wahl. Falls du zum Beispiel den im Kernel befindlichen Debugger deaktivieren möchtest (nicht empfohlen!), würdest du eine Zeile wie diese:

     rmoption DDB
in deine Kernelkonfigurationsdatei hinzufügen. option DDB ist in src/sys/conf/GENERIC definiert, aber die oben angegebene rmoption-Zeile deaktiviert sie wieder.

Noch einmal, bitte siehe options(4) für weitere Informationen über die Spezifikationen dieser Optionen. Bedenke auch, dass viele dieser Optionen ihre eigenen Manualseiten haben - lies immer alles, was über eine Option verfügbar ist, bevor du sie zu deinem Kernel hinzufügst oder aus ihm entfernst.

Einen angepassten Kernel erzeugen

In diesem Fall werden wir einen Kernel erzeugen, der die boca(4)-ISA-Multiport serielle Karte unterstützt. Diese Karte ist nicht im GENERIC-Kernel, da er mit anderen Treibern in Konflikt gerät. Eine anderer häufiger Grund, einen angepassten Kernel zu erzeugen, wäre RAIDframe, das zu groß ist, um in einem Serienkernel zu sein. Es gibt zwei typische Wege, einen angepassten Kernel zu erzeugen: die GENERIC-Konfigurationsdatei unter anderem Namen zu kopieren und zu editieren oder eine ,wrapper'-Datei zu erstellen, die den Standard-GENERIC-Kernel ,einbindet' und du alle Optionen angibst, die du benötigst, die nicht in GENERIC sind. In diesem Fall sieht unsere ,wrapper'-Datei beispielsweise so aus:
include "arch/i386/conf/GENERIC"

boca0  at       isa? port 0x100 irq 10     # BOCA 8-port serial cards
pccom* at       boca? slave ?
Die zwei Zeilen bezüglich der boca(4)-Karte werden von den auskommentierten Zeilen in GENERIC kopiert und der IRQ nach eigenen Bedürfnissen angepasst. Der Vorteil der Nutzung dieser ,wrapper'-Datei ist, dass alle anderen Änderungen in der GENERIC automatisch aktualisiert werden, ohne dass irgendein anderer Quelltext aktualisiert werden müsste. Der Nachteil ist, dass man keine Devices entfernen kann (obwohl das normalerweise sowieso eine schlechte Idee ist).

Ein anderer Weg, einen angepassten Kernel zu generieren, ist, eine Kopie der standardmäßigen GENERIC zu machen, ihr einen anderen Namen zu geben und dann nach eigenen Bedürfnissen anzupassen. Der Nachteil dabei ist, dass spätere Updates für die GENERIC-Konfigurationsdatei in deine Kopie übertragen werden müssen oder aber du musst deine Konfigurationsdatei erneut erstellen.

Verwende in beiden Fällen, nachdem du deine angepasste Kernelkonfigurationsdatei erstellt hast, config(1) und erstelle den Kernel, wie es oben beschrieben wird.

Vollständige Instruktionen zum Erstellen deines eigenen angepassten Kernels sind in der afterboot(8)-Manualseite.

5.8 - Konfiguration zur Bootzeit

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 Bootzeit-Konfiguration dieses Problem lösen. Dies wird aber dein Problem nur einmal lösen. Wenn du rebootest, dann musst du diese Prozedur wiederholen. Daher ist dies nur als vorübergehende Lösung gedacht und du solltest das Problem mittels config(8) beheben. Dein Kernel wird dennoch option BOOT_CONFIG benötigen, die GENERIC bereits beinhaltet.

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, musst du die -c-Option beim Hochfahren verwenden.

boot> boot hd0a:/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.

Wenn du einmal deinen Kernel konfiguriert hast, dann steige mit quit oder exit aus UKC aus und setze das Starten fort. Danach solltest du deine Änderung am Kernelimage dauerhaft machen, indem du die Schritte gemäß Mittels config(8) deinen Kernel verändern ausführst.

5.9 - Mittels config(8) deinen Kernel verändern

Die -e- und -u-Optionen von config(8) können sehr hilfreich sein und Zeit sparen, die du mit dem Neukompilieren von Kerneln verschwenden würdest. 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 im Kernel. Zur Sicherheit musst du die -o-Option benutzen, die die Änderung in die angegebene Datei schreibt. config -e -o bsd.new /bsd zum Beispiel 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 3.8 (GENERIC) #138: Sat Sep 10 15:41:37 MDT 2005
    deraadt@i386.openbsd.org:/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
        timezone    [mins [dst]]        Show/change timezone
        nmbclust    [number]            Show/change NMBCLUSTERS
        cachepct    [number]            Show/change BUFCACHEPERCENT
        nkmempg     [number]            Show/change NKMEMPAGES
        shmseg      [number]            Show/change SHMSEG
        shmmaxpgs   [number]            Show/change SHMMAXPGS
ukc> list
  0 audio* at sb0|sb*|gus0|pas0|sp0|ess*|wss0|wss*|ym*|eap*|eso*|sv*|neo*|cmpci*|clcs*|clct*|auich*|autri*|auvia*|fms*|uaudio*|maestro*|esa*|yds*|emu* flags 0x0
  1 midi* at sb0|sb*|opl*|opl*|opl*|opl*|ym*|mpu*|autri* flags 0x0
  2 nsphy* at aue*|xe*|ef*|gx*|stge*|bge*|nge*|sk*|ste*|sis*|sf*|wb*|tx*|tl*|vr*|ne0|ne1|ne2|ne*|ne*|ne*|dc*|dc*|rl*|fxp*|fxp*|xl*|xl*|ep0|ep0|ep0|ep*|ep*|ep*|ep*|ep* phy -1 flags 0x0
  3 nsphyter* at aue*|xe*|ef*|gx*|stge*|bge*|nge*|sk*|ste*|sis*|sf*|wb*|tx*|tl*|vr*|ne0|ne1|ne2|ne*|ne*|ne*|dc*|dc*|rl*|fxp*|fxp*|xl*|xl*|ep0|ep0|ep0|ep*|ep*|ep*|ep*|ep* phy -1 flags 0x0
  4 qsphy* at aue*|xe*|ef*|gx*|stge*|bge*|nge*|sk*|ste*|sis*|sf*|wb*|tx*|tl*|vr*|ne0|ne1|ne2|ne*|ne*|ne*|dc*|dc*|rl*|fxp*|fxp*|xl*|xl*|ep0|ep0|ep0|ep*|ep*|ep*|ep*|ep* phy -1 flags 0x0
  5 inphy* at aue*|xe*|ef*|gx*|stge*|bge*|nge*|sk*|ste*|sis*|sf*|wb*|tx*|tl*|vr*|ne0|ne1|ne2|ne*|ne*|ne*|dc*|dc*|rl*|fxp*|fxp*|xl*|xl*|ep0|ep0|ep0|ep*|ep*|ep*|ep*|ep* phy -1 flags 0x0
  6 iophy* at aue*|xe*|ef*|gx*|stge*|bge*|nge*|sk*|ste*|sis*|sf*|wb*|tx*|tl*|vr*|ne0|ne1|ne2|ne*|ne*|ne*|dc*|dc*|rl*|fxp*|fxp*|xl*|xl*|ep0|ep0|ep0|ep*|ep*|ep*|ep*|ep* phy -1 flags 0x0
  7 eephy* at aue*|xe*|ef*|gx*|stge*|bge*|nge*|sk*|ste*|sis*|sf*|wb*|tx*|tl*|vr*|ne0|ne1|ne2|ne*|ne*|ne*|dc*|dc*|rl*|fxp*|fxp*|xl*|xl*|ep0|ep0|ep0|ep*|ep*|ep*|ep*|ep* phy -1 flags 0x0
  8 exphy* at aue*|xe*|ef*|gx*|stge*|bge*|nge*|sk*|ste*|sis*|sf*|wb*|tx*|tl*|vr*|ne0|ne1|ne2|ne*|ne*|ne*|dc*|dc*|rl*|fxp*|fxp*|xl*|xl*|ep0|ep0|ep0|ep*|ep*|ep*|ep*|ep* phy -1 flags 0x0
[...snip...]
--- more ---   
[snip]
ukc> disable ep
 67 ep0 disabled
 68 ep* disabled
 69 ep* disabled
155 ep0 disabled
156 ep0 disabled
157 ep* disabled
158 ep* disabled
210 ep* disabled
ukc> quit
not forced

Im obigen Beispiel werden alle ep* Geräte im Kernel deaktiviert und 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 ist, 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 3.8 (GENERIC) #138: Sat Sep 10 15:41:37 MDT 2005
    deraadt@i386.openbsd.org:/usr/src/sys/arch/i386/compile/GENERIC
Processing history...
105 wi* disabled
106 wi* disabled
Enter 'help' for information
ukc> quit

5.10 - Mehr ,verbose' Nachrichten während dem Booten erhalten

Mehr ,verbose' Nachrichten zu erhalten, kann sehr hilfreich sein, wenn man versucht, Probleme während des Bootens zu beheben. Wenn du ein Bootproblem hast, obwohl ein Diskettenboot keine hat, und mehr Informationen erhalten möchtest, starte einfach neu. Wenn du beim ,boot>'-Prompt angelangt bist, boot mit boot -c. Dies bring dich in den UKC>, wo du dann das machst:
UKC> verbose
autoconf verbose enabled
UKC> quit

Nun werden dir extrem viele ,verbose' Nachrichten beim Booten gegeben.

5.11 - Häufige Probleme beim Kompilieren und Erzeugen des Systems

5.11.1 - Das Erzeugen bricht mit einem ,Signal 11'-Fehler ab

OpenBSD und andere Programme vom Source aus erzeugen ist eine Aufgabe, die die Hardware stärker beansprucht als die meisten anderen, da intensive Verwendung der CPU, Festplatte und des Speichers vorliegt. Als Ergebnis, wenn du Hardware hast, die einen Fehler hat, ist der wahrscheinlichste Zeitpunkt, dass sich das Problem bemerkbar macht, beim Kompilieren. Signal 11 Fehler sind typischerweise durch Hardware Probleme verursacht, sehr häufig Speicherprobleme, können aber auch CPU-, Mainboard- oder Hitzeprobleme sein. Dein System mag ansonsten sogar sehr stabil sein, aber nicht in der Lage, Programme zu kompilieren.

Du wirst es vermutlich am besten finden, wenn du die Komponente, die die Fehler verursacht, reparierst oder austauschst, da Probleme sich auf andere Art und Weise in Zukunft zeigen könnten. Falls du Hardware hast, die du wirklich verwenden willst und sie dir sonst keine weiteren Probleme bereitet, installiere einfach einen Snapshot oder ein Release.

Siehe Sig11 FAQ für sehr viel mehr Informationen.

5.11.2 - ,make build' schlägt mit 'cannot open output file snake: is a directory' fehl

Dies ist das Resultat von zwei separaten Fehlern: Es ist wichtig, den Instruktionen sorgfältig zu folgen, wenn du deinen Tree herunterlädst und erzeugst.

5.11.3 - Mein System ohne IPv6 läuft nicht!

Stimmt. Bitte mach keine Modifikationen am Basis-System, von denen du nicht weißt, wie sie sich auswirken. Eine ,kleine' Änderung im Kernel kann große Auswirkungen für den gesamten Rest des Systems haben. Bitte lies das hier erneut.

5.11.4 - Hoppla! Ich habe vergessen, zuerst das /usr/obj-Verzeichnis zu erstellen!

Durch das Ausführen von ,make build' vor ,make obj' wirst du mit Objektdateien da stehen, die in deiem /usr/src-Verzeichnis herumliegen. Das ist eine schlechte Sache. Wenn du vermeiden willst, deinen gesamten Src-Tree erneut zu beziehen, kannst du folgendes versuchen, um die Obj-Dateien zu entfernen:
    # cd /usr/src
    # find . -type l -name obj | xargs rm
    # make cleandir
    # rm -rf /usr/obj/*
    # make obj

5.11.5 - Tipp: Lege /usr/obj auf seine eigene Partition

Wenn du häuft erzeugst, wirst du es vielleicht als schneller empfinden, wenn du /usr/obj auf seine eigene Partition legst. Der Nutzen ist einfach, es ist typischerweise schneller:
    # umount /usr/obj
    # newfs DeineObjPartition
    # mount /usr/obj
durchzuführen als ,rm -rf /usr/obj/*'.

5.11.6 - Wie verhindere ich das Erzeugen von bestimmten Teilen des Trees?

Manchmal möchtest du das Erzeugen von bestimmten Teilen des Trees verhindern, normalerweise, weil du einen Ersatz für eine mitgelieferte Applikation durch Packages hast oder weil du ein ,kleineres' Release aus welchem Grund auch immer haben willst. Die Lösung hierfür ist, die SKIPDIR-Option von /etc/mk.conf zu verwenden.

Hinweis: es ist möglich ein kaputtes (broken) System auf diesem Wege zu erzeugen. Die Resultate aus diesen Optionen wird vom OpenBSD-Projekt nicht unterstützt.

5.11.7 - Wo kann ich mehr über den Erzeugungsprozess erfahren?

Hier sind einige andere Ressourcen:

5.11.8 - Ich sehe keine Snapshots auf den FTP-Seiten. Wo sind sie geblieben?

Snapshots können entfernt werden, wenn sie zu alt werden (oder nicht länger relevant sind) oder wenn ein neues -release naht.

Wie führe ich ein ,bootstrap' für eine neue Version vom Compiler (gcc) aus?

Du solltest wirklich einfach den aktuellsten Snapshot installieren.

OpenBSD unterstützt nun zwei Compiler tree-intern, gcc v3.3.5, das von den meisten Plattformen genutzt wird, aber ebenfalls gcc v2.95.3, das von einigen wenigen Plattformen genutzt wird, die bisher noch nicht konvertiert wurden, oder aber niemals konvertiert werden, da Unterstützung vom gcc3 fehlt oder aber gcc3 eine schlechte Leistung erbringt.

Die zwei Compiler befinden sich an zwei unterschiedlichen Teilen des Trees:

Weil das Upgraden von einem Compiler in etwa ein Huhn-oder-Ei-Problem ist, benötigen Änderungen der tree-internen Compiler ein wenig Extra-Aufmerksamkeit. Du musst den Compiler zweimal erzeugen -- der erste ,build' erzeugt einen Compiler, der neuen Code erzeugt, aber mit Code arbeitet, der vom alten Compiler erzeugt wurde, der zweilte ,build' macht ihn vollständig zum einen Compiler. Generell wirst du wohl die folgende Prozedur durchführen:

    Falls deine Plattform gcc 2.95.3 verwendet:
       # rm -r /usr/obj/gnu/egcs/gcc/*
       # cd /usr/src/gnu/egcs/gcc
        - or -
    Falls deine Plattform gcc 3.3.5 verwendet:
       # rm -r /usr/obj/gnu/usr.bin/gcc/*
       # cd /usr/src/gnu/usr.bin/gcc

    Gemeinsame ,build'-Prozedur für v3.3.5 und v2.95.3
    # make -f Makefile.bsd-wrapper clean
    # make -f Makefile.bsd-wrapper obj
    # make -f Makefile.bsd-wrapper depend
    # make -f Makefile.bsd-wrapper
    # make -f Makefile.bsd-wrapper install
    # make -f Makefile.bsd-wrapper clean
    # make -f Makefile.bsd-wrapper depend
    # make -f Makefile.bsd-wrapper
    # make -f Makefile.bsd-wrapper install

Und führe anschließend ein normales make build durch.

Was ist der beste Weg um /etc, /var und /dev zu aktualisieren?

Als Richtlinie modifiziert Software im OpenBSD-Tree keine Dateien automatisch in /etc. Das bedeutet, dass es immer am Administrator liegt, die benötigten Modifikationen dort durchzuführen. Upgrades sind keine Ausnahme. Um Dateien in diesen Verzeichnissen zu aktualisieren, stelle erst einmal fest, welche Änderungen an den Basis- (Distributions) Dateien stattgefunden haben, und führe diese Änderungen erneut durch.

Um zum Beispiel die Dateien im Tree zu sehen, die zu letzt geändert wurden, führe dies aus:

    # cd /usr/src/etc
    # ls -lt |more

Um alle Änderungen in /etc zwischen zwei bestimmten Versionen von OpenBSD zu sehen, kannst du CVS verwenden. Um zum Beispiel die Änderungen zwischen 3.7 und 3.8 zu sehen, führe dies aus:

    # cd /usr/src/etc
    # cvs diff -u -rOPENBSD_3_7 -rOPENBSD_3_8
Um die Änderungen zwischen 3.8 und -current (,HEAD') zu sehen, führe dies aus:
    # cd /usr/src/etc
    # cvs diff -u -rOPENBSD_3_8 -rHEAD
Das /dev/MAKEDEV-Skript wird nicht automatisch als Teil des ,make build'-Prozesses aktualisiert, jedoch wird es als Teil eines Binary updates installiert. Als generelle Regel sei zu sagen, dass es eine gute Idee ist, dieses Skript zu kopieren (falls das notwendig ist) und von deinem Source-Tree aus aufzurufen, um ein Upgrade durchzuführen:
    # cd /dev
    # cp /usr/src/etc/etc.`machine`/MAKEDEV ./
    # ./MAKEDEV all

Sobald du die Änderungen ausgemacht hast, füge sie deinem lokalen Tree erneut zu, jegliche lokale Konfiguration, die du gemacht hast, bewahrend.

Typische /etc-Änderungen, auf die zwischen zwei Releases geachtet werden muss, sind unter anderem:

Diese Änderungen werden in upgrade37.html (um zum 3.8-Release zu gelangen) oder current.html (um zu -current zu gelangen).

5.11.11 - Gibt es einen einfachen Weg, um alle Datei-Hierarchien zu ändern?

Von Zeit zu Zeit werden Dateien oder Verzeichnisse zu der Datei hierarchy hinzugefügt oder aus ihr entfernt. Ebenfalls können sich Besitzer-Informationen für Teile des Dateisystems ändern. Ein einfacher Weg, um sicherzustellen, dass deine Datei-Hierarchie auf dem neuesten Stand ist, ist das Verwenden von dem mtree(8)-Utility.

Beziehe zuerst den aktuellsten Source, dann führe folgendes aus:

    # cd /usr/src/etc/mtree
    # install -c -o root -g wheel -m 600 special /etc/mtree
    # install -c -o root -g wheel -m 444 4.4BSD.dist /etc/mtree
    # mtree -qdef /etc/mtree/4.4BSD.dist -p / -u

Deine Datei-Hierarchie sollte nun auf dem neuesten Stand sein.

[FAQ-Index] [Zum Kapitel 4 - Installationsanleitung] [Zum Kapitel 6 - Netzwerk]


[zurück] www@openbsd.org
$OpenBSD: faq5.html,v 1.78 2006/01/06 12:42:40 jufi Exp $