🐈

クロスDockerの実行にqemuをコピーする必要がなくなった

2022/05/01に公開

クロスのDockerを実行するのに、以前はdocker imageの中に/usr/bin/qemu-aarch64-staticをコピーしておく必要がありました。
https://embedded.hatenadiary.org/entry/20140820/p1

しかし現在はそれが不要になっています。

新しく立てたVMで実験

この記事で立てたVMを使用しています。
https://zenn.dev/tetsu_koba/articles/b2489355a7dec0

ubuntu@u01:~$ docker run -it arm64v8/ubuntu:20.04
Unable to find image 'arm64v8/ubuntu:20.04' locally
20.04: Pulling from arm64v8/ubuntu
d4ba87bb7858: Pull complete 
Digest: sha256:ca83774d06420ceb4682ef73bd9cbbfc38a97a27e061b578547a6761206658b9
Status: Downloaded newer image for arm64v8/ubuntu:20.04
WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64) and no specific platform was requested
standard_init_linux.go:228: exec user process caused: exec format error

試しにもう一回。

ubuntu@u01:~$ docker run -it arm64v8/ubuntu:20.04
WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64) and no specific platform was requested
standard_init_linux.go:228: exec user process caused: exec format error

ダメ。

qemu-user-static をインストールする。

ubuntu@u01:~$ sudo apt install qemu-user-static
ubuntu@u01:~$ cat /proc/sys/fs/binfmt_misc/qemu-aarch64 
enabled
interpreter /usr/bin/qemu-aarch64-static
flags: OCF
offset 0
magic 7f454c460201010000000000000000000200b700
mask ffffffffffffff00fffffffffffffffffeffffff
ubuntu@u01:~$ ls -l /usr/bin/qemu-aarch64-static 
-rwxr-xr-x 1 root root 6638096 Feb 23 02:44 /usr/bin/qemu-aarch64-static

これでもう一回チャレンジ。

ubuntu@u01:~$ docker run -it arm64v8/ubuntu:20.04
WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64) and no specific platform was requested
root@828bba0296b3:/#

今度は起動できました。

root@828bba0296b3:/# uname -a
Linux 828bba0296b3 5.4.0-109-generic #123-Ubuntu SMP Fri Apr 8 09:10:54 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux
root@828bba0296b3:/# 

別のttyから以下を実行

ubuntu@u01:~$ ps ax |grep [q]emu
  14477 pts/0    Ssl+   0:00 /usr/bin/qemu-aarch64-static /usr/bin/bash

/usr/bin/qemu-aarch64-static を経由して/usr/bin/bashが実行されているのがわかります。

binfmt_misc

https://www.kernel.org/doc/html/latest/admin-guide/binfmt-misc.html

F - fix binary
The usual behaviour of binfmt_misc is to spawn the binary lazily when the misc format file is invoked. However, this doesn’t work very well in the face of mount namespaces and changeroots, so the F mode opens the binary as soon as the emulation is installed and uses the opened image to spawn the emulator, meaning it is always available once installed, regardless of how the environment changes.

インストールされたときにinterpreterをオープンして準備しておくので、chrootされていても大丈夫になったようです。いつからこのようになったのだろう?ちなみに今回のカーネルのバージョンは以下の通り。

ubuntu@u01:~$ cat /proc/version
Linux version 5.4.0-109-generic (buildd@ubuntu) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #123-Ubuntu SMP Fri Apr 8 09:10:54 UTC 2022

関連

Momoをarm64のLinuxで(無理矢理)ビルドする

Discussion