クロスDockerの実行にqemuをコピーする必要がなくなった
クロスのDockerを実行するのに、以前はdocker imageの中に/usr/bin/qemu-aarch64-static
をコピーしておく必要がありました。
しかし現在はそれが不要になっています。
新しく立てたVMで実験
この記事で立てたVMを使用しています。
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
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
Discussion