一般情况下,不同的硬件平台(CPU)具有不同的指令集,源代码只有通过对应编译器才能得到在该平台下运行的可执行文件,对于不同操作系统,由于OS提供给用户程序的接口不同,也必须有相应的编译器产生对应的可执行文件。这样看来几乎不可能有跨平台的可执行文件。
有一般就有特殊。
在x86-64 的Ubuntu 中执行:
$ docker pull arm64v8/busybox
完成之后进入docker的home目录。一般在/var/lib/docker,找到刚刚pull下来的image的rootfs,我这里就不讲怎么找到了,简单的方法是你只有刚下载的busybox image,如果docker 存储驱动是overlay2,那么rootfs就在overlay2下面,
/var/lib/docker/overlay2# ls
d66e8e37afa6ac6ac08ebf64a680f01063e6fd851aed57affb039973c18fd4a4 eb8bd5773fed50a4ba79b035e1b0a4c7997684e81aa7065d89f5f9d185e7afee eb8bd5773fed50a4ba79b035e1b0a4c7997684e81aa7065d89f5f9d185e7afee-init l
/var/lib/docker1/overlay2# cd d66e8e37afa6ac6ac08ebf64a680f01063e6fd851aed57affb039973c18fd4a4/
/var/lib/docker1/overlay2/d66e8e37afa6ac6ac08ebf64a680f01063e6fd851aed57affb039973c18fd4a4#ls
diff link
root@jiawu02-wu:/var/lib/docker1/overlay2/d66e8e37afa6ac6ac08ebf64a680f01063e6fd851aed57affb039973c18fd4a4# cd diff
root@jiawu02-wu:/var/lib/docker1/overlay2/d66e8e37afa6ac6ac08ebf64a680f01063e6fd851aed57affb039973c18fd4a4/diff# ls
这就是rootfs了
bin dev etc home root tmp usr var
root@jiawu02-wu:/var/lib/docker1/overlay2/d66e8e37afa6ac6ac08ebf64a680f01063e6fd851aed57affb039973c18fd4a4/diff# cd bin
root@jiawu02-wu:/var/lib/docker1/overlay2/d66e8e37afa6ac6ac08ebf64a680f01063e6fd851aed57affb039973c18fd4a4/diff/bin# ls
cksum eject getty iplink lzop nohup reboot sha3sum test uptim
在/bin下有很多的命令,用file查看其中命令:
#:file ls
ls: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, stripped
可以看到这个文件是在arm64平台下编译出来的,按理也只能在arm64的平台下运行,下面是见证奇迹的时刻:
./ls
[ df gzip lpd passwd setlogcons tty
[[ dhcprelay halt lpq paste setpriv ttysize
acpid diff hd lpr patch setserial tunctl
add-shell dirname hdparm ls pgrep setsid ubiattach
addgroup dmesg head lsattr pidof setuidgid ubidetach
ls可以正常运行!不仅ls其他的命令都可以正常运行。
揭秘:
这并不是什么可以跨平台的binary,原因是在运行非本平台的binary时自动运行qemu来run binary。
:/var/lib/docker/overlay2/da950200048f64a8749daa117941e74a114c16567c3fea49f227097b82e78a44/diff/bin# file cat
cat: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, stripped
root@jiawu02-wu:/var/lib/docker/overlay2/da950200048f64a8749daa117941e74a114c16567c3fea49f227097b82e78a44/diff/bin# ./cat
$ ps aux |grep cat
root 18019 0.0 0.2 110492 8400 pts/2 Sl+ 14:35 0:00 /usr/bin/qemu-aarch64 ./cat
可以看到运行cat时先启动了qemu-aarch64,于是疑惑解除了。看来遇到有返常理的事还是不能轻易下结论,一定要刨根究底,即便找不到真正的原因也不能贸然下结论,以免以讹传讹 ,贻误他人。