通过开源鸿蒙终端工具Termony完成Busybox 命令行工具构建过程深度解读

本文记录使用命令 OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh 构建 Busybox 1.37.0 的完整过程,包括环境、构建链路、关键日志、常见问题与解决方案、产物验证与重建方法,便于复现与运维。

📖 Busybox 简介

Busybox 是一个集成了数百个常用 Unix 工具的精简可执行文件,被称为"嵌入式 Linux 的瑞士军刀"。它将许多常用的 Unix 工具(如 lscatgrepawksed 等)集成到一个可执行文件中,大大减小了系统体积,非常适合资源受限的嵌入式环境。

🎯 Busybox 的作用与重要性

Busybox 是嵌入式系统和最小化 Linux 发行版的核心组件,提供了:

  • 工具集成:将数百个常用 Unix 工具集成到一个可执行文件中
  • 体积优化:通过代码共享和精简实现,大大减小了系统体积
  • 功能完整:虽然精简,但提供了大多数常用工具的核心功能
  • 易于部署:单个可执行文件,便于分发和部署
  • 资源节约:适合资源受限的嵌入式环境

🔧 Busybox 核心特性

1. 多命令支持

Busybox 支持数百个常用 Unix 命令,包括:

  • 文件操作lscpmvrmmkdirrmdirchmodchown
  • 文本处理catheadtailgrepsedawkcutsort
  • 系统管理pstopkillmountumountdfdu
  • 网络工具pingwgettelnetftpifconfigroute
  • 压缩工具gzipgunziptarzipunzip
  • Shellashshbash(简化版)等
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_ARCHOHOS_ABI
    • 导出 LC_CTYPETOOL_HOMEOHOS_SDK_HOME
    • 执行 make -C build-hnp
  • 📦 顶层构建build-hnp/Makefile
    • PKGS 变量定义需要构建的包列表(包含 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_WCONFIG_WHOCONFIG_USERS - 缺少 getutxent 函数
      • CONFIG_SHA1_HWACCEL - 硬件加速编译问题
      • CONFIG_HUSH - Shell 兼容性问题
      • CONFIG_ETHER_WAKECONFIG_FEATURE_UTMP - UTMP 相关功能
      • CONFIG_SUCONFIG_LSCONFIG_SORTCONFIG_HOSTID - 其他不兼容功能
  • 🔨 构建流程
    1. 下载源码包
    2. 解包并应用补丁
    3. 修复终端控制问题(TCSANOWTCSADRAIN
    4. 生成默认配置并修改配置
    5. 修复代码中的 setgid/setuid 调用(避免被 seccomp 杀死)
    6. 编译生成 busybox_unstripped
    7. 使用 llvm-strip 剥离符号
    8. 复制到 ../sysroot/bin/busybox
  • 🔧 通用工具链与路径build-hnp/utils/Makefrag
    • CC/CXX/LD/AR/RANLIB/... 均指向 OHOS SDK 的 LLVM 工具链
    • 下载支持多镜像回退:wgetcurl,主镜像失败时自动尝试备用镜像

📋 关键日志与过程节点

  • 📥 下载与解包
    • 从 Slackware 镜像站下载 busybox-1.37.0.tar.bz2
    • 完成解包并进入 temp/busybox-1.37.0 目录
    • 下载规则支持多镜像回退:wgetcurl,自动尝试备用镜像
  • 🔧 补丁应用
    • 应用 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.cget_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

❌ 问题 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 杀死
  • 🔎 原因setgidsetuid 调用触发了 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

🔄 重建与扩展

  • 🔧 重建单包

    bash 复制代码
    make -C build-hnp rebuild-busybox  # 触发子包重新编译并刷新 .stamp
  • 🧹 清理

    bash 复制代码
    make -C build-hnp clean  # 清理 sysroot、所有 .stamp 和 PKGS_MARKER
  • 📦 扩展:Busybox 是嵌入式系统的基础工具集,可以根据需要调整配置启用或禁用特定命令

  • 🔄 自动重建机制

    • 修改 PKGS 后,check-pkgs 会自动检测变化并触发重新构建
    • 新增外部 HNP 包到 external-hnp 目录后,会自动合并到 base.hnp

💡 实践建议

  • 🔧 配置优化 :根据实际需求调整 .config 文件,只启用需要的命令,减小 busybox 体积
  • 🛡️ 兼容性处理:注意 OpenHarmony 与标准 Linux 的差异,及时应用补丁和配置修改
  • 📦 命令选择 :某些命令(如 lssort)可能系统已有更好的实现,可以考虑禁用 busybox 版本
  • 🔗 符号链接 :使用 busybox --install 创建符号链接,方便使用

📝 结论与建议

  • ✅ 本次已在 aarch64 环境下完成 Busybox 1.37.0 的交叉编译与打包,所有工具已集成到单个可执行文件中并纳入 HNP 包。
  • 💡 为保证构建稳定
    • 固定可靠的上游镜像,避免下载阶段随机失败(已实现自动回退机制)
    • 对大型包启用构建缓存(可在 Makefrag 中开启 USE_CCACHE
    • 及时应用补丁和配置修改,解决 OpenHarmony 兼容性问题
    • 根据实际需求调整配置,只启用需要的命令
    • 利用 check-pkgs 机制自动检测包列表变化,无需手动清理

📚 以上为 Busybox 构建的深度解读与实践记录。

相关推荐
答案answer2 小时前
一些经典的3D编辑器开源项目
前端·开源·three.js
b***46242 小时前
IoT DC3 是一个基于 Spring Cloud 的开源的、分布式的物联网(IoT)平台本地部署步骤
物联网·spring cloud·开源
5***r9353 小时前
开源数据同步中间件(Dbsyncer)简单玩一下 mysql to mysql 的增量,全量配置
mysql·中间件·开源
纵有疾風起16 小时前
C++——多态
开发语言·c++·经验分享·面试·开源
炸裂狸花猫18 小时前
开源域名证书工具 - cert-manager
云原生·容器·kubernetes·开源·cert-manager
fundroid20 小时前
Androidify:谷歌官方 AI + Android 开源示例应用
android·人工智能·开源
坚果派·白晓明1 天前
常用URL语法传输数据开源命令行工具curl鸿蒙化构建过程深度解析
开源·openharmony·开源鸿蒙·开源软件termony
robot_learner1 天前
11 月 AI 动态:多模态突破・智能体模型・开源浪潮・机器人仿真・AI 安全与主权 AI
人工智能·机器人·开源
坚果派·白晓明1 天前
通过开源鸿蒙终端工具Termony完成Zlib 命令行工具构建过程深度解读
openharmony·开源鸿蒙·开源软件termony