开源鸿蒙化构建GNU Tar 1.35:完整过程与验证

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

📖 Tar 简介

GNU Tar(Tape Archive)是一个用于创建、查看和提取归档文件的命令行工具。它是 Unix/Linux 系统中最常用的归档工具之一,支持多种压缩格式,可以打包多个文件和目录为单个归档文件,便于备份、传输和分发。

🎯 Tar 的作用与重要性

Tar 是文件归档和备份的核心工具,提供了:

  • 文件归档:将多个文件和目录打包成单个归档文件
  • 压缩支持:支持 gzip、bzip2、xz、lzma 等多种压缩格式
  • 目录结构保持:保持文件的目录结构和权限信息
  • 增量备份:支持增量备份和差异备份
  • 跨平台兼容:支持多种操作系统和文件系统
  • 标准格式:tar 格式是 Unix/Linux 系统的标准归档格式

🔧 Tar 核心特性

1. 归档格式支持
  • tar:标准 tar 格式(未压缩)
  • tar.gz / tgz:gzip 压缩的 tar 格式
  • tar.bz2:bzip2 压缩的 tar 格式
  • tar.xz:xz 压缩的 tar 格式
  • tar.lzma:lzma 压缩的 tar 格式
  • tar.Z:compress 压缩的 tar 格式
2. 操作模式
  • 创建归档-c 创建新的归档文件
  • 提取归档-x 从归档文件中提取文件
  • 查看归档-t 列出归档文件内容
  • 追加文件-r 向归档文件追加文件
  • 更新文件-u 更新归档文件中的文件
  • 删除文件--delete 从归档文件中删除文件
3. 压缩选项
  • gzip-z 使用 gzip 压缩/解压
  • bzip2-j 使用 bzip2 压缩/解压
  • xz-J 使用 xz 压缩/解压
  • compress-Z 使用 compress 压缩/解压
  • 自动检测-a 根据文件扩展名自动选择压缩格式
4. 高级功能
  • 权限保持-p 保持文件权限
  • 所有者保持--same-owner 保持文件所有者
  • 时间戳保持-m 不修改文件修改时间
  • 排除文件--exclude 排除特定文件或目录
  • 增量备份-g 使用增量备份快照文件
  • 差异备份--listed-incremental 创建差异备份
5. 应用场景
  • 文件备份:定期备份重要文件和目录
  • 软件分发:打包软件源代码和二进制文件
  • 数据传输:压缩和传输大量文件
  • 系统维护:备份系统配置和日志文件
  • 归档管理:整理和归档历史文件

