本文记录使用命令 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_ARCH和OHOS_ABI - 导出
LC_CTYPE、TOOL_HOME、OHOS_SDK_HOME - 执行
make -C build-hnp
- 检查必需的环境变量
- 📦 顶层构建 :
build-hnp/MakefilePKGS变量定义需要构建的包列表(包含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- 关闭本地化(国标字符集)以减少依赖与体积
- 🔨 构建流程 :
- 下载源码包(支持多镜像回退)
- 解包并进入
temp/tar-1.35目录 - 运行
./configure配置构建系统 - 使用
make -j $(nproc)并行编译 - 使用
make install安装 - 执行 ELF strip 减小体积
- 复制到
../sysroot
- 🔧 通用工具链与路径 :
build-hnp/utils/MakefragCC/CXX/LD/AR/RANLIB/...均指向 OHOS SDK 的 LLVM 工具链- 下载支持多镜像回退:
wget→curl,主镜像失败时自动尝试备用镜像
📋 关键日志与过程节点
- 📥 下载与解包 :
- 从 GNU 镜像下载
tar-1.35.tar.xz - 完成解包并进入
temp/tar-1.35目录 - 下载规则支持多镜像回退:
wget→curl兜底
- 从 GNU 镜像下载
- ⚙️ 配置阶段 :
- 运行
./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 - 通用下载逻辑支持备用镜像与重试(
wget→curl) - 位置:
build-hnp/utils/Makefrag:61-69
- 手动下载源码包放置到
❌ 问题 4:架构不支持
- 🔍 症状 :
Unsupported OHOS_ARCH= - 🔎 原因:传入的架构不在支持列表中
- ✅ 解决方法 :
- 确保传入支持架构(
aarch64或x86_64) - 位置:
build-hnp/Makefile:1-38
- 确保传入支持架构(
❌ 问题 5:链接与头文件异常
- 🔍 症状:链接失败或找不到头文件
- 🔎 原因:交叉工具链或 sysroot 路径不正确
- ✅ 解决方法 :
- 检查交叉工具链与
sysroot路径是否正确 - 确保通过
create-hnp.sh触发构建以获得完整环境变量 - 位置:
create-hnp.sh、build-hnp/utils/Makefrag
- 检查交叉工具链与
❌ 问题 6:压缩格式不支持
- 🔍 症状:无法使用某些压缩格式(如 xz、bzip2)
- 🔎 原因:缺少相应的压缩库
- ✅ 解决方法 :
- 确保相应的压缩库已安装(如
liblzma、libbz2) - 这些库通常由系统提供,不是 tar 构建的一部分
- 这是运行时问题,不是构建问题
- 确保相应的压缩库已安装(如
❌ 问题 7:权限问题
- 🔍 症状:提取归档时权限错误
- 🔎 原因:文件权限或所有者设置问题
- ✅ 解决方法 :
- 使用
-p选项保持文件权限 - 使用
--same-owner保持文件所有者 - 使用
--no-same-owner不保持文件所有者 - 这是运行时问题,不是构建问题
- 使用
🔄 重建与扩展
-
🔧 重建单包:
bashmake -C build-hnp rebuild-tar # 触发子包重新编译并刷新 .stamp -
🧹 清理:
bashmake -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 构建的深度解读与实践记录。