BusyBox完全指南

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的安装
    • 四、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 常见问题与解决方案

  1. 编译错误:缺少库或头文件

    • 检查是否安装了build-essential和ncurses-dev
    • 确认交叉编译工具链配置正确
  2. 运行时出现动态链接错误

    • 重新配置BusyBox,勾选静态编译选项
    • 或复制所需的动态库到目标系统
  3. 设备节点缺失

    • 手动创建必要的设备节点
    • 或使用devtmpfs自动挂载
  4. 命令行为与标准工具不一致

    • 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系统的瑞士军刀,在资源受限的环境中发挥着不可替代的作用。

回顾一下,我们学习了:

  1. BusyBox的基本概念和发展历史
  2. 多种安装方式(发行版包管理器、源码编译)
  3. 详细的配置和编译流程
  4. 基本使用和构建完整Linux系统
  5. 高级用法和实际应用案例
  6. 常见问题和优化技巧

希望这篇文章对你有所帮助!如果你在使用BusyBox过程中有任何问题,欢迎在评论区留言讨论。


参考资料


感谢阅读!如果觉得本文对你有帮助,请点赞、收藏、关注三连支持一下博主哦!

相关推荐
ScilogyHunter1 小时前
QEMU完全指南
linux·qemu
2301_777998341 小时前
磁盘与文件系统
linux
牟同學1 小时前
Ubuntu 18.04 升级至 22.04 LTS 完整指南
linux·ubuntu
qq_163135751 小时前
Linux 【05-rmdir命令超详细教程】
linux
qq_163135751 小时前
Linux 【02-cd命令超简教程】
linux
ShirleyWang0121 小时前
win11运行ubuntu报错
linux·运维·ubuntu
加油码1 小时前
Linux 进程详解:从进程状态、调度到程序替换
linux·服务器
DeeplyMind1 小时前
Linux 内核模块符号版本不匹配问题排查指南
linux·crc·module.symvers
qq_163135751 小时前
Linux查看组名
linux