アーキテクチャ間の Docker コンテナのエミュレーションが停止します。

アーキテクチャ間の Docker コンテナのエミュレーションが停止します。

QEMUを使用して移植可能なクロスアーキテクチャDockerコンテナを構築しようとしています。ただし、コンテナはホストシステムとホストにインストールされているプログラムによって異なる動作をします。

Windowsでコンテナを実行すると、シミュレーションは正常に動作します。 Ubuntu 16.04でもよく戻りますいつqemu-user-staticがインストールされました。しかし、そうでない場合、シミュレーションは停止します。

ホストカーネル(LinuxのDocker)または仮想マシンカーネル(WindowsのDocker)でbinfmtサポートが有効になっており、必要なバイナリがコンテナファイルシステムで利用可能である限り、シミュレーションは機能します。

私の目標は、qemuをカーネルのインタプリタとして登録しなくても、コンテナを移植可能で実行可能にすることです。顧客はホストOS自体やカーネルへの変更を禁止するからです。ただし、現在のコンテナを実行した結果は次のとおりです。

$ sudo docker run -ti qemu:xenial_arm64
qemu-aarch64-static: /usr/bin/groups: cannot execute binary file: Exec format error
/usr/bin/lesspipe: line 28: /usr/bin/basename: cannot execute binary file: Exec format error
/usr/bin/lesspipe: line 282: /usr/bin/dirname: cannot execute binary file: Exec format error
/usr/bin/lesspipe: line 295: [: =: unary operator expected
qemu-aarch64-static: /usr/bin/dircolors: cannot execute binary file: Exec format error
root@41f2795e2569:/# uname -m
qemu-aarch64-static: /bin/uname: cannot execute binary file: Exec format error

ただし、qemu-user-staticをインストールすると(qemuをインストールするとbinfmt_miscでも有効になります):

$ sudo apt-get -yqq install qemu-user-static
Selecting previously unselected package qemu-user-static.
(Reading database ... 245713 files and directories currently installed.)
Preparing to unpack .../qemu-user-static_1%3a2.5+dfsg-5ubuntu10.42_amd64.deb ...
Unpacking qemu-user-static (1:2.5+dfsg-5ubuntu10.42) ...
Processing triggers for man-db (2.7.5-1) ...
Setting up qemu-user-static (1:2.5+dfsg-5ubuntu10.42) ...

$ sudo docker run -ti qemu:xenial_arm64
root@7903b45a3c1e:/# uname -m
aarch64

これに関する私の説明は次のとおりです。

  • qemu-aarch64-static が /bin/bash シミュレーションを開始します。
  • /bin/bash は execve(..) を使用して別の実行可能ファイルを呼び出します。
  • Linuxホスト:
    • ホストまたはコンテナでbinfmt_miscが有効になっている場合(Linuxでは、ホストとDockerゲストがカーネルを共有する)、qemuはarm64実行可能ファイルのインタプリタとして動的に割り当てられます。
    • そうしないと、「Exec 形式エラー」のため実行が失敗します。
  • Windowsホスト:
    • WindowsとLinuxはカーネルが異なるため、ホストカーネルにシステムコールを渡してLinuxゲストを実行することはできません。
    • したがって、Windowsでは、コンテナは別のカーネルを使用してVM内で実行され、そのカーネルはコンテナと共有されます。
    • binfmt-supportを含むqemu-user-staticがコンテナにインストールされ有効になっている場合でも、その目的を達成でき、qemuを他のアーキテクチャの実行可能ファイルへのインタプリタとして動的に割り当てることができます。

LinuxとWindowsで実行すると、同じ結果が表示されます。

考えられる解決策は、--privilegedフラグを使用してコンテナを起動することです。その後、binfmt_miscをマウントし、qemu-user-staticをコンテナ内のインタプリタとして登録できます。ただし、お客様はこのロゴを使用することは禁止されています。

説明された方法をテストしました。ここqemu-user の場合は -0 フラグです。どちらも機能しません。

ドッカーファイル:

FROM scratch
ADD xenial-arm64-rootfs /
ADD qemu-aarch64-static /usr/bin/qemu-aarch64-static
RUN chmod +x /usr/bin/qemu-aarch64-static
ENTRYPOINT ["/usr/bin/qemu-aarch64-static", "-0", "/usr/bin/qemu-aarch64-static"]
CMD ["/bin/bash"]

/usr/bin/qemu-aarch64-static から取得した qemu-aarch64-static (qemu-user-static でインストール) xenial-arm64-rootfs を生成:

qemu-debootstrap --arch=arm64 --components=main,universe,multiverse,restricted --variant=buildd --foreign xenial xenial-arm64-rootfs http://ports.ubuntu.com/ubuntu-ports/

シミュレーションを続行するにはどうすればよいですか?

ベストアンサー1

おすすめ記事