沈天真
作者沈天真·2021-03-16 15:57
售前支持·IPS

运行容器,提示 “Exec Format Error” ?

字数 1336阅读 15618评论 0赞 0

容器的启动过程

很多人都运行过容器,但是容器的启动过程到底是怎样的,可能很多人并没有太在意。这里我们先了解一下容器的启动过程,假设键入命令 docker run -i -t ubuntu /bin/bash

来运行一个容器,大致过程可以用下图描述。

首先系统要有一个docker daemon的后台进程在运行,当命令敲下时,

1.docker client(即:docker终端命令行)会调用docker daemon请求启动一个容器,

2.docker daemon会向host os(即:Linux)请求创建容器

3.Linux会创建一个空的容器(可以简单理解为:一个未安装操作系统的裸机,只有虚拟出来的CPU、内存等硬件资源)

4.docker daemon检查本机是否存在docker镜像文件(可以简单理解为操作系统安装光盘),如果有,则加载到容器中(即:光盘插入裸机,准备安装操作系统)。如果发现文件不存在,则会到默认的docker镜像注册机构(即:docker hub网站)去联网下载,下载回来后,再进行装载到容器的动作。

5.将镜像文件加载到容器中(即:裸机上安装好了操作系统,不再是裸机状态)

最后,我们就得到了一个ubuntu的容器,然后就可以进行各种操作了。

那么,在最后一步加载镜像文件时,有时会提示”Exec Format Error ”。

错误码定义

以K1 Power Linux (ppc64le) 运行容器为例,从GitHub上下载 docker-ce 的源码,经过查找,发现 “exec format error”错误定义在文件

docker-ce-19.03.14/components/engine/vendor/golang.org/x/sys/unix/ zerrors_linux_ppc64le.go

中:

{8, "ENOEXEC", "exec format error"}

而错误码 “ENOEXEC”是Linux 内核定义的错误,定义在文件

/usr/include/asm/errno.h 中:

#define ENOEXEC 8 / Exec format error /

这个错误码的本意是 “It's from trying to execute a file that has a magic number that the kernel doesn't know how to handle.” “magic number”即“幻数”,它可以用来标记文件或者协议的格式,很多文件都有幻数标志来表明该文件的格式。

常见原因

发生 “exec format error”表示Linux内核无法理解你要执行的这个文件到底是个什么东西,常见的原因包括:

ü CPU位数不兼容,例如在一个64位的系统上,执行一个32位的文件。

ü 操作系统不兼容,例如在Linux系统上,执行一个Windows系统下生成的文件。

ü CPU架构不兼容,例如在 PPC64LE 即Power CPU上,执行一个 x86 架构下的文件;

反之亦然。

以经验看,当在做不同架构迁移时,最容易犯的错误,就是将x86的容器镜像文件,直接在Power(PPC64LE)平台上运行。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

X社区推广