Home

Awesome

<p align="center"> <a title="dbhi.github.io/qus" href="https://dbhi.github.io/qus"><img src="./docs/_static/logo/logo_blur.png" width="550"/></a> </p> <p align="center"> <a title="dbhi.github.io/qus" href="https://dbhi.github.io/qus"><img src="https://img.shields.io/website.svg?label=dbhi.github.io%2Fqus&longCache=true&style=flat-square&url=http%3A%2F%2Fdbhi.github.io%2Fqus%2Findex.html"></a><!-- --> <a title="Docker Hub" href="https://hub.docker.com/r/aptman/qus/"><img src="https://img.shields.io/docker/pulls/aptman/qus.svg?longCache=true&style=flat-square&logo=docker&logoColor=fff&label=aptman%2Fqus"></a><!-- --> <a title="Releases" href="https://github.com/dbhi/qus/releases"><img src="https://img.shields.io/github/commits-since/dbhi/qus/latest.svg?longCache=true&style=flat-square"></a><!-- --> <a title="'Test' workflow Status" href="https://github.com/dbhi/qus/actions/workflows/Test.yml"><img alt="'Test' workflow Status" src="https://img.shields.io/github/actions/workflow/status/dbhi/qus/Test.yml?branch=main&longCache=true&style=flat-square&logo=github&label=Test"></a><!-- --> <a title="'Canary' workflow Status" href="https://github.com/dbhi/qus/actions/workflows/Canary.yml"><img alt="'Canary' workflow Status" src="https://img.shields.io/github/actions/workflow/status/dbhi/qus/Canary.yml?branch=main&longCache=true&style=flat-square&logo=github&label=Canary"></a> </p>

qemu-user-static (qus) is a compilation of utilities, examples and references to build and execute OCI images (aka docker images) for foreign architectures using QEMU's user-mode emulation.

Find further details at dbhi.github.io/qus.

Usage

NOTE: Although docker is used in these examples, users have reported that other engines such as podman can also be used. See also kata-containers/runtime#1280.

As a GitHub Action

Run the Action without arguments for registering all the supported interpreters:

  - uses: dbhi/qus/action@main

Optionally, provide a space-separated list of target architectures:

  - uses: dbhi/qus/action@main
    with:
      targets: arm aarch64

Then, execute foreign binaries and/or containers straightaway!

NOTE: yaml-multiline.info

Setup

The recommended approach is to run the following container:

docker run --rm --privileged aptman/qus -s -- -p [TARGET_ARCH]

NOTE: since aptman/qus is a manifest, this command works on amd64, arm64v8, arm32v7, arm32v6, i386, s390x or ppc64le hosts.

The required qemu-*-static binaries (which are all included in the image) will be loaded and registered. The container will then exit. From there on, images and/or binaries for foreign architectures can be executed.

Optional argument TARGET_ARCH is the target architecture to be translated through QEMU. If it is omitted, all available targets will be registered and loaded. The supported values are the following:

i386 i486 alpha arm armeb sparc32plus ppc ppc64 ppc64le m68k mips mipsel mipsn32 mipsn32el mips64 mips64el sh4 sh4eb s390x aarch64 aarch64_be hppa riscv32 riscv64 xtensa xtensaeb microblaze microblazeel or1k x86_64

NOTE: sudo privileges on the host are required in order to register binfmt formats. On GNU/Linux, it is possible to execute register.sh directly. On Windows, a container must be used, so that changes are applied to the underlying VM, since no kernel is available on the host (i.e., from the test list, only C, V, I or D will work on Windows).

Reset

In order to unset the registered formats, and unload the binaries, run:

docker run --rm --privileged aptman/qus -- -r

Help

# docker run --rm --privileged aptman/qus -h
Usage: register.sh [--help][--interactive][--list][--static][-- ARGS]

  Wrapper around qemu-binfmt-conf.sh, to configure binfmt_misc to use qemu interpreter

  -h|--help|-help:
      display this usage

  -i|--interactive|-interactive:
      execute all the remaining args with 'sh -c', then exit

  -l|--list|-list:
      list currently registered interpreters

  -s|--static|-static:
      add '--qemu-suffix -static' to ARGS

  -- ARGS:
     arguments for qemu-binfmt-conf.sh

  To register a single static target persistently, use e.g.:

      register.sh -s -- -p aarch64

  To remove all register interpreters and exit, use:

      register.sh -- -r

Bandwidth-efficient procedure

In contexts such as CI pipelines it might be desirable to reduce the required bandwidth. Hence, instead of using aptman/qus images —which include all the binaries for all the supported target architectures—, individual tarballs are available through GitHub Releases. These can be used along with aptman/qus:register images or with register.sh (without an OCI runtime). See either f, F, c, C, v or V in Tests for examples of these use cases.