🚀 构建入口与环境

  • 📝 执行命令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 变量定义需要构建的包列表(包含 tar
    • 通过 check-pkgs 机制自动检测 PKGS 变化并触发重新构建
    • 自动合并 external-hnp 目录下的外部 HNP 包
    • base.hnp 依赖所有包的 .stamp 和外部 HNP 包
    • 总目标 all: copy,打包 base.hnp 并拷贝到 entry/hnp/$(OHOS_ABI)

⚙️ Tar 包的构建配置

  • 📁 包目录build-hnp/tar/Makefile
    • 继承通用规则:include ../utils/Makefrag
    • 源地址:$(GNU_MIRROR)/gnu/tar/tar-1.35.tar.xz
    • 版本:1.35
  • ⚙️ Autotools 配置参数
    • --prefix=$(PREFIX) - 安装前缀(/data/app/base.org/base_1.0
    • --host $(OHOS_ARCH)-unknown-linux-musl - 目标平台
    • --disable-nls - 关闭本地化(国标字符集)以减少依赖与体积
  • 🔨 构建流程
    1. 下载源码包(支持多镜像回退)
    2. 解包并进入 temp/tar-1.35 目录
    3. 运行 ./configure 配置构建系统
    4. 使用 make -j $(nproc) 并行编译
    5. 使用 make install 安装
    6. 执行 ELF strip 减小体积
    7. 复制到 ../sysroot
  • 🔧 通用工具链与路径build-hnp/utils/Makefrag
    • CC/CXX/LD/AR/RANLIB/... 均指向 OHOS SDK 的 LLVM 工具链
    • 下载支持多镜像回退:wgetcurl,主镜像失败时自动尝试备用镜像

📋 关键日志与过程节点

  • 📥 下载与解包
    • 从 GNU 镜像下载 tar-1.35.tar.xz
    • 完成解包并进入 temp/tar-1.35 目录
    • 下载规则支持多镜像回退:wgetcurl 兜底
  • ⚙️ 配置阶段
    • 运行 ./configure --prefix=... --host=aarch64-unknown-linux-musl --disable-nls ...
    • 配置警告:libacl development library was not found,GNU tar 将在没有 ACL 支持的情况下构建(不影响基本功能)
    • 配置成功,禁用 NLS 支持
    • 生成 Makefile 和构建配置
  • 🔨 编译与安装
    • 使用 make -j $(nproc) 并行编译
    • 成功编译生成 tar 二进制
    • 使用 make install 安装到临时前缀
    • 执行 llvm-strip 剥离二进制符号
    • 复制到 ../sysroot
  • 📦 打包
    • 完成 base.hnp 重打包,拷贝产物到 entry/hnp/arm64-v8a/
    • Tar 工具已成功打包到 base.hnp

✅ 产物验证

📦 检查打包文件

bash 复制代码
ls build-hnp/base.hnp  # 应存在
ls entry/hnp/arm64-v8a/*.hnp  # 应包含 base.hnp 与 base-public.hnp

🔍 检查二进制文件

bash 复制代码
# 检查 tar 二进制
ls -lh build-hnp/sysroot/bin/tar
file build-hnp/sysroot/bin/tar

# 测试 tar 版本
build-hnp/sysroot/bin/tar --version

✅ 构建验证结果

  • ✅ Tar 二进制已成功安装:
    • tar (449K) - 主程序二进制
  • ✅ 文件类型:ELF 64-bit LSB pie executable, ARM aarch64
  • ✅ 动态链接:interpreter /lib/ld-musl-aarch64.so.1
  • ✅ 已剥离符号:stripped
  • ✅ 已打包到 base.hnp 中(459,672 字节)

💻 终端中执行的示例命令

📦 Tar 基本使用

1. 创建归档文件
bash 复制代码
# 创建 tar 归档
tar -cf archive.tar file1.txt file2.txt

# 创建 tar 归档(详细输出)
tar -cvf archive.tar file1.txt file2.txt

# 创建 tar.gz 归档(gzip 压缩)
tar -czf archive.tar.gz directory/

# 创建 tar.bz2 归档(bzip2 压缩)
tar -cjf archive.tar.bz2 directory/

# 创建 tar.xz 归档(xz 压缩)
tar -cJf archive.tar.xz directory/

# 创建归档并排除某些文件
tar -czf archive.tar.gz --exclude='*.log' --exclude='*.tmp' directory/

# 创建归档并保持权限
tar -czpf archive.tar.gz directory/
2. 提取归档文件
bash 复制代码
# 提取 tar 归档
tar -xf archive.tar

# 提取 tar 归档(详细输出)
tar -xvf archive.tar

# 提取 tar.gz 归档
tar -xzf archive.tar.gz

# 提取 tar.bz2 归档
tar -xjf archive.tar.bz2

# 提取 tar.xz 归档
tar -xJf archive.tar.xz

# 提取到指定目录
tar -xzf archive.tar.gz -C /path/to/destination

# 提取并保持权限
tar -xzpf archive.tar.gz

# 提取特定文件
tar -xzf archive.tar.gz file1.txt file2.txt

# 提取并显示进度
tar -xzf archive.tar.gz --checkpoint=.1000
3. 查看归档内容
bash 复制代码
# 列出归档内容
tar -tf archive.tar

# 列出归档内容(详细)
tar -tvf archive.tar

# 列出归档内容(长格式)
tar -tvvf archive.tar

# 列出 tar.gz 归档内容
tar -tzf archive.tar.gz

# 列出 tar.bz2 归档内容
tar -tjf archive.tar.bz2

# 列出 tar.xz 归档内容
tar -tJf archive.tar.xz

# 搜索归档中的文件
tar -tzf archive.tar.gz | grep pattern

# 查看归档信息
tar -tzf archive.tar.gz --list
4. 更新和追加文件
bash 复制代码
# 更新归档中的文件
tar -uf archive.tar file1.txt

# 追加文件到归档
tar -rf archive.tar newfile.txt

# 追加文件到压缩归档
tar -rzf archive.tar.gz newfile.txt

# 更新归档中的文件(如果文件较新)
tar -uvf archive.tar file1.txt
5. 压缩格式选项
bash 复制代码
# 使用 gzip 压缩(-z)
tar -czf archive.tar.gz directory/

# 使用 bzip2 压缩(-j)
tar -cjf archive.tar.bz2 directory/

# 使用 xz 压缩(-J)
tar -cJf archive.tar.xz directory/

# 使用 compress 压缩(-Z)
tar -cZf archive.tar.Z directory/

# 自动检测压缩格式(-a)
tar -caf archive.tar.gz directory/

# 不使用压缩
tar -cf archive.tar directory/

📦 Tar 高级用法

6. 增量备份
bash 复制代码
# 创建完整备份
tar -czf backup-full.tar.gz --listed-incremental=backup.snar directory/

# 创建增量备份
tar -czf backup-inc.tar.gz --listed-incremental=backup.snar directory/

# 创建增量备份(使用快照文件)
tar -czf backup.tar.gz -g snapshot.snar directory/

# 恢复增量备份
tar -xzf backup-full.tar.gz --listed-incremental=/dev/null
tar -xzf backup-inc.tar.gz --listed-incremental=/dev/null
7. 排除和包含文件
bash 复制代码
# 排除特定文件
tar -czf archive.tar.gz --exclude='*.log' directory/

# 排除多个文件
tar -czf archive.tar.gz --exclude='*.log' --exclude='*.tmp' directory/

# 排除目录
tar -czf archive.tar.gz --exclude='node_modules' directory/

# 使用排除文件列表
tar -czf archive.tar.gz -X exclude.txt directory/

# 只包含特定文件
tar -czf archive.tar.gz --include='*.txt' directory/

# 排除但包含特定文件
tar -czf archive.tar.gz --exclude='*.log' --include='important.log' directory/
8. 权限和所有者
bash 复制代码
# 保持文件权限
tar -czpf archive.tar.gz directory/

# 保持文件所有者
tar -czf archive.tar.gz --same-owner directory/

# 不修改文件修改时间
tar -czf archive.tar.gz -m directory/

# 设置文件权限
tar -czf archive.tar.gz --mode=755 directory/

# 设置文件所有者
tar -czf archive.tar.gz --owner=user --group=group directory/
9. 文件操作
bash 复制代码
# 从归档中删除文件
tar --delete -f archive.tar file1.txt

# 从归档中删除多个文件
tar --delete -f archive.tar file1.txt file2.txt

# 比较归档和目录
tar -df archive.tar.gz directory/

# 测试归档完整性
tar -tzf archive.tar.gz > /dev/null

# 显示归档统计信息
tar -tzf archive.tar.gz | wc -l
10. 实际应用示例
bash 复制代码
# 备份目录(带时间戳)
tar -czf backup-$(date +%Y%m%d-%H%M%S).tar.gz /path/to/backup

# 增量备份(只备份修改的文件)
tar -czf backup.tar.gz --newer-mtime="2024-01-01" directory/

# 创建归档并验证
tar -czf archive.tar.gz directory/ && tar -tzf archive.tar.gz

# 归档并排除大文件
tar -czf archive.tar.gz --exclude='*.iso' --exclude='*.img' directory/

# 归档多个目录
tar -czf archive.tar.gz dir1/ dir2/ dir3/

# 流式归档(通过网络传输)
tar -czf - directory/ | ssh remote "tar -xzf -"

# 归档并显示进度
tar -czf archive.tar.gz --checkpoint=.1000 --checkpoint-action=echo='%u' directory/

# 归档并设置权限
tar -czf archive.tar.gz --mode=755 directory/

# 创建归档并压缩(使用管道)
tar -cf - directory/ | gzip > archive.tar.gz

# 提取归档并解压(使用管道)
gunzip -c archive.tar.gz | tar -xf -

# 创建归档并加密(需要额外工具)
tar -czf - directory/ | openssl enc -aes-256-cbc -out archive.tar.gz.enc

# 提取加密归档
openssl enc -aes-256-cbc -d -in archive.tar.gz.enc | tar -xzf -

# 创建归档并分割
tar -czf - directory/ | split -b 100M - archive.tar.gz.part

# 合并分割的归档并提取
cat archive.tar.gz.part* | tar -xzf -

# 创建归档并验证完整性
tar -czf archive.tar.gz directory/ && md5sum archive.tar.gz > archive.tar.gz.md5

# 验证归档完整性
md5sum -c archive.tar.gz.md5 && tar -tzf archive.tar.gz

🧪 功能验证脚本

bash 复制代码
#!/bin/bash
# Tar 工具验证脚本

TAR_BIN="build-hnp/sysroot/bin"

echo "=== Tar 工具验证 ==="

# 检查 tar 二进制
if [ -f "$TAR_BIN/tar" ]; then
    echo "✓ tar: 存在"
    file "$TAR_BIN/tar"
    echo "文件大小: $(ls -lh "$TAR_BIN/tar" | awk '{print $5}')"
    echo "架构信息: $(file "$TAR_BIN/tar" | grep -o "ARM aarch64")"
    
    # 测试版本信息
    echo ""
    echo "版本信息:"
    "$TAR_BIN/tar" --version | head -1
    
    # 测试基本功能
    echo ""
    echo "=== 功能测试 ==="
    echo "测试创建归档..."
    mkdir -p /tmp/tar_test
    echo "test file" > /tmp/tar_test/test.txt
    "$TAR_BIN/tar" -czf /tmp/tar_test.tar.gz -C /tmp tar_test
    if [ -f "/tmp/tar_test.tar.gz" ]; then
        echo "✓ 创建归档成功"
        
        echo "测试列出归档内容..."
        "$TAR_BIN/tar" -tzf /tmp/tar_test.tar.gz
        echo "✓ 列出归档内容成功"
        
        echo "测试提取归档..."
        rm -rf /tmp/tar_test
        "$TAR_BIN/tar" -xzf /tmp/tar_test.tar.gz -C /tmp
        if [ -f "/tmp/tar_test/test.txt" ]; then
            echo "✓ 提取归档成功"
        else
            echo "✗ 提取归档失败"
        fi
        
        # 清理测试文件
        rm -rf /tmp/tar_test /tmp/tar_test.tar.gz
    else
        echo "✗ 创建归档失败"
    fi
else
    echo "✗ tar: 缺失"
fi

🐛 常见问题与处理

❌ 问题 1:ACL 支持缺失

  • 🔍 症状 :配置警告 libacl development library was not found
  • 🔎 原因:OpenHarmony 平台可能缺少 ACL(Access Control List)开发库
  • ✅ 解决方法
    • 这是配置警告,不影响基本功能
    • GNU tar 将在没有 ACL 支持的情况下构建
    • 如果需要 ACL 支持,需要先构建并安装 libacl
    • 位置:配置阶段日志

❌ 问题 2:NLS 本地化支持

  • 🔍 症状 :需要本地化功能但构建时使用了 --disable-nls
  • 🔎 原因:当前配置禁用了 NLS 以减少依赖和体积
  • ✅ 解决方法
    • 如果需要本地化功能,需要先构建 gettext
    • 移除 --disable-nls 或添加 --enable-nls
    • 注意:这会增加依赖和体积
    • 位置:build-hnp/tar/Makefile:6

❌ 问题 3:GNU 镜像不可达

  • 🔍 症状:下载失败,无法获取源码包
  • 🔎 原因:网络问题或 GNU 镜像访问受限
  • ✅ 解决方法
    • 手动下载源码包放置到 build-hnp/tar/download/tar-1.35.tar.xz
    • 通用下载逻辑支持备用镜像与重试(wgetcurl
    • 位置:build-hnp/utils/Makefrag:61-69

❌ 问题 4:架构不支持

  • 🔍 症状Unsupported OHOS_ARCH=
  • 🔎 原因:传入的架构不在支持列表中
  • ✅ 解决方法
    • 确保传入支持架构(aarch64x86_64
    • 位置:build-hnp/Makefile:1-38

❌ 问题 5:链接与头文件异常

  • 🔍 症状:链接失败或找不到头文件
  • 🔎 原因:交叉工具链或 sysroot 路径不正确
  • ✅ 解决方法
    • 检查交叉工具链与 sysroot 路径是否正确
    • 确保通过 create-hnp.sh 触发构建以获得完整环境变量
    • 位置:create-hnp.shbuild-hnp/utils/Makefrag

❌ 问题 6:压缩格式不支持

  • 🔍 症状:无法使用某些压缩格式(如 xz、bzip2)
  • 🔎 原因:缺少相应的压缩库
  • ✅ 解决方法
    • 确保相应的压缩库已安装(如 liblzmalibbz2
    • 这些库通常由系统提供,不是 tar 构建的一部分
    • 这是运行时问题,不是构建问题

❌ 问题 7:权限问题

  • 🔍 症状:提取归档时权限错误
  • 🔎 原因:文件权限或所有者设置问题
  • ✅ 解决方法
    • 使用 -p 选项保持文件权限
    • 使用 --same-owner 保持文件所有者
    • 使用 --no-same-owner 不保持文件所有者
    • 这是运行时问题,不是构建问题

🔄 重建与扩展

  • 🔧 重建单包

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

    bash 复制代码
    make -C build-hnp clean  # 清理 sysroot、所有 .stamp 和 PKGS_MARKER
  • 📦 扩展:Tar 是文件归档和备份的基础工具

  • 🔄 自动重建机制

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

💡 实践建议

  • 🔧 构建配置 :使用 --disable-nls 减少依赖和体积,适合大多数场景
  • 🚀 功能使用:根据需求选择合适的压缩格式和选项
  • 📦 备份策略:使用增量备份和差异备份减少存储空间
  • 🔗 压缩格式:gzip 兼容性最好,xz 压缩率最高,bzip2 平衡两者
  • 🌐 跨平台兼容:tar 格式是 Unix/Linux 系统的标准格式,兼容性好

📝 结论与建议

  • ✅ 本次已在 aarch64 环境下完成 GNU Tar 1.35 的交叉编译与打包,tar 工具已安装到 sysroot 并纳入 HNP 包。
  • 💡 为保证构建稳定
    • 使用 --disable-nls 关闭本地化以减少依赖和体积
    • ACL 支持缺失不影响基本功能,可以忽略配置警告
    • 确保通过 create-hnp.sh 触发构建以获得完整环境变量
    • 利用 check-pkgs 机制自动检测包列表变化,无需手动清理
    • Tar 为文件归档和备份提供了强大的工具支持
    • 常见陷阱包括 ACL 支持缺失、NLS 本地化支持、网络下载失败;当前已通过配置选项和下载回退机制处理
    • Autotools 交叉参数简洁、NLS 关闭策略减少依赖,构建路径稳健
    • 产物开箱即用,上层系统与应用可直接使用 tar 进行归档与解包操作

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

相关推荐
坚果派·白晓明3 天前
面向新手的鸿蒙跨平台开发技术选型指南
开源鸿蒙·鸿蒙跨平台应用开发·鸿蒙跨平台应用
坚果派·白晓明3 天前
Windows 11 OpenHarmony版React Native开发环境搭建完整指南
react native·开源鸿蒙·rnoh
fakerth4 天前
【OpenHarmony】升级服务组件(UpdateService)
操作系统·openharmony
fakerth4 天前
【OpenHarmony】Updater 升级包安装组件
操作系统·openharmony
鸿蒙小白龙6 天前
OpenHarmony轻量系统智能模块开发实战指南
arm开发·openharmony·liteos
鸿蒙小白龙6 天前
OpenHarmony轻量系统(Hi3861)RTOS API开发详解
openharmony·rtos·liteos·轻量系统
夏小鱼的blog14 天前
【HarmonyOS应用开发入门】第四期:ArkTS语言基础(二)
harmonyos·openharmony
黑臂麒麟14 天前
Electron for OpenHarmony 跨平台实战开发(二):文件树组件实现与优化
electron·openharmony
爱艺江河15 天前
[鸿蒙2025领航者闯关]基于MetaStudio的数字人与鸿蒙PC本地智能体融合:金融法务合规业务的技术实现与场景创新
金融·openharmony·鸿蒙2025领航者闯关
fakerth15 天前
【OpenHarmony】Hiview架构
架构·操作系统·openharmony