Vorige: , Nach oben: Fremde Architekturen   [Inhalt][Index]


10.2 Native Erstellungen

Die Befehle, die es erlauben, mit einem gewählten System Erstellungen durchzuführen, haben die Befehlszeilenoptionen --list-systems und --system.

Die Befehlszeilenoption --list-systems listet alle unterstützten Systeme auf, mit denen erstellt werden kann, wenn man sie als Argument für --system angibt.

$ guix build --list-systems
Die verfügbaren Systeme sind:

   - x86_64-linux [current]
   - aarch64-linux
   - armhf-linux
   - i586-gnu
   - i686-linux
   - mips64el-linux
   - powerpc-linux
   - powerpc64le-linux
   - riscv64-linux

$ guix build --system=i686-linux hello
/gnu/store/cc0km35s8x2z4pmwkrqqjx46i8b1i3gm-hello-2.12

$ file /gnu/store/cc0km35s8x2z4pmwkrqqjx46i8b1i3gm-hello-2.12/bin/hello
/gnu/store/cc0km35s8x2z4pmwkrqqjx46i8b1i3gm-hello-2.12/bin/hello: ELF
32-bit LSB executable, Intel 80386 …

Im obigen Beispiel ist das aktuelle System x86_64-linux. Wir erstellen das hello-Paket aber für das System i686-linux.

Das geht, weil der i686-Befehlssatz der CPU eine Teilmenge des x86_64-Befehlssatzes ist, also Binärdateien für i686 auf einem x86_64-System laufen können.

Wenn wir aber im Rahmen desselben Beispiels das System aarch64-linux wählen und guix build --system=aarch64-linux hello auch wirklich Ableitungen erstellen muss, klappt das vielleicht erst nach einem weiteren Schritt.

Denn Binärdateien mit dem Zielsystem aarch64-linux können auf einem x86_64-linux-System erst mal nicht ausgeführt werden. Deshalb wird nach einer Emulationsschicht gesucht. Der GNU-Guix-Daemon kann den binfmt_misc-Mechanismus des Linux-Kernels dafür einsetzen. Zusammengefasst würde der Linux-Kernel die Ausführung einer Binärdatei für eine fremde Plattform wie aarch64-linux auslagern auf ein Programm der Anwendungsebene („User Space“); normalerweise lagert man so auf einen Emulator aus.

Es gibt einen Dienst, der QEMU als Hintergrundprogramm für den binfmt_misc-Mechanismus registriert (siehe qemu-binfmt-service-type). Auf Debian-basierten Fremddistributionen ist deren Alternative das Paket qemu-user-static.

Wenn der binfmt_misc-Mechanismus falsch eingerichtet ist, schlägt die Erstellung folgendermaßen fehl:

$ guix build --system=armhf-linux hello --check
…
 unsupported-platform /gnu/store/jjn969pijv7hff62025yxpfmc8zy0aq0-hello-2.12.drv aarch64-linux
while setting up the build environment: a `aarch64-linux' is required to
build `/gnu/store/jjn969pijv7hff62025yxpfmc8zy0aq0-hello-2.12.drv', but
I am a `x86_64-linux'…

Aber wenn der binfmt_misc-Mechanismus richtig mit QEMU verbunden wurde, kann man diese Meldung erwarten:

$ guix build --system=armhf-linux hello --check
/gnu/store/13xz4nghg39wpymivlwghy08yzj97hlj-hello-2.12

Der größte Vorteil, den man davon hat, nativ zu erstellen statt zu cross-kompilieren, ist, dass die Erstellung bei mehr Paketen klappt. Doch es hat seinen Preis: Mit QEMU als Hintergrundprogramm zu kompilieren ist viel langsamer als Cross-Kompilierung, weil jede Anweisung emuliert werden muss.

Die Verfügbarkeit von Substituten für die Architektur, die man bei --system angibt, lindert dieses Problem. Eine andere Möglichkeit ist, GNU Guix auf einer Maschine zu installieren, deren CPU den Befehlssatz tatsächlich unterstützt, für den man erstellen möchte. Diese Maschine kann man über den Mechanismus zum Auslagern von Erstellungen einbeziehen (siehe Nutzung der Auslagerungsfunktionalität).


Vorige: Cross-Kompilieren, Nach oben: Fremde Architekturen   [Inhalt][Index]