centos7 x86_64 下通过qemu-user-static 运行arm64的docker镜像

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下不生效

确认是否成功

[root@localhost 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

你可能感兴趣的:(容器化)