遇到FAT32等单文件大小限制时,tar打包会因write系统调用返回EFBIG失败;解决方法包括:①用-L参数自动分卷(如-L 4000m),生成连续命名的独立tar.gz分卷;②用split对tar流灵活分段;③换用ext4/NTFS等支持大文件的文件系统。

遇到归档文件超过分区单文件大小限制(比如 FAT32 分区最大支持 4GB 文件),tar 本身不负责文件系统级的大小限制检查,但打包后写入时会因底层文件系统拒绝而失败。关键不是 tar 报错,而是 write 系统调用返回 EFBIG 或 shell 提示 “File too large”。解决思路是:**不让 tar 输出单个超限文件,而是提前分段或换用支持大文件的文件系统**。
用 -L 参数让 tar 自动分卷归档
tar 内置的 -L(或 --tape-length)选项可强制在指定大小处断开归档流,适合应对 FAT32、邮箱附件等场景:
- 命令示例:
tar -czf archive.tar.gz -L 4000m /data(每 4000MB 生成一个归档片段) - 实际会生成
archive.tar.gz、archive.tar.gz.1、archive.tar.gz.2等,按序命名 - 解包时需按顺序 cat 合并:
cat archive.tar.gz* | tar -xzf - - 注意:
-L仅对输出到文件有效,不适用于管道;且压缩流(如 gz/bz2)必须整体连续,不能在压缩中间截断——所以它实际是在未压缩的 tar 流上分段,再整体压缩,因此最终每个分卷仍是独立可解压的 tar.gz
用 split 配合 tar 实现灵活分段
更通用的做法是先 tar 打包成标准流,再用 split 切割,不受 tar 版本限制,也兼容任意压缩格式:
- 打包并分段(每段 500MB):
tar -czf - /data | split -b 500M - archive.tar.gz. - 生成文件如
archive.tar.gz.aa、archive.tar.gz.ab……按字母序排列 - 还原时严格按序合并:
cat archive.tar.gz.* | tar -xzf -(shell 展开保证字母序) - 若文件名含空格或特殊字符,建议用
split -d(数字后缀)+cat archive.tar.gz.{00..99} | ...避免排序歧义
规避限制:换文件系统或调整目标路径
如果只是临时导出,最省事的方式是绕过限制本身:
- 将目标路径挂载为 ext4、XFS 或 NTFS(Linux 下需
ntfs-3g支持大文件写入) - 使用 tmpfs 或其他支持大文件的临时存储中转:
tar -czf /dev/shm/temp.tar.gz /data && mv /dev/shm/temp.tar.gz /mnt/fat32/(再分段) - 确认当前分区类型:
df -T /path/to/target;查看单文件上限:getconf FILESIZEBITS /mount/point
验证分段归档是否完整
分段操作易出错,还原前务必校验:
- 检查分段文件数量是否连续:
ls archive.tar.gz.* | wc -l - 确认所有分段大小合理(最后一段可略小,其余应接近设定值)
- 用
sha256sum对原始数据和还原后数据做比对,或对合并后的流做哈希:cat archive.tar.gz.* | sha256sum与预期一致 - 测试解包是否报错:
cat archive.tar.gz.* | tar -tzf - > /dev/null(仅列目录,不提取)

















