make install 安装 BusyBox 生成符号链接
make install 做了什么
编译完成后执行 make install,它会完成三件事:
- 把编译好的 busybox 二进制复制到 CONFIG_PREFIX/bin/busybox
- 在 CONFIG_PREFIX/ 下为每个启用的 Applet 创建符号链接(指向 bin/busybox)
- 如果有 init Applet,创建指向 busybox 的 /sbin/init 符号链接
# 默认安装到源码目录下的 _install/
make install
# 产物:
# _install/bin/busybox ← 主二进制
# _install/bin/ls ← 符号链接 → busybox
# _install/bin/cat ← 符号链接 → busybox
# _install/bin/sh ← 符号链接 → busybox(ash)
# _install/sbin/init ← 符号链接 → busybox
# _install/usr/bin/... ← 其余 Applet 链接
# _install/usr/sbin/...
CONFIG_PREFIX 选项
安装路径由 CONFIG_PREFIX 控制,有两种设置方式:
# 方式一:在 menuconfig 里设置
make menuconfig
# Build Options --> Destination path for 'make install' (CONFIG_PREFIX)
# 方式二:命令行覆盖(优先级更高)
make install CONFIG_PREFIX=/opt/myroot
CONFIG_PREFIX 默认值是 _install(源码目录下),生产环境通常指向目标根文件系统的临时构建目录。
符号链接 vs 硬链接
BusyBox 的符号链接生成方式也可以配置:
Build Options --->
[*] Create a busybox symlink (busybox -> busybox)
[ ] Create symlinks to busybox
[ ] Create hardlinks to busybox
- 符号链接(默认):每个 Applet 是一个 symlink,指向同一个 busybox 文件。节省 inode 但每个链接占一个目录条目
- 硬链接:每个 Applet 是硬链接,和 busybox 共享 inode。更省空间但要求都在同一个文件系统上
嵌入式系统用符号链接最常见,因为硬链接跨文件系统不工作,而且某些闪存文件系统对硬链接支持不好。
手动安装到目标设备
如果不走 Buildroot/OpenWrt 的自动流程,手动把 BusyBox 部署到目标设备:
# 1. 先在主机上编译并 install 到临时目录
make defconfig
make CONFIG_STATIC=y -j$(nproc)
make install CONFIG_PREFIX=./target
# 2. 把 target/ 的内容整体复制到目标设备的根文件系统
# 假设目标设备的根文件系统已经挂载在 /mnt/target
cp -a target/* /mnt/target/
# 3. 验证目标设备上的 BusyBox
cd /mnt/target/bin
ls -la busybox
# 应该看到: busybox
ls -la ls
# 应该看到: ls -> busybox
Android 上的安装
Android 上不走 make install。BusyBox Pro 等应用自己实现了符号链接创建逻辑——通常写到 /system/xbin 或 /sbin。手动方法(已 root 的设备):
# 通过 adb
adb push busybox /system/xbin/busybox
adb shell su -c 'chmod 755 /system/xbin/busybox'
adb shell su -c 'cd /system/xbin && for applet in $(busybox --list); do ln -sf busybox $applet; done'
常见问题
符号链接太多:defconfig 下约 300 个符号链接,在小 Flash 设备上可能占用不少目录条目空间。如果空间紧张,可以直接用 busybox ls 而不创建符号链接,运行时显式调用 busybox 二进制。
init 链接问题:make install 会自动在 CONFIG_PREFIX/sbin/ 下创建 init 符号链接。如果目标系统不是用 BusyBox init,记得删掉它以免内核启动时试图执行它。
权限问题:BusyBox 二进制需要可执行权限(通常 0755),符号链接不需要额外权限。SELinux 强制模式下可能需要额外的 restorecon。