首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以设置一个arm64码头映像,但什么都不能运行

我可以设置一个arm64码头映像,但什么都不能运行
EN

Stack Overflow用户
提问于 2022-05-31 23:39:22
回答 1查看 1.6K关注 0票数 0

我有一个CentOS 7 x86_64虚拟机。我需要在OracleLinux8 arm64停靠容器中做一些事情。

我安装了docker和qemu:

代码语言:javascript
运行
复制
$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 
$ sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin \
 qemu-system-arm qemu qemu-user qemu-kvm qemu-kvm-tools libvirt virt-install \
 libvirt-python libguestfs-tools-c

然后我启动了docker并设置了qemu-用户静态:

代码语言:javascript
运行
复制
$ sudo systemctl start docker
$ docker run --rm --privileged multiarch/qemu-user-static --reset

我的Dockerfile是:

代码语言:javascript
运行
复制
FROM oraclelinux:8.5
ENV container docker
RUN dnf -y install sssd nscd unzip zip xz which file
RUN useradd --uid 1001 -ms /bin/bash cm
RUN uname -m

然后使用以下内容创建x86_64和arm64映像:

代码语言:javascript
运行
复制
docker buildx create --name ol8_builder
docker buildx --builder ol8_builder build -t frickson/oracle8 . --platform=linux/amd64 --load --progress=plain
docker buildx --builder ol8_builder build -t frickson/oracle8arm . --platform=linux/arm64 --load --progress=plain

在这两个映像的构建过程中,RUN useradd工作并创建用户。RUN uname -m在这两个系统上工作,产生正确的输出(分别是x86_64aarch64 )。

x86_64机器正常工作:

代码语言:javascript
运行
复制
$ docker run --rm --privileged frickson/oracle8 uname -m
x86_64

但是arm64机器没有:

代码语言:javascript
运行
复制
$ docker run --platform linux/arm64 --rm --privileged frickson/oracle8arm uname -a
exec /usr/bin/uname: no such file or directory

我猜它找不到一个或多个库,因为它在映像构建过程中工作。尝试运行任何命令(bashlstrue)都会产生相同的错误消息。

知道我错过了什么吗?谢谢!

编辑:回复@JosephSible-ReinstateMonica:

它没有起作用。我也不能用ARM主机来检查我的照片。

代码语言:javascript
运行
复制
$ sudo docker run --platform linux/arm64 -it --rm --privileged oraclelinux:8 /bin/bash
Unable to find image 'oraclelinux:8' locally
8: Pulling from library/oraclelinux
e12ce518ed4b: Pull complete 
Digest: sha256:cad3a3dc2dd9f03dec02642dce1f194562e7f21820bc36ceb9f7b070d337fb45
Status: Downloaded newer image for oraclelinux:8
exec /bin/bash: no such file or directory
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-01 04:19:26

运行docker run --rm --privileged multiarch/qemu-user-static --reset时,它将aarch64二进制文件的处理程序设置为:

代码语言:javascript
运行
复制
[root@localhost ~]# cat /proc/sys/fs/binfmt_misc/qemu-aarch64
enabled
interpreter /usr/bin/qemu-aarch64-static
flags:
offset 0
magic 7f454c460201010000000000000000000200b700
mask ffffffffffffff00fffffffffffffffffeffffff

不幸的是,CentOS 7没有这些二进制文件的-static版本:

代码语言:javascript
运行
复制
[root@localhost ~]# ls /usr/bin/qemu-aarch64*
/usr/bin/qemu-aarch64

幸运的是,multiarch/qemu-user-static容器在映像中包含了必要的二进制文件;您可以这样复制到主机上:

代码语言:javascript
运行
复制
$ docker run --rm  --entrypoint tar multiarch/qemu-user-static \
    -C /usr/bin -cf- . | tar -C /usr/bin -xf-

现在我们有:

代码语言:javascript
运行
复制
[root@localhost bin]# ls /usr/bin/qemu-aarch64*
/usr/bin/qemu-aarch64  /usr/bin/qemu-aarch64_be-static  /usr/bin/qemu-aarch64-static

这使我们非常接近,但是我们需要像多弓/qemu的文档-用户静态中所描述的那样将静态二进制文件挂载到映像中。

代码语言:javascript
运行
复制
[root@localhost bin]# docker run --platform linux/arm64 --rm -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static  oraclelinux:8.5 uname -a
Linux 2d7e2e0ce6d7 3.10.0-1160.66.1.el7.x86_64 #1 SMP Wed May 18 16:02:34 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux

(或者您需要将解释器构建到图像中。)

我们需要在qemu-aarch64-static 7的容器中挂载CentOS,因为内核似乎不支持binfmt_misc解释器的F标志。F标志意味着:

F - fix二进制 binfmt_misc的通常行为是在调用misc格式文件时懒洋洋地生成二进制文件。但是,这在挂载名称空间和changeroots面前不能很好地工作,因此F模式在模拟安装后立即打开二进制文件,并使用打开的映像生成仿真器,这意味着无论环境如何变化,一旦安装,它总是可用的。

(来自内核文档)

如果在命令行上设置了multiarch/qemu-user-static,则multiarch/qemu-user-static将设置--persistent yes标志,但在CentOS 7上,这将失败,原因如下:

代码语言:javascript
运行
复制
$ docker run --rm --privileged multiarch/qemu-user-static --reset
--persistent yes
...
Setting /usr/bin/qemu-aarch64-static as binfmt interpreter for aarch64
sh: write error: Invalid argument

使用最近的Fedora发行版(可能还有其他发行版),您可以简单地安装qemu-user-static包,一切都会正常工作(不需要使用multiarch/qemu-user-static映像):

代码语言:javascript
运行
复制
$ cat /etc/fedora-release
Fedora release 34 (Thirty Four)
$ rpm -q qemu-user-static
qemu-user-static-5.2.0-9.fc34.x86_64
$ uname -m
x86_64
$ docker run --platform linux/arm64 --rm oraclelinux:8.5 uname -a
Linux 6f04d17234f5 5.17.6-100.fc34.x86_64 #1 SMP PREEMPT Mon May 9 14:41:31 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux

qemu-user-static包为您安装所有binfmt_misc注册。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72455086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档