Benutzer-Werkzeuge

Webseiten-Werkzeuge


linux:multiarch-qemu-user-static

ARM (und mehr) Binarys auf x86_64 ausführen mittels binfmt_misc + qemu

Hintergrund zu binfmt_misc Kernelmodul:

und QEMU User space emulator:

* https://qemu.weilnetz.de/doc/qemu-doc.html#QEMU-User-space-emulator

Eingerichtet ist es sehr schnell mit Docker. Der Container muss mit –privileged gestartet werden, andernfalls kann nicht in /proc/sys/fs/binfmt_misc geschrieben werden. Es wird -p verwendet um die Interpreter im Speicher zu halten (persistent). Wenn man es ohne Docker realisieren möchte gibt es im Debian Wiki eine Anleitung

# registrieren
$ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

Mehr Infos zu multiarch/qemu-user-static:

* https://github.com/multiarch/qemu-user-static

Nun werden die Interpreter registriert:

Setting /usr/bin/qemu-alpha-static as binfmt interpreter for alpha
Setting /usr/bin/qemu-arm-static as binfmt interpreter for arm
Setting /usr/bin/qemu-armeb-static as binfmt interpreter for armeb
Setting /usr/bin/qemu-sparc-static as binfmt interpreter for sparc
Setting /usr/bin/qemu-sparc32plus-static as binfmt interpreter for sparc32plus
Setting /usr/bin/qemu-sparc64-static as binfmt interpreter for sparc64
Setting /usr/bin/qemu-ppc-static as binfmt interpreter for ppc
Setting /usr/bin/qemu-ppc64-static as binfmt interpreter for ppc64
Setting /usr/bin/qemu-ppc64le-static as binfmt interpreter for ppc64le
Setting /usr/bin/qemu-m68k-static as binfmt interpreter for m68k
Setting /usr/bin/qemu-mips-static as binfmt interpreter for mips
Setting /usr/bin/qemu-mipsel-static as binfmt interpreter for mipsel
Setting /usr/bin/qemu-mipsn32-static as binfmt interpreter for mipsn32
Setting /usr/bin/qemu-mipsn32el-static as binfmt interpreter for mipsn32el
Setting /usr/bin/qemu-mips64-static as binfmt interpreter for mips64
Setting /usr/bin/qemu-mips64el-static as binfmt interpreter for mips64el
Setting /usr/bin/qemu-sh4-static as binfmt interpreter for sh4
Setting /usr/bin/qemu-sh4eb-static as binfmt interpreter for sh4eb
Setting /usr/bin/qemu-s390x-static as binfmt interpreter for s390x
Setting /usr/bin/qemu-aarch64-static as binfmt interpreter for aarch64
Setting /usr/bin/qemu-aarch64_be-static as binfmt interpreter for aarch64_be
Setting /usr/bin/qemu-hppa-static as binfmt interpreter for hppa
Setting /usr/bin/qemu-riscv32-static as binfmt interpreter for riscv32
Setting /usr/bin/qemu-riscv64-static as binfmt interpreter for riscv64
Setting /usr/bin/qemu-xtensa-static as binfmt interpreter for xtensa
Setting /usr/bin/qemu-xtensaeb-static as binfmt interpreter for xtensaeb
Setting /usr/bin/qemu-microblaze-static as binfmt interpreter for microblaze
Setting /usr/bin/qemu-microblazeel-static as binfmt interpreter for microblazeel
Setting /usr/bin/qemu-or1k-static as binfmt interpreter for or1k

fertig.

Test lokal:

# irgendein programm
$ my-arm-binary 
hello world

Test mit docker:

$ docker run --rm -it arm64v8/alpine:latest
/ # ldd
musl libc (aarch64)
Version 1.1.24
Dynamic Program Loader
Usage: /lib/ld-musl-aarch64.so.1 [options] [--] pathname

Aus Prozesssicht:

# Prozess starten
/ # sleep 2000 &
/ # ps
PID   USER     TIME  COMMAND
    1 root      0:00 {sh} /usr/bin/qemu-aarch64-static /bin/sh
   14 root      0:00 {sleep} /usr/bin/qemu-aarch64-static /bin/sleep 2000
   17 root      0:00 {/bin/ps} /bin/ps

Test mit systemd-nspawn und einem alpine aarch64 rootfs

# ein alpine aarch64 container anlegen

$ mkdir alpine-aarch64
$ wget http://dl-cdn.alpinelinux.org/alpine/v3.11/releases/aarch64/alpine-minirootfs-3.11.6-aarch64.tar.gz
$ tar -xpf alpine-minirootfs-3.11.6-aarch64.tar.gz -C ./alpine-aarch64

# create container

$ systemd-nsspawn -M someMachine -D alpine-aarch64/
Spawning container someMachine on /home/user/Machines/alpine-aarch64.
Press ^] three times within 1s to kill container.
~ # uname -m
aarch64

Informationen über registrierte Interpreter

Verzeichnis /proc/sys/fs/binfmt_misc mit registrierten Interpretern:

sudo tree /proc/sys/fs/binfmt_misc/
/proc/sys/fs/binfmt_misc/
├── qemu-aarch64
├── qemu-aarch64_be
├── qemu-alpha
├── qemu-arm
├── qemu-armeb
├── qemu-hppa
├── qemu-m68k
├── qemu-microblaze
├── qemu-microblazeel
├── qemu-mips
├── qemu-mips64
├── qemu-mips64el
├── qemu-mipsel
├── qemu-mipsn32
├── qemu-mipsn32el
├── qemu-or1k
├── qemu-ppc
├── qemu-ppc64
├── qemu-ppc64le
├── qemu-riscv32
├── qemu-riscv64
├── qemu-s390x
├── qemu-sh4
├── qemu-sh4eb
├── qemu-sparc
├── qemu-sparc32plus
├── qemu-sparc64
├── qemu-xtensa
├── qemu-xtensaeb
├── register
└── status

Informationen über ein Interpreter und dessen Konfiguration (man beachte die „magic Number“, die das ganze ermöglicht):

$ cat /proc/sys/fs/binfmt_misc/qemu-aarch64
enabled
interpreter /usr/bin/qemu-aarch64-static
flags: F
offset 0
magic 7f454c460201010000000000000000000200b700
mask ffffffffffffff00fffffffffffffffffeffffff
Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
linux/multiarch-qemu-user-static.txt · Zuletzt geändert: 2020/06/02 17:58 von haiko

hello, world