你有没有好奇过,为什么Alpine Linux默认装了个"BusyBox Wget"?

我跑了个ls -la /usr/bin,结果傻眼了:130多个可执行文件,居然全是同一个二进制文件的硬链接。这就是BusyBox的"multicall binary"机制——一个文件,分身成整套Unix工具箱。

打开网易新闻 查看精彩图片

原理其实粗暴得很。程序启动时看argv[0],也就是你怎么调用它的名字。如果是wget,它就跳转到wget的主函数;如果是ls,就走ls的逻辑。你也可以直接显式指定:busybox wget,效果一样。

每个工具对应一个C文件,比如wget.c。源码里还嵌着编译配置,像这段:

//config:config WGET
//config: bool "wget (41 kb)"
//config: default y

编译时勾选哪些,最终二进制就包含哪些。想瘦身?关掉用不上的模块就行。

BusyBox支持两种调用方式:-s参数创建符号链接,或者直接建硬链接。你也可以运行busybox --list,看它到底打包了哪些命令。

所以Alpine的本质是什么?一套BusyBox的交互界面。里面的工具都是精简版——至于是重新实现的,还是从原版源码裁剪来的,我还没挖到答案。有人知道吗?