开源鸿蒙化构建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 构建的深度解读与实践记录。

相关推荐
坚果派·白晓明11 小时前
通过开源鸿蒙终端工具Termony完成Libarchive 命令行工具构建过程深度解读
openharmony·开源鸿蒙·开源软件termony
坚果派·白晓明11 小时前
通过开源鸿蒙终端工具Termony完成Zstd 命令行工具构建过程深度解读
openharmony·开源鸿蒙·开源软件termony
●VON1 天前
Electron 实战:纯图片尺寸调节工具(支持锁定纵横比)
前端·javascript·electron·开源鸿蒙
坚果派·白晓明1 天前
通过开源鸿蒙终端工具Termony完成Vim命令行工具构建过程深度解读
vim·openharmony·开源鸿蒙·开源软件termony
坚果派·白晓明2 天前
通过开源鸿蒙终端工具Termony完成Coremark 命令行工具构建过程深度解读
openharmony·命令行工具·开源鸿蒙·开源软件termony
坚果派·白晓明2 天前
通过开源鸿蒙终端工具Termony完成Ncurses 命令行工具构建过程深度解读
openharmony·开源鸿蒙·开源软件termony
A懿轩A2 天前
【2025版 OpenHarmony】GitCode 口袋工具 v1.0.1 更新发布:Flutter + HarmonyOS 封装导航栏进行跳转
flutter·harmonyos·openharmony·gitcode·开源鸿蒙
A懿轩A2 天前
【2025最新】Flutter 编译开发 鸿蒙HarmonyOS 6 项目教程(Windows)
windows·flutter·华为·openharmony·开源鸿蒙
坚果派·白晓明3 天前
通过开源鸿蒙终端工具Termony完成Bash命令行工具构建过程深度解读
openharmony·命令行工具·开源鸿蒙