centos7 x86_64 下通过qemu-user-static 运行arm64的docker镜像
程序员文章站
2022-07-14 10:27:26
...
1、qemu-user-static的下载(x86_64)
wget https://github.com/multiarch/qemu-user-static/releases/download/v5.2.0-2/qemu-aarch64-static
1、binfmt支持
#重置binfmt
docker run --rm --privileged multiarch/qemu-user-static --reset
#设置binfmt
docker run --rm --privileged multiarch/qemu-user-static -p yes #在centos7下不生效
确认是否成功
[[email protected] binfmt_misc]# ls -al /proc/sys/fs/binfmt_misc
总用量 0
drwxr-xr-x 2 root root 0 4月 1 14:15 .
dr-xr-xr-x 1 root root 0 4月 1 14:15 ..
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-aarch64
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-aarch64_be
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-alpha
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-arm
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-armeb
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-hppa
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-m68k
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-microblaze
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-microblazeel
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-mips
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-mips64
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-mips64el
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-mipsel
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-mipsn32
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-mipsn32el
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-or1k
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-ppc
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-ppc64
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-ppc64le
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-riscv32
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-riscv64
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-s390x
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-sh4
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-sh4eb
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-sparc
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-sparc32plus
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-sparc64
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-xtensa
-rw-r--r-- 1 root root 0 4月 2 11:33 qemu-xtensaeb
--w------- 1 root root 0 4月 2 11:33 register
-rw-r--r-- 1 root root 0 4月 1 14:15 status
由于qemu-user-static结合binfmt_misc来实现arm架构的指令模拟,所有与Linux kernel相关。
我们遇到的问题:本地UBUNTU 16.04使用kernel 4.15.0-74-generic,可正常模拟arm架构指令;而集群中CentOS 07使用kernel 3.10.0-327.el7.x86_64,在模拟指令时出现问题,抛出“standard_init_linux.go:190: exec user process caused “no such file or directory””错误。具体问题描述参见Issue 100.
主要问题是kernel 3.10版本上的entry file中的flags为空,不是F。
解决方法:
安装Centos 8来升级kernel version;
手动mount qemu-aarch64-static到容器;
1、方法一 (直接mount)
docker run -it --rm -v `pwd`/qemu-aarch64-static:/usr/bin/qemu-aarch64-static arm64v8/redis uname -m
#aarch64
2、方法二 (把qemu-aarch64-static放到docker里面)
docker build --rm -t "arm64v8/redis_new" -<<EOF
FROM multiarch/qemu-user-static:x86_64-aarch64 as qemu
FROM arm64v8/redis
COPY --from=qemu /usr/bin/qemu-aarch64-static /usr/bin
EOF
docker run --rm -t "arm64v8/redis_new" uname -m
#aarch64
下一篇: Spring Bean的生命周期及预处理