IncludeOS ist ein einbindungsfähiges, minimales Unikernel-Betriebssystem für C++-Dienste, die in der Cloud und auf echter Hardware ausgeführt werden. Wenn Sie ein Programm mit #include <os>
starten, wird während der Verbindungszeit buchstäblich ein kleines Betriebssystem in Ihren Dienst eingebunden.
IncludeOS ist freie Software, „ohne Gewährleistungen oder Einschränkungen jeglicher Art“.
Hinweis: IncludeOS befindet sich in aktiver Entwicklung. Die öffentliche API sollte nicht als stabil angesehen werden.
Eine längere Liste der Funktionen und Einschränkungen finden Sie auf unserer Dokumentationsseite.
Zum Erstellen und Booten von IncludeOS-Diensten benötigen Sie nix und Linux. Nix lädt automatisch die richtigen Versionen aller erforderlichen Bibliotheken und Compiler herunter und richtet sie ein.
Um lokale Builds zu beschleunigen, empfehlen wir außerdem, nix mit Ccache-Unterstützung zu konfigurieren, dies ist jedoch keine Voraussetzung. Um Ccache zu verwenden, kann --arg withCcache true
zu den meisten unten gezeigten nix-build
und nix-shell
Befehlen hinzugefügt werden.
IncludeOS kann derzeit nicht auf macOS oder Windows erstellt werden.
Eine minimale IncludeOS-„Hallo Welt“ sieht aus wie ein normales C++-Programm:
# include < iostream >
int main (){
std::cout << " Hello world n " ;
}
Ein vollständiger „Hello World“-Dienst mit einem funktionierenden Nix-Workflow ist im Hello World-Repo verfügbar. Das Repository kann auch als Ausgangspunkt für die Entwicklung Ihres eigenen IncludeOS-Dienstes verwendet werden.
Weitere Beispiele für erweiterte Dienste finden Sie in den Integrationstests (unter ./IncludeOS/test/*/integration).
Um IncludeOS zu erstellen, führen Sie Folgendes aus:
$ nix-build
Dadurch werden die Toolchain und alle IncludeOS-Kernelbibliotheken erstellt.
Beachten Sie, dass die Fertigstellung des ersten Builds einige Zeit in Anspruch nehmen wird, da die IncludeOS-Toolchain aus dem Quellcode neu erstellt wird. Dazu gehören clang, llvm, libcxx, musl und so weiter. Für diese Dateien ist derzeit kein Nix-Binärcache verfügbar. Nachfolgende Builds werden viel schneller ausgeführt, wenn die Toolchain im lokalen Nix-Store zwischengespeichert wurde.
Nachdem Sie Änderungen am Kernel vorgenommen haben, führen Sie nix-build
erneut aus, um neue Binärdateien zu erhalten. Wenn Sie Änderungen in einem Abschnitt des Kernels iterieren, können Sie den Build mithilfe von Ccache erheblich beschleunigen. Alle nix-build
und nix-shell
Befehle in diesem Abschnitt unterstützen den optionalen Parameter --arg withCcache true
.
Es ist nicht immer praktisch, den gesamten Kernel während der Entwicklung neu zu erstellen. Mit shell.nix
können Sie eine Entwicklungs-Shell mit einer vorkonfigurierten Umgebung erhalten:
$ nix-shell
Es werden weitere Anweisungen zum optionalen Konfigurieren des VM-Netzwerks oder zum Überschreiben des Build-Pfads beim Starten der Shell angezeigt.
Standardmäßig erstellt die Shell auch den Unikernel aus example.nix
. Der Beispiel-Unikernel kann aus der Shell heraus gestartet werden:
$ nix-shell
[...]
nix$ boot hello_includeos.elf.bin
Wenn Sie einen anderen Unikernel als das Beispiel erstellen möchten, kann dies mit dem Parameter --argstr unikernel [path]
angegeben werden. Dies wird hauptsächlich für Integrationstests verwendet. So erstellen und führen Sie beispielsweise den Stacktrace-Test aus:
$ nix-shell --argstr unikernel ./test/kernel/integration/stacktrace
[...]
nix$ ls -l kernel *
kernel_stacktrace
nix$ boot kernel_stacktrace
[...]
Calling os::print_backtrace ()
symtab or strtab is empty, indicating image may be stripped
[0] 0x000000000025dcd2 + 0x000: 0x25dcd2
[1] 0x000000000021097d + 0x000: 0x21097d
[2] 0x00000000002b370a + 0x000: 0x2b370a
[3] 0x0000000000210eea + 0x000: 0x210eea
We reached the end.
So erstellen und führen Sie die Test-VM als einzelnen Befehl aus:
$ nix-shell --argstr unikernel ./test/kernel/integration/stacktrace --run ./test.py
Sie können alle Integrationstests mit dem Skript ./test.sh
ausführen. Die Tests werden lokal in der Nix-Umgebung ausgeführt. Wir empfehlen, vor der Übermittlung einer neuen PR an IncludeOS manuell zu überprüfen, ob alle Tests lokal bestanden wurden, um Überprüfungszeit zu sparen.
Einzelne Tests können direkt mit nix-shell
ausgeführt werden. Weitere Informationen finden Sie unter test.sh
IncludeOS wird auf GitHub entwickelt. Erstellen Sie Ihren eigenen Fork und senden Sie uns eine Pull-Anfrage. Bitte lesen Sie die Richtlinien für Beiträge zu IncludeOS.
Wir möchten uns so weit wie möglich an die ISO C++ Core Guidelines halten. Wenn Sie Code in IncludeOS finden, der nicht passt, teilen Sie uns dies bitte im Issue-Tracker mit – oder noch besser: beheben Sie ihn in Ihrem eigenen Fork und senden Sie uns eine Pull-Anfrage.
Wenn Sie ein Sicherheitsproblem in IncludeOS entdecken, meiden Sie bitte den öffentlichen Issue-Tracker. Senden Sie stattdessen eine E-Mail an [email protected]. Weitere Informationen und Verschlüsselung finden Sie in der Dokumentation.