本文记录使用命令 OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh 构建 Busybox 1.37.0 的完整过程,包括环境、构建链路、关键日志、常见问题与解决方案、产物验证与重建方法,便于复现与运维。
📖 Busybox 简介
Busybox 是一个集成了数百个常用 Unix 工具的精简可执行文件,被称为"嵌入式 Linux 的瑞士军刀"。它将许多常用的 Unix 工具(如 ls、cat、grep、awk、sed 等)集成到一个可执行文件中,大大减小了系统体积,非常适合资源受限的嵌入式环境。
🎯 Busybox 的作用与重要性
Busybox 是嵌入式系统和最小化 Linux 发行版的核心组件,提供了:
- 工具集成:将数百个常用 Unix 工具集成到一个可执行文件中
- 体积优化:通过代码共享和精简实现,大大减小了系统体积
- 功能完整:虽然精简,但提供了大多数常用工具的核心功能
- 易于部署:单个可执行文件,便于分发和部署
- 资源节约:适合资源受限的嵌入式环境
🔧 Busybox 核心特性
1. 多命令支持
Busybox 支持数百个常用 Unix 命令,包括:
- 文件操作 :
ls、cp、mv、rm、mkdir、rmdir、chmod、chown等 - 文本处理 :
cat、head、tail、grep、sed、awk、cut、sort等 - 系统管理 :
ps、top、kill、mount、umount、df、du等 - 网络工具 :
ping、wget、telnet、ftp、ifconfig、route等 - 压缩工具 :
gzip、gunzip、tar、zip、unzip等 - Shell :
ash、sh、bash(简化版)等
2. 使用方式
Busybox 可以通过三种方式使用:
- 直接调用 :
busybox <command>或busybox <command> <args> - 符号链接:为每个命令创建指向 busybox 的符号链接
- 安装模式 :使用
busybox --install创建所有命令的符号链接
3. 配置方式
Busybox 使用 make menuconfig 或直接编辑 .config 文件来配置要包含的命令和功能。
🚀 构建入口与环境
- 📝 执行命令 :
OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh - 🔧 入口脚本 :
create-hnp.sh- 检查必需的环境变量
OHOS_ARCH和OHOS_ABI - 导出
LC_CTYPE、TOOL_HOME、OHOS_SDK_HOME - 执行
make -C build-hnp
- 检查必需的环境变量
- 📦 顶层构建 :
build-hnp/MakefilePKGS变量定义需要构建的包列表(包含busybox)- 通过
check-pkgs机制自动检测PKGS变化并触发重新构建 - 自动合并
external-hnp目录下的外部 HNP 包 base.hnp依赖所有包的.stamp和外部 HNP 包- 总目标
all: copy,打包base.hnp并拷贝到entry/hnp/$(OHOS_ABI)
⚙️ Busybox 包的构建配置
- 📁 包目录 :
build-hnp/busybox/Makefile- 继承通用规则:
include ../utils/Makefrag - 源地址:
SOURCE_URL = https://mirrors.slackware.com/slackware/slackware64-current/source/a/mkinitrd/busybox-1.37.0.tar.bz2 - 版本:
1.37.0
- 继承通用规则:
- 🔧 补丁应用 :
0001-skip-proc-stat.diff- 跳过/proc/stat读取(避免在 OpenHarmony 上读取失败)
- ⚙️ 配置修改 :
- 使用
make defconfig生成默认配置 - 通过
sed命令禁用不兼容的功能:CONFIG_W、CONFIG_WHO、CONFIG_USERS- 缺少getutxent函数CONFIG_SHA1_HWACCEL- 硬件加速编译问题CONFIG_HUSH- Shell 兼容性问题CONFIG_ETHER_WAKE、CONFIG_FEATURE_UTMP- UTMP 相关功能CONFIG_SU、CONFIG_LS、CONFIG_SORT、CONFIG_HOSTID- 其他不兼容功能
- 使用
- 🔨 构建流程 :
- 下载源码包
- 解包并应用补丁
- 修复终端控制问题(
TCSANOW→TCSADRAIN) - 生成默认配置并修改配置
- 修复代码中的
setgid/setuid调用(避免被 seccomp 杀死) - 编译生成
busybox_unstripped - 使用
llvm-strip剥离符号 - 复制到
../sysroot/bin/busybox
- 🔧 通用工具链与路径 :
build-hnp/utils/MakefragCC/CXX/LD/AR/RANLIB/...均指向 OHOS SDK 的 LLVM 工具链- 下载支持多镜像回退:
wget→curl,主镜像失败时自动尝试备用镜像
📋 关键日志与过程节点
- 📥 下载与解包 :
- 从 Slackware 镜像站下载
busybox-1.37.0.tar.bz2 - 完成解包并进入
temp/busybox-1.37.0目录 - 下载规则支持多镜像回退:
wget→curl,自动尝试备用镜像
- 从 Slackware 镜像站下载
- 🔧 补丁应用 :
- 应用
0001-skip-proc-stat.diff跳过/proc/stat读取
- 应用
- ⚙️ 配置阶段 :
- 使用
make defconfig生成默认配置 - 通过多个
sed命令禁用不兼容的功能 - 修复终端控制问题:将所有
TCSANOW替换为TCSADRAIN
- 使用
- 🔨 编译与安装 :
- 修复代码中的
setgid/setuid调用(注释掉,避免被 seccomp 杀死) - 使用交叉编译器编译生成
busybox_unstripped - 使用
llvm-strip剥离符号,减小文件大小 - 复制到
sysroot/bin/busybox
- 修复代码中的
✅ 产物验证
📦 检查打包文件
bash
ls build-hnp/base.hnp # 应存在
ls entry/hnp/arm64-v8a/*.hnp # 应包含 base.hnp 与 base-public.hnp
🔍 检查二进制文件
bash
# 检查 busybox 主程序
ls -lh build-hnp/sysroot/bin/busybox
file build-hnp/sysroot/bin/busybox
# 验证 busybox 是否可执行
test -f build-hnp/sysroot/bin/busybox && echo "busybox: OK" || echo "busybox: MISSING"
✅ 构建验证结果:
- ✅ busybox 主程序已成功安装:
busybox(1.8M) - ✅ 文件类型:ELF 64-bit LSB pie executable, ARM aarch64
- ✅ 已剥离符号,减小文件大小
📚 检查可用命令
bash
# 查看 busybox 支持的所有命令
build-hnp/sysroot/bin/busybox --help 2>&1 | head -50
# 列出所有可用命令(如果支持)
build-hnp/sysroot/bin/busybox --list 2>&1 | head -50
💻 终端中执行的示例命令
🔧 Busybox 基本使用
1. 查看帮助和可用命令
bash
# 查看 busybox 帮助信息
busybox --help
# 列出所有可用的命令(如果支持)
busybox --list
# 查看特定命令的帮助
busybox ls --help
busybox grep --help

2. 直接调用命令
bash
# 使用 busybox 执行命令
busybox ls -la
busybox cat /etc/passwd
busybox grep "pattern" file.txt
busybox ps aux
busybox top
3. 创建符号链接
bash
# 为常用命令创建符号链接
ln -s busybox ls
ln -s busybox cat
ln -s busybox grep
ln -s busybox ps
ln -s busybox top
# 使用符号链接
./ls -la
./cat file.txt
4. 安装所有命令
bash
# 安装所有命令的符号链接到当前目录
busybox --install -s .
# 或安装到指定目录
busybox --install -s /path/to/bin
📝 常用命令示例
文件操作命令
bash
# ls - 列出文件
busybox ls -la
busybox ls -lh
# cp - 复制文件
busybox cp source.txt dest.txt
busybox cp -r source_dir dest_dir
# mv - 移动/重命名文件
busybox mv old.txt new.txt
busybox mv file.txt /path/to/dest/
# rm - 删除文件
busybox rm file.txt
busybox rm -rf directory/
# mkdir - 创建目录
busybox mkdir newdir
busybox mkdir -p path/to/dir
# rmdir - 删除空目录
busybox rmdir emptydir
# chmod - 修改文件权限
busybox chmod 755 script.sh
busybox chmod +x script.sh
# chown - 修改文件所有者
busybox chown user:group file.txt
文本处理命令
bash
# cat - 显示文件内容
busybox cat file.txt
busybox cat file1.txt file2.txt
# head - 显示文件开头
busybox head -n 20 file.txt
busybox head file.txt
# tail - 显示文件结尾
busybox tail -n 20 file.txt
busybox tail -f log.txt
# grep - 搜索文本
busybox grep "pattern" file.txt
busybox grep -r "pattern" directory/
busybox grep -i "pattern" file.txt
# sed - 流编辑器
busybox sed 's/old/new/g' file.txt
busybox sed -i 's/old/new/g' file.txt
# awk - 文本处理
busybox awk '{print $1}' file.txt
busybox awk -F: '{print $1}' /etc/passwd
# cut - 剪切文本
busybox cut -d: -f1 /etc/passwd
busybox cut -c1-10 file.txt
# sort - 排序
busybox sort file.txt
busybox sort -r file.txt
busybox sort -n numbers.txt
# uniq - 去重
busybox uniq file.txt
busybox sort file.txt | busybox uniq
系统管理命令
bash
# ps - 显示进程
busybox ps
busybox ps aux
# top - 显示系统资源使用
busybox top
# kill - 杀死进程
busybox kill 1234
busybox kill -9 1234
# mount - 挂载文件系统
busybox mount /dev/sda1 /mnt
busybox mount -t ext4 /dev/sda1 /mnt
# umount - 卸载文件系统
busybox umount /mnt
# df - 显示磁盘使用情况
busybox df -h
# du - 显示目录大小
busybox du -sh directory/
busybox du -h file.txt
网络工具命令
bash
# ping - 网络连通性测试
busybox ping -c 4 8.8.8.8
busybox ping google.com
# wget - 下载文件
busybox wget http://example.com/file.txt
busybox wget -O output.txt http://example.com/file.txt
# ifconfig - 网络接口配置
busybox ifconfig
busybox ifconfig eth0 192.168.1.100
# route - 路由表
busybox route
busybox route add default gw 192.168.1.1
压缩工具命令
bash
# gzip/gunzip - Gzip 压缩/解压
busybox gzip file.txt
busybox gunzip file.txt.gz
# tar - 归档工具
busybox tar -czf archive.tar.gz directory/
busybox tar -xzf archive.tar.gz
busybox tar -tf archive.tar.gz
# zip/unzip - Zip 压缩/解压
busybox zip archive.zip file1.txt file2.txt
busybox unzip archive.zip
Shell 命令
bash
# sh/ash - Shell 解释器
busybox sh script.sh
busybox ash -c "echo hello"
# 创建简单的 Shell 脚本
cat > test.sh << 'EOF'
#!/bin/sh
echo "Hello from busybox sh"
ls -la
EOF
busybox sh test.sh
🧪 功能验证脚本
bash
#!/bin/bash
# busybox 工具验证脚本
BUSYBOX_BIN="build-hnp/sysroot/bin"
echo "=== Busybox 工具验证 ==="
if [ -f "$BUSYBOX_BIN/busybox" ]; then
echo "✓ busybox: 存在"
file "$BUSYBOX_BIN/busybox"
echo ""
echo "文件大小: $(ls -lh "$BUSYBOX_BIN/busybox" | awk '{print $5}')"
echo ""
echo "=== 测试常用命令 ==="
# 测试 ls
echo "测试 ls 命令:"
"$BUSYBOX_BIN/busybox" ls --help 2>&1 | head -3 || echo "ls 命令不可用"
# 测试 cat
echo ""
echo "测试 cat 命令:"
echo "test" | "$BUSYBOX_BIN/busybox" cat || echo "cat 命令不可用"
# 测试 grep
echo ""
echo "测试 grep 命令:"
echo "test line" | "$BUSYBOX_BIN/busybox" grep "test" || echo "grep 命令不可用"
# 测试 ps
echo ""
echo "测试 ps 命令:"
"$BUSYBOX_BIN/busybox" ps --help 2>&1 | head -3 || echo "ps 命令不可用"
else
echo "✗ busybox: 缺失"
fi
🐛 构建过程遇到的问题及解决方法
❌ 问题 1:/proc/stat 读取失败
- 🔍 症状 :在 OpenHarmony 系统上,某些命令(如
top)尝试读取/proc/stat时失败 - 🔎 原因 :OpenHarmony 的
/proc/stat格式或访问方式与标准 Linux 不同 - ✅ 解决方法 :
- 应用补丁
0001-skip-proc-stat.diff - 在
procps/top.c的get_jiffy_counts()函数中添加return;语句,跳过/proc/stat读取 - 补丁位置:
build-hnp/busybox/0001-skip-proc-stat.diff
- 应用补丁
❌ 问题 2:终端控制 TCSANOW 不工作
- 🔍 症状:终端控制相关功能异常
- 🔎 原因 :OpenHarmony 不支持
TCSANOW,需要使用TCSADRAIN - ✅ 解决方法 :
- 在构建过程中使用
sed命令将所有TCSANOW替换为TCSADRAIN - 命令:
find temp/busybox-1.37.0 -type f | xargs sed -i.bak 's/TCSANOW,/TCSADRAIN,/' - 位置:
build-hnp/busybox/Makefile:9
- 在构建过程中使用
❌ 问题 3:缺少 getutxent 函数
- 🔍 症状 :编译时出现
getutxent未定义的错误 - 🔎 原因 :OpenHarmony 的 musl libc 不提供
getutxent函数 - ✅ 解决方法 :
- 禁用依赖
getutxent的功能:CONFIG_W=n- 禁用w命令CONFIG_WHO=n- 禁用who命令CONFIG_USERS=n- 禁用users命令
- 位置:
build-hnp/busybox/Makefile:12-14
- 禁用依赖
❌ 问题 4:硬件加速编译问题
- 🔍 症状:编译时出现 SHA1 硬件加速相关错误
- 🔎 原因:交叉编译环境不支持硬件加速
- ✅ 解决方法 :
- 禁用硬件加速:
CONFIG_SHA1_HWACCEL=n - 位置:
build-hnp/busybox/Makefile:16
- 禁用硬件加速:
❌ 问题 5:Shell 兼容性问题
- 🔍 症状:HUSH shell 在 OpenHarmony 上运行异常
- 🔎 原因:HUSH shell 与 OpenHarmony 环境不兼容
- ✅ 解决方法 :
- 禁用 HUSH shell:
CONFIG_HUSH=n - 使用其他 shell(如 ash)
- 位置:
build-hnp/busybox/Makefile:17
- 禁用 HUSH shell:
❌ 问题 6:UTMP 相关功能不兼容
- 🔍 症状:UTMP 相关命令无法正常工作
- 🔎 原因:OpenHarmony 不支持标准的 UTMP 功能
- ✅ 解决方法 :
- 禁用相关功能:
CONFIG_ETHER_WAKE=n- 禁用以太网唤醒CONFIG_FEATURE_UTMP=n- 禁用 UTMP 功能
- 位置:
build-hnp/busybox/Makefile:18-19
- 禁用相关功能:
❌ 问题 7:其他不兼容功能
- 🔍 症状:某些命令在 OpenHarmony 上无法正常工作
- 🔎 原因:这些命令依赖 OpenHarmony 不支持的系统功能
- ✅ 解决方法 :
- 禁用不兼容的功能:
CONFIG_SU=n- 禁用su命令CONFIG_LS=n- 禁用ls命令(使用系统自带的)CONFIG_SORT=n- 禁用sort命令(使用系统自带的)CONFIG_HOSTID=n- 禁用hostid命令
- 位置:
build-hnp/busybox/Makefile:20-23
- 禁用不兼容的功能:
❌ 问题 8:seccomp 杀死进程
- 🔍 症状:某些操作导致进程被 seccomp 杀死
- 🔎 原因 :
setgid和setuid调用触发了 seccomp 保护机制 - ✅ 解决方法 :
- 注释掉相关代码:
- 在
libbb/xfuncs_printf.c中注释setgid(gid) - 在
libbb/appletlib.c中注释setgid(rgid)和setuid(ruid)
- 在
- 位置:
build-hnp/busybox/Makefile:25-27
- 注释掉相关代码:
❌ 问题 9:编译警告
- 🔍 症状 :编译时出现
-Wno-int-conversion警告 - 🔎 原因:类型转换相关的编译器警告
- ✅ 解决方法 :
- 在编译时添加
CFLAGS="-Wno-int-conversion"抑制警告 - 位置:
build-hnp/busybox/Makefile:28
- 在编译时添加
🔄 重建与扩展
-
🔧 重建单包:
bashmake -C build-hnp rebuild-busybox # 触发子包重新编译并刷新 .stamp -
🧹 清理:
bashmake -C build-hnp clean # 清理 sysroot、所有 .stamp 和 PKGS_MARKER -
📦 扩展:Busybox 是嵌入式系统的基础工具集,可以根据需要调整配置启用或禁用特定命令
-
🔄 自动重建机制:
- 修改
PKGS后,check-pkgs会自动检测变化并触发重新构建 - 新增外部 HNP 包到
external-hnp目录后,会自动合并到base.hnp
- 修改
💡 实践建议
- 🔧 配置优化 :根据实际需求调整
.config文件,只启用需要的命令,减小 busybox 体积 - 🛡️ 兼容性处理:注意 OpenHarmony 与标准 Linux 的差异,及时应用补丁和配置修改
- 📦 命令选择 :某些命令(如
ls、sort)可能系统已有更好的实现,可以考虑禁用 busybox 版本 - 🔗 符号链接 :使用
busybox --install创建符号链接,方便使用
📝 结论与建议
- ✅ 本次已在 aarch64 环境下完成 Busybox 1.37.0 的交叉编译与打包,所有工具已集成到单个可执行文件中并纳入 HNP 包。
- 💡 为保证构建稳定 :
- 固定可靠的上游镜像,避免下载阶段随机失败(已实现自动回退机制)
- 对大型包启用构建缓存(可在
Makefrag中开启USE_CCACHE) - 及时应用补丁和配置修改,解决 OpenHarmony 兼容性问题
- 根据实际需求调整配置,只启用需要的命令
- 利用
check-pkgs机制自动检测包列表变化,无需手动清理
📚 以上为 Busybox 构建的深度解读与实践记录。