kevx's Writing

架构 / 云计算 / 技术管理 | kevx@outlook.com 未经授权请勿转载©

Contact Me

如何编译基于musl-libc的busybox

在云原生环境下很多业务会选择alpine作为基础镜像来构建应用,alpine自身没有使用常规的glibc和相应的coreutils,而是基于musl libc + buysbox组合

而busybox本身存在着一些问题,有时候会需要修改其代码;官方的构建手册上并没有明确说明如何基于musl来构建,本文主要介绍一种比较可行的方式

编译机

一般使用常规的x64 linux机器即可,内核版本3.10以上(建议),另外请事先安装好gcc和kernel-header

源码准备

将musl和busybox源码全部下载到目标机器,体积都不大,每个源码包1兆左右,分别解压到/tmp/busybox和/tmp/musl,源码修改请自行进行,随心所欲

构建musl

首先我们构建出musl

cd /tmp/musl
./configurre --prefix=/tmp/musl
make
make install
PATH=/tmp/musl/bin:$PATH
export PATH

一般来说这一步基本不会有什么问题

准备musl交叉编译环境

cd /tmp/musl
ln -s `which ar` musl-ar
ln -s `which strip` musl-strip
#链接linux的头文件目录
cd /tmp/musl/include
ln -s /usr/include/linux linux
ln -s /usr/include/asm asm
ln -s /usr/include/asm-generic asm-generic

配置busybox

建议使用make menuconfig进行可视化配置,请去掉misc中nand开头的几个工具以及ubi相关的工具,原因是这几个功能需要安装额外的依赖库且一般没人使用这些功能

(谁会在服务器上使用ubifs呢??)

另外inetd和ifplugd功能也需要关闭

开启静态链接'Build static binary'并修改'Cross compiler prefix'的值为'musl-'

按照官方说法,以下选项也需要确保关闭状态,可在.config中查看

# CONFIG_EXTRA_COMPAT is not set 
# CONFIG_SELINUX is not set 
# CONFIG_FEATURE_HAVE_RPC is not set 
# CONFIG_WERROR is not set 
# CONFIG_FEATURE_SYSTEMD is not set 
# CONFIG_FEATURE_VI_REGEX_SEARCH is not set 
# CONFIG_PAM is not set 
# CONFIG_FEATURE_INETD_RPC is not set 
# CONFIG_SELINUXENABLED is not set 
# CONFIG_FEATURE_MOUNT_NFS is not set

也可以自定义开启或关闭其它的feature

这样就可以了

编译busybox

执行make即可

返回主页