BusyBox完全指南:嵌入式Linux的瑞士军刀
- BusyBox完全指南
-
- 引言
- 一、BusyBox是什么
-
- [1.1 定义与概述](#1.1 定义与概述)
- [1.2 核心特点](#1.2 核心特点)
- [1.3 包含的常用命令](#1.3 包含的常用命令)
- 二、BusyBox的发展历史
-
- [2.1 起源与早期发展](#2.1 起源与早期发展)
- [2.2 关键时间节点](#2.2 关键时间节点)
- [2.3 当前状态](#2.3 当前状态)
- 三、BusyBox的安装
-
- [3.1 系统要求](#3.1 系统要求)
- [3.2 从发行版仓库安装](#3.2 从发行版仓库安装)
-
- Ubuntu/Debian
- Fedora/CentOS/RHEL
- [Arch Linux](#Arch Linux)
- [3.3 获取BusyBox源码](#3.3 获取BusyBox源码)
- 四、BusyBox的配置
-
- [4.1 配置系统概述](#4.1 配置系统概述)
- [4.2 基础配置步骤](#4.2 基础配置步骤)
-
- [4.2.1 清理旧配置](#4.2.1 清理旧配置)
- [4.2.2 使用默认配置](#4.2.2 使用默认配置)
- [4.2.3 菜单配置](#4.2.3 菜单配置)
- [4.2.4 常用配置选项](#4.2.4 常用配置选项)
- [4.3 配置示例](#4.3 配置示例)
-
- [4.3.1 配置为静态链接](#4.3.1 配置为静态链接)
- [4.3.2 配置为嵌入式系统](#4.3.2 配置为嵌入式系统)
- [4.3.3 保存配置](#4.3.3 保存配置)
- 五、BusyBox的编译
-
- [5.1 编译前准备](#5.1 编译前准备)
- [5.2 编译BusyBox](#5.2 编译BusyBox)
-
- [5.2.1 本地编译](#5.2.1 本地编译)
- [5.2.2 交叉编译(用于嵌入式系统)](#5.2.2 交叉编译(用于嵌入式系统))
- [5.3 检查编译结果](#5.3 检查编译结果)
- [5.4 安装BusyBox](#5.4 安装BusyBox)
-
- [5.4.1 安装到本地系统](#5.4.1 安装到本地系统)
- [5.4.2 创建符号链接](#5.4.2 创建符号链接)
- 六、BusyBox的运行
-
- [6.1 基本使用方法](#6.1 基本使用方法)
-
- [6.1.1 直接调用BusyBox](#6.1.1 直接调用BusyBox)
- [6.1.2 查看BusyBox版本](#6.1.2 查看BusyBox版本)
- [6.2 使用BusyBox的Shell](#6.2 使用BusyBox的Shell)
-
- [6.2.1 启动ash shell](#6.2.1 启动ash shell)
- [6.2.2 交互式使用示例](#6.2.2 交互式使用示例)
- [6.3 构建一个最小Linux系统](#6.3 构建一个最小Linux系统)
-
- [6.3.1 准备目录结构](#6.3.1 准备目录结构)
- [6.3.2 创建必要的设备节点](#6.3.2 创建必要的设备节点)
- [6.3.3 创建初始化脚本](#6.3.3 创建初始化脚本)
- [6.3.4 创建/etc/fstab](#6.3.4 创建/etc/fstab)
- [6.4 在QEMU中运行BusyBox系统](#6.4 在QEMU中运行BusyBox系统)
-
- [6.4.1 创建根文件系统镜像](#6.4.1 创建根文件系统镜像)
- [6.4.2 使用QEMU启动](#6.4.2 使用QEMU启动)
- 七、BusyBox的高级用法
-
- [7.1 创建自定义initramfs](#7.1 创建自定义initramfs)
- [7.2 BusyBox与Buildroot结合](#7.2 BusyBox与Buildroot结合)
- [7.3 制作Docker基础镜像](#7.3 制作Docker基础镜像)
- [7.4 添加自定义Applet](#7.4 添加自定义Applet)
- 八、踩坑总结
-
- [8.1 常见问题与解决方案](#8.1 常见问题与解决方案)
- [8.2 体积优化建议](#8.2 体积优化建议)
- 九、实际应用案例
-
- [9.1 嵌入式系统开发](#9.1 嵌入式系统开发)
- [9.2 系统救援盘](#9.2 系统救援盘)
- [9.3 路由器固件开发](#9.3 路由器固件开发)
- 结束语
BusyBox完全指南
引言
大家好!今天我们来探索一个在嵌入式Linux世界中无处不在的神奇工具------BusyBox。如果你曾经接触过嵌入式系统、路由器固件或者小型Linux发行版,那你一定听说过BusyBox。
BusyBox被誉为"嵌入式Linux的瑞士军刀",它将数百个常用的Unix命令集成到一个单一的可执行文件中,极大地节省了存储空间。让我们开始深入了解这个强大的工具吧!
一、BusyBox是什么
1.1 定义与概述
BusyBox是一个开源的精简Unix工具集,它将300多个常用的Unix命令(如ls、cp、mv、cat等)合并到一个单独的可执行文件中。

图 1: BusyBox 项目图标
1.2 核心特点
BusyBox的主要特点:
- 高度集成:300+个命令合并为一个可执行文件
- 极度精简:占用空间极小,通常只有几百KB到几MB
- 高度可配置:可以选择性编译需要的命令
- 跨平台支持:支持多种CPU架构(x86、ARM、MIPS等)
- 开源免费:遵循GPL v2许可证
1.3 包含的常用命令
| 命令类别 | 包含命令 |
|---|---|
| 文件操作 | ls, cp, mv, rm, cat, mkdir, rmdir, touch |
| 系统管理 | ps, top, kill, reboot, halt, mount, umount |
| 网络工具 | ifconfig, ping, netstat, wget, telnet |
| 文本处理 | grep, sed, awk, sort, uniq, cut |
| Shell | sh, ash, hush(内置轻量级Shell) |
二、BusyBox的发展历史
2.1 起源与早期发展
BusyBox由Bruce Perens于1996年创建,最初是为Debian Linux的安装盘设计的,目的是在一张软盘上放一个可引导的Linux系统。
2.2 关键时间节点
#mermaid-svg-w3hT9LamvwcjBPUR{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-w3hT9LamvwcjBPUR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-w3hT9LamvwcjBPUR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-w3hT9LamvwcjBPUR .error-icon{fill:#552222;}#mermaid-svg-w3hT9LamvwcjBPUR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-w3hT9LamvwcjBPUR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-w3hT9LamvwcjBPUR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-w3hT9LamvwcjBPUR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-w3hT9LamvwcjBPUR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-w3hT9LamvwcjBPUR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-w3hT9LamvwcjBPUR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-w3hT9LamvwcjBPUR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-w3hT9LamvwcjBPUR .marker.cross{stroke:#333333;}#mermaid-svg-w3hT9LamvwcjBPUR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-w3hT9LamvwcjBPUR p{margin:0;}#mermaid-svg-w3hT9LamvwcjBPUR .edge{stroke-width:3;}#mermaid-svg-w3hT9LamvwcjBPUR .section--1 rect,#mermaid-svg-w3hT9LamvwcjBPUR .section--1 path,#mermaid-svg-w3hT9LamvwcjBPUR .section--1 circle,#mermaid-svg-w3hT9LamvwcjBPUR .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .section--1 text{fill:#ffffff;}#mermaid-svg-w3hT9LamvwcjBPUR .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-w3hT9LamvwcjBPUR .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .edge-depth--1{stroke-width:17;}#mermaid-svg-w3hT9LamvwcjBPUR .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-w3hT9LamvwcjBPUR .lineWrapper line{stroke:#ffffff;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled,#mermaid-svg-w3hT9LamvwcjBPUR .disabled circle,#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:lightgray;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:#efefef;}#mermaid-svg-w3hT9LamvwcjBPUR .section-0 rect,#mermaid-svg-w3hT9LamvwcjBPUR .section-0 path,#mermaid-svg-w3hT9LamvwcjBPUR .section-0 circle,#mermaid-svg-w3hT9LamvwcjBPUR .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-w3hT9LamvwcjBPUR .section-0 text{fill:black;}#mermaid-svg-w3hT9LamvwcjBPUR .node-icon-0{font-size:40px;color:black;}#mermaid-svg-w3hT9LamvwcjBPUR .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-w3hT9LamvwcjBPUR .edge-depth-0{stroke-width:14;}#mermaid-svg-w3hT9LamvwcjBPUR .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-w3hT9LamvwcjBPUR .lineWrapper line{stroke:black;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled,#mermaid-svg-w3hT9LamvwcjBPUR .disabled circle,#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:lightgray;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:#efefef;}#mermaid-svg-w3hT9LamvwcjBPUR .section-1 rect,#mermaid-svg-w3hT9LamvwcjBPUR .section-1 path,#mermaid-svg-w3hT9LamvwcjBPUR .section-1 circle,#mermaid-svg-w3hT9LamvwcjBPUR .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .section-1 text{fill:black;}#mermaid-svg-w3hT9LamvwcjBPUR .node-icon-1{font-size:40px;color:black;}#mermaid-svg-w3hT9LamvwcjBPUR .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .edge-depth-1{stroke-width:11;}#mermaid-svg-w3hT9LamvwcjBPUR .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-w3hT9LamvwcjBPUR .lineWrapper line{stroke:black;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled,#mermaid-svg-w3hT9LamvwcjBPUR .disabled circle,#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:lightgray;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:#efefef;}#mermaid-svg-w3hT9LamvwcjBPUR .section-2 rect,#mermaid-svg-w3hT9LamvwcjBPUR .section-2 path,#mermaid-svg-w3hT9LamvwcjBPUR .section-2 circle,#mermaid-svg-w3hT9LamvwcjBPUR .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .section-2 text{fill:#ffffff;}#mermaid-svg-w3hT9LamvwcjBPUR .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-w3hT9LamvwcjBPUR .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .edge-depth-2{stroke-width:8;}#mermaid-svg-w3hT9LamvwcjBPUR .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-w3hT9LamvwcjBPUR .lineWrapper line{stroke:#ffffff;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled,#mermaid-svg-w3hT9LamvwcjBPUR .disabled circle,#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:lightgray;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:#efefef;}#mermaid-svg-w3hT9LamvwcjBPUR .section-3 rect,#mermaid-svg-w3hT9LamvwcjBPUR .section-3 path,#mermaid-svg-w3hT9LamvwcjBPUR .section-3 circle,#mermaid-svg-w3hT9LamvwcjBPUR .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .section-3 text{fill:black;}#mermaid-svg-w3hT9LamvwcjBPUR .node-icon-3{font-size:40px;color:black;}#mermaid-svg-w3hT9LamvwcjBPUR .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .edge-depth-3{stroke-width:5;}#mermaid-svg-w3hT9LamvwcjBPUR .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-w3hT9LamvwcjBPUR .lineWrapper line{stroke:black;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled,#mermaid-svg-w3hT9LamvwcjBPUR .disabled circle,#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:lightgray;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:#efefef;}#mermaid-svg-w3hT9LamvwcjBPUR .section-4 rect,#mermaid-svg-w3hT9LamvwcjBPUR .section-4 path,#mermaid-svg-w3hT9LamvwcjBPUR .section-4 circle,#mermaid-svg-w3hT9LamvwcjBPUR .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .section-4 text{fill:black;}#mermaid-svg-w3hT9LamvwcjBPUR .node-icon-4{font-size:40px;color:black;}#mermaid-svg-w3hT9LamvwcjBPUR .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .edge-depth-4{stroke-width:2;}#mermaid-svg-w3hT9LamvwcjBPUR .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-w3hT9LamvwcjBPUR .lineWrapper line{stroke:black;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled,#mermaid-svg-w3hT9LamvwcjBPUR .disabled circle,#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:lightgray;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:#efefef;}#mermaid-svg-w3hT9LamvwcjBPUR .section-5 rect,#mermaid-svg-w3hT9LamvwcjBPUR .section-5 path,#mermaid-svg-w3hT9LamvwcjBPUR .section-5 circle,#mermaid-svg-w3hT9LamvwcjBPUR .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .section-5 text{fill:black;}#mermaid-svg-w3hT9LamvwcjBPUR .node-icon-5{font-size:40px;color:black;}#mermaid-svg-w3hT9LamvwcjBPUR .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .edge-depth-5{stroke-width:-1;}#mermaid-svg-w3hT9LamvwcjBPUR .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-w3hT9LamvwcjBPUR .lineWrapper line{stroke:black;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled,#mermaid-svg-w3hT9LamvwcjBPUR .disabled circle,#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:lightgray;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:#efefef;}#mermaid-svg-w3hT9LamvwcjBPUR .section-6 rect,#mermaid-svg-w3hT9LamvwcjBPUR .section-6 path,#mermaid-svg-w3hT9LamvwcjBPUR .section-6 circle,#mermaid-svg-w3hT9LamvwcjBPUR .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .section-6 text{fill:black;}#mermaid-svg-w3hT9LamvwcjBPUR .node-icon-6{font-size:40px;color:black;}#mermaid-svg-w3hT9LamvwcjBPUR .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .edge-depth-6{stroke-width:-4;}#mermaid-svg-w3hT9LamvwcjBPUR .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-w3hT9LamvwcjBPUR .lineWrapper line{stroke:black;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled,#mermaid-svg-w3hT9LamvwcjBPUR .disabled circle,#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:lightgray;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:#efefef;}#mermaid-svg-w3hT9LamvwcjBPUR .section-7 rect,#mermaid-svg-w3hT9LamvwcjBPUR .section-7 path,#mermaid-svg-w3hT9LamvwcjBPUR .section-7 circle,#mermaid-svg-w3hT9LamvwcjBPUR .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .section-7 text{fill:black;}#mermaid-svg-w3hT9LamvwcjBPUR .node-icon-7{font-size:40px;color:black;}#mermaid-svg-w3hT9LamvwcjBPUR .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .edge-depth-7{stroke-width:-7;}#mermaid-svg-w3hT9LamvwcjBPUR .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-w3hT9LamvwcjBPUR .lineWrapper line{stroke:black;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled,#mermaid-svg-w3hT9LamvwcjBPUR .disabled circle,#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:lightgray;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:#efefef;}#mermaid-svg-w3hT9LamvwcjBPUR .section-8 rect,#mermaid-svg-w3hT9LamvwcjBPUR .section-8 path,#mermaid-svg-w3hT9LamvwcjBPUR .section-8 circle,#mermaid-svg-w3hT9LamvwcjBPUR .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .section-8 text{fill:black;}#mermaid-svg-w3hT9LamvwcjBPUR .node-icon-8{font-size:40px;color:black;}#mermaid-svg-w3hT9LamvwcjBPUR .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .edge-depth-8{stroke-width:-10;}#mermaid-svg-w3hT9LamvwcjBPUR .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-w3hT9LamvwcjBPUR .lineWrapper line{stroke:black;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled,#mermaid-svg-w3hT9LamvwcjBPUR .disabled circle,#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:lightgray;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:#efefef;}#mermaid-svg-w3hT9LamvwcjBPUR .section-9 rect,#mermaid-svg-w3hT9LamvwcjBPUR .section-9 path,#mermaid-svg-w3hT9LamvwcjBPUR .section-9 circle,#mermaid-svg-w3hT9LamvwcjBPUR .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .section-9 text{fill:black;}#mermaid-svg-w3hT9LamvwcjBPUR .node-icon-9{font-size:40px;color:black;}#mermaid-svg-w3hT9LamvwcjBPUR .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .edge-depth-9{stroke-width:-13;}#mermaid-svg-w3hT9LamvwcjBPUR .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-w3hT9LamvwcjBPUR .lineWrapper line{stroke:black;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled,#mermaid-svg-w3hT9LamvwcjBPUR .disabled circle,#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:lightgray;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:#efefef;}#mermaid-svg-w3hT9LamvwcjBPUR .section-10 rect,#mermaid-svg-w3hT9LamvwcjBPUR .section-10 path,#mermaid-svg-w3hT9LamvwcjBPUR .section-10 circle,#mermaid-svg-w3hT9LamvwcjBPUR .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .section-10 text{fill:black;}#mermaid-svg-w3hT9LamvwcjBPUR .node-icon-10{font-size:40px;color:black;}#mermaid-svg-w3hT9LamvwcjBPUR .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .edge-depth-10{stroke-width:-16;}#mermaid-svg-w3hT9LamvwcjBPUR .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-w3hT9LamvwcjBPUR .lineWrapper line{stroke:black;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled,#mermaid-svg-w3hT9LamvwcjBPUR .disabled circle,#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:lightgray;}#mermaid-svg-w3hT9LamvwcjBPUR .disabled text{fill:#efefef;}#mermaid-svg-w3hT9LamvwcjBPUR .section-root rect,#mermaid-svg-w3hT9LamvwcjBPUR .section-root path,#mermaid-svg-w3hT9LamvwcjBPUR .section-root circle{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-w3hT9LamvwcjBPUR .section-root text{fill:#ffffff;}#mermaid-svg-w3hT9LamvwcjBPUR .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-w3hT9LamvwcjBPUR .edge{fill:none;}#mermaid-svg-w3hT9LamvwcjBPUR .eventWrapper{filter:brightness(120%);}#mermaid-svg-w3hT9LamvwcjBPUR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1996 Bruce Perens创建BusyBox 1998 Erik Andersen成为维护者 2000 BusyBox 0.60发布 2005 BusyBox 1.0发布 2008 Denys Vlasenko成为维护者 2015 BusyBox 1.24发布 2020 BusyBox 1.32发布 2023 BusyBox 1.36发布 2024-至今 持续更新和优化 BusyBox发展历程
2.3 当前状态
截至2026年,BusyBox已经成为:
- 嵌入式Linux系统的标准组件
- 路由器固件(如OpenWrt、DD-WRT)的核心
- Android系统的组成部分
- Docker容器的常用基础镜像
- 救援系统和Live CD的必备工具
三、BusyBox的安装
3.1 系统要求
在开始之前,我们需要准备:
- Linux开发环境(推荐Ubuntu、Fedora等)
- 编译工具链:gcc、make
- 开发库:glibc或uClibc
- 足够的磁盘空间:约100MB用于源码和编译
3.2 从发行版仓库安装
如果你只是想使用BusyBox而不需要定制,可以直接安装:
Ubuntu/Debian
bash
sudo apt-get update
sudo apt-get install -y busybox
Fedora/CentOS/RHEL
bash
sudo dnf install -y busybox
Arch Linux
bash
sudo pacman -S busybox
3.3 获取BusyBox源码
方式一:下载发布版本
bash
# 访问BusyBox官网下载
# https://busybox.net/downloads/
# 或使用wget下载
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar -xjf busybox-1.36.1.tar.bz2
cd busybox-1.36.1
方式二:从Git仓库克隆
bash
git clone git://git.busybox.net/busybox
cd busybox
# 切换到稳定版本
git checkout 1_36_1
四、BusyBox的配置
4.1 配置系统概述
BusyBox使用类似Linux内核的kconfig配置系统,提供了直观的菜单配置界面。
4.2 基础配置步骤
4.2.1 清理旧配置
bash
# 清理之前的构建
make distclean
4.2.2 使用默认配置
BusyBox提供了几个默认配置:
bash
# 最小化配置(推荐用于嵌入式系统)
make allnoconfig
# 缺省配置(启用大多数功能)
make defconfig
# 为特定架构的配置
make ARCH=arm defconfig
4.2.3 菜单配置
bash
# 打开图形化配置菜单
make menuconfig
# 或使用基于文本的配置
make config
# 或使用基于X Window的配置
make xconfig
4.2.4 常用配置选项
在配置菜单中,你可以设置:
General Configuration
---> Build Options
---> Installation Options ("make install" behavior)
---> Busybox Library Tuning
Busybox Settings
---> General Configuration
---> Build Options
---> Debugging Options
---> Library Tuning
Applets
---> Archival Utilities
---> Coreutils
---> Console Utilities
---> Debian Utilities
---> Editors
---> Finding Utilities
---> Init Utilities
---> Login/Password Management Utilities
---> Linux Ext2 FS Progs
---> Linux Module Utilities
---> Linux System Utilities
---> Mail Utilities
---> Miscellaneous Utilities
---> Networking Utilities
---> Print Utilities
---> Process Utilities
---> Runit Utilities
---> Shells
---> System Logging Utilities
4.3 配置示例
4.3.1 配置为静态链接
bash
make menuconfig
# 在 Settings -> Build Options 中勾选
# [*] Build BusyBox as a static binary (no shared libs)
4.3.2 配置为嵌入式系统
bash
make menuconfig
# 选择以下选项:
# -> Archival Utilities(启用压缩工具)
# -> Coreutils(核心工具)
# -> Editors(vi编辑器)
# -> Networking Utilities(网络工具)
# -> Shells(ash shell)
# -> Linux System Utilities(系统工具)
4.3.3 保存配置
bash
# 配置完成后保存为.config
# 可以备份配置
cp .config myconfig
五、BusyBox的编译
5.1 编译前准备
确保已安装编译依赖:
bash
# Ubuntu/Debian
sudo apt-get install -y build-essential libncurses5-dev bison flex
# Fedora
sudo dnf install -y gcc make ncurses-devel bison flex
5.2 编译BusyBox
5.2.1 本地编译
bash
# 编译(使用多核加速)
make -j$(nproc)
5.2.2 交叉编译(用于嵌入式系统)
bash
# 设置交叉编译工具链前缀
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
# 配置
make ARCH=arm defconfig
make ARCH=arm menuconfig
# 编译
make ARCH=arm -j$(nproc)
5.3 检查编译结果
bash
# 查看生成的可执行文件
ls -l busybox
# 查看大小
ls -lh busybox
# 查看包含哪些命令
./busybox --help
# 或
./busybox --list
5.4 安装BusyBox
5.4.1 安装到本地系统
bash
# 安装到指定目录
make install CONFIG_PREFIX=./_install
# 查看安装结果
tree ./_install
5.4.2 创建符号链接
BusyBox通过符号链接来提供不同的命令:
bash
cd _install
mkdir -p bin sbin usr/bin usr/sbin
# 让BusyBox自动创建符号链接
./bin/busybox --install -s
六、BusyBox的运行
6.1 基本使用方法
6.1.1 直接调用BusyBox
bash
# 方式一:通过BusyBox调用命令
./busybox ls
# 方式二:通过符号链接调用
ln -s busybox ls
./ls
6.1.2 查看BusyBox版本
bash
./busybox
# 或
./busybox --help
6.2 使用BusyBox的Shell
6.2.1 启动ash shell
bash
# 直接启动BusyBox的ash
./busybox ash
# 或进入_install目录后
./bin/sh
6.2.2 交互式使用示例
bash
# 创建测试目录
mkdir test
cd test
# 创建文件
echo "Hello BusyBox" > hello.txt
cat hello.txt
# 列出目录内容
ls -la
# 复制文件
cp hello.txt hello2.txt
ls
# 查看进程
ps
6.3 构建一个最小Linux系统
6.3.1 准备目录结构
bash
# 创建根文件系统目录
mkdir -p rootfs/{bin,sbin,etc,proc,sys,dev,usr/{bin,sbin},var,tmp,mnt}
# 安装BusyBox
cd busybox
make install CONFIG_PREFIX=../rootfs
cd ..
6.3.2 创建必要的设备节点
bash
cd rootfs/dev
# 创建设备节点(需要root权限)
sudo mknod -m 666 console c 5 1
sudo mknod -m 666 null c 1 3
sudo mknod -m 666 tty1 c 4 1
sudo mknod -m 666 tty2 c 4 2
sudo mknod -m 666 tty3 c 4 3
sudo mknod -m 666 tty4 c 4 4
sudo mknod -m 666 ttyS0 c 4 64
# 也可以使用devtmpfs自动挂载
6.3.3 创建初始化脚本
bash
# 创建init脚本
cat > rootfs/init << 'EOF'
#!/bin/sh
echo "Starting BusyBox Linux..."
# 挂载proc和sysfs
mount -t proc none /proc
mount -t sysfs none /sys
# 挂载devtmpfs(如果内核支持)
# mount -t devtmpfs none /dev
# 设置主机名
hostname busybox
# 启动Shell
echo "Welcome to BusyBox!"
/bin/sh
# 关机
umount /proc
umount /sys
echo "Shutting down..."
sleep 1
EOF
# 设置执行权限
chmod +x rootfs/init
6.3.4 创建/etc/fstab
bash
cat > rootfs/etc/fstab << 'EOF'
# /etc/fstab
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
EOF
6.4 在QEMU中运行BusyBox系统
6.4.1 创建根文件系统镜像
bash
# 创建initramfs(内存文件系统)
cd rootfs
find . | cpio -H newc -o | gzip -9 > ../initramfs.cpio.gz
cd ..
# 或创建磁盘镜像
dd if=/dev/zero of=rootfs.img bs=1M count=32
mkfs.ext2 -F rootfs.img
mkdir -p mountpoint
sudo mount rootfs.img mountpoint
sudo cp -r rootfs/* mountpoint/
sudo umount mountpoint
6.4.2 使用QEMU启动
bash
# 下载或编译一个Linux内核
# 假设我们有一个bzImage内核
# 方式一:使用initramfs
qemu-system-x86_64 \
-kernel bzImage \
-initrd initramfs.cpio.gz \
-append "console=ttyS0 rdinit=/init" \
-nographic
# 方式二:使用磁盘镜像
qemu-system-x86_64 \
-kernel bzImage \
-hda rootfs.img \
-append "console=ttyS0 root=/dev/sda init=/init" \
-nographic
七、BusyBox的高级用法
7.1 创建自定义initramfs
bash
#!/bin/bash
# build_initramfs.sh
BUSYBOX_DIR=./busybox
BUILD_DIR=./initramfs_build
OUTPUT_FILE=./initramfs.cpio.gz
# 创建目录
mkdir -p ${BUILD_DIR}/{bin,sbin,etc,proc,sys,dev,tmp}
# 编译BusyBox
cd ${BUSYBOX_DIR}
make defconfig
make -j$(nproc)
make install CONFIG_PREFIX=../${BUILD_DIR}
cd ..
# 创建init脚本
cat > ${BUILD_DIR}/init << 'EOF'
#!/bin/sh
echo "=== BusyBox Initramfs ==="
mount -t proc none /proc
mount -t sysfs none /sys
exec /bin/sh
EOF
chmod +x ${BUILD_DIR}/init
# 创建cpio归档
cd ${BUILD_DIR}
find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../${OUTPUT_FILE}
cd ..
echo "Initramfs created: ${OUTPUT_FILE}"
7.2 BusyBox与Buildroot结合
Buildroot常使用BusyBox作为基础工具集:
bash
# 在Buildroot配置中启用BusyBox
make menuconfig
# Target packages -> [*] BusyBox
# Target packages -> BusyBox -> BusyBox configuration file to use
7.3 制作Docker基础镜像
dockerfile
# Dockerfile示例
FROM scratch
COPY rootfs /
CMD ["/bin/sh"]
bash
# 构建Docker镜像
docker build -t busybox-custom .
# 运行
docker run -it busybox-custom
7.4 添加自定义Applet
BusyBox允许添加自己的命令:
c
/* custom_app.c - 自定义BusyBox Applet示例 */
#include "libbb.h"
int custom_app_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int custom_app_main(int argc, char **argv)
{
printf("Hello from Custom App!\n");
printf("Arguments: ");
for (int i = 0; i < argc; i++) {
printf("[%s] ", argv[i]);
}
printf("\n");
return 0;
}
八、踩坑总结
8.1 常见问题与解决方案
-
编译错误:缺少库或头文件
- 检查是否安装了build-essential和ncurses-dev
- 确认交叉编译工具链配置正确
-
运行时出现动态链接错误
- 重新配置BusyBox,勾选静态编译选项
- 或复制所需的动态库到目标系统
-
设备节点缺失
- 手动创建必要的设备节点
- 或使用devtmpfs自动挂载
-
命令行为与标准工具不一致
- BusyBox命令是简化版本,功能可能不完整
- 查看帮助:
busybox command --help
8.2 体积优化建议
- 使用静态编译减少依赖
- 启用压缩(CONFIG_FEATURE_COMPRESS_USAGE)
- 只选择需要的Applet
- 使用uClibc或musl代替glibc
- 去除调试符号:
strip busybox
九、实际应用案例
9.1 嵌入式系统开发
bash
# 为ARM嵌入式系统编译BusyBox
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
# 配置
make ARCH=arm defconfig
make ARCH=arm menuconfig
# 启用常用Applet,启用静态编译
# 编译
make ARCH=arm -j$(nproc)
make ARCH=arm install CONFIG_PREFIX=./arm_rootfs
# 创建initramfs
cd arm_rootfs
find . | cpio -H newc -o | gzip -9 > ../arm_initramfs.cpio.gz
# 在QEMU ARM中测试
qemu-system-arm \
-M vexpress-a9 \
-kernel zImage \
-initrd arm_initramfs.cpio.gz \
-dtb vexpress-v2p-ca9.dtb \
-append "console=ttyAMA0 rdinit=/init" \
-nographic
9.2 系统救援盘
bash
# 创建一个可引导的BusyBox救援系统
# 1. 编译内核(支持initramfs)
# 2. 编译BusyBox
# 3. 创建initramfs(包含常用工具)
# 4. 创建ISO镜像
# 5. 刻录到U盘或CD
9.3 路由器固件开发
bash
# OpenWrt使用BusyBox作为基础
# 参考OpenWrt项目了解如何集成BusyBox到路由器固件中
# 配置BusyBox为小型系统
# -> 启用网络工具(ifconfig, ping, iptables等)
# -> 启用系统管理工具
# -> 启用Web服务器(httpd)
# -> 启用Shell(ash)
结束语
恭喜你!现在你已经掌握了BusyBox的核心使用方法。BusyBox作为嵌入式Linux系统的瑞士军刀,在资源受限的环境中发挥着不可替代的作用。
回顾一下,我们学习了:
- BusyBox的基本概念和发展历史
- 多种安装方式(发行版包管理器、源码编译)
- 详细的配置和编译流程
- 基本使用和构建完整Linux系统
- 高级用法和实际应用案例
- 常见问题和优化技巧
希望这篇文章对你有所帮助!如果你在使用BusyBox过程中有任何问题,欢迎在评论区留言讨论。
参考资料:
感谢阅读!如果觉得本文对你有帮助,请点赞、收藏、关注三连支持一下博主哦!