一般情况下,不同的硬件平台(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,于是疑惑解除了。看来遇到有返常理的事还是不能轻易下结论,一定要刨根究底,即便找不到真正的原因也不能贸然下结论,以免以讹传讹 ,贻误他人。