使用--tape-length选项创建的分卷tar包解压时提示非法字节序列及归档损坏的解决求助
使用--tape-length选项创建的分卷tar包解压时提示非法字节序列及归档损坏的解决求助
哎,这种“备份图省事没测试,恢复时踩大坑”的经历太扎心了!别慌,咱们先搞清楚问题出在哪,再一步步解决。
首先说问题根源:你用的--tape-length参数本来是给磁带备份设计的,它会严格按照指定大小切割归档文件,但完全不管正在打包的文件是不是刚好到结尾——也就是说,那些4GB以上的MP4文件被硬生生劈成了好几段,分别塞进不同的tar包。当你解压时,tar读到一段不完整的文件头/数据,就会抛出“非法字节序列”“损坏的归档”这类错误,tarcat本质也是拼接后给tar处理,所以同样报错。
下面给你几个可行的解决办法,按优先级试试:
1. 用正确的方式拼接并解压(GNU tar专属)
GNU tar本身支持直接处理这种分卷包,不用第三方工具,直接按顺序拼接后解压就行:
# 方式一:先拼接成完整归档再解压 tar --concatenate --file=full-backup.tar backup-000.tar backup-001.tar ... tar xvf full-backup.tar # 方式二:直接管道拼接解压(更高效,省磁盘空间) cat backup-*.tar | tar xvf -
⚠️ 重点:一定要按文件名的顺序拼接(比如000、001、002...),乱序的话肯定会报错!
2. 强制用ASCII编码处理,规避字节序列问题
如果上面的方法还是报“非法字节序列”,大概率是你的系统 locale 设置导致tar对某些字节的识别出了问题。试试强制用C locale来处理:
LC_ALL=C cat backup-*.tar | tar xvf -
或者先拼接再解压:
LC_ALL=C tar --concatenate --file=full-backup.tar backup-*.tar LC_ALL=C tar xvf full-backup.tar
3. 应急恢复单个跨卷大文件
如果上面的方法都不行,或者你只需要恢复某个特定的大MP4,可以手动提取片段再拼接:
- 先定位这个大文件在哪些tar包里:
for tarfile in backup-*.tar; do echo "检查 $tarfile..." tar tf "$tarfile" | grep "你的大文件.mp4" done
- 从每个包含该文件片段的tar包里导出片段(用--to-stdout避免文件名冲突):
tar xf backup-000.tar "你的大文件.mp4" --to-stdout > part000.mp4 tar xf backup-001.tar "你的大文件.mp4" --to-stdout > part001.mp4 # 有多少个片段就执行多少条
- 拼接片段得到完整文件:
cat part000.mp4 part001.mp4 > "你的大文件.mp4"
最后给你个教训(别嫌啰嗦😂)
以后创建分卷备份时,尽量用更适合文件系统的方式:
- 用GNU tar的
-M/--multi-volume参数,它会智能处理跨卷文件:
tar cvf backup.tar -M --tape-length=4G /mnt/videofiles/
- 或者先打包成单个tar,再用split分割:
tar cvf - /mnt/videofiles/ | split -b 4G - backup-
这两种方式解压时都能用cat backup-* | tar xvf -轻松搞定,不会踩这次的坑。
备注:内容来源于stack exchange,提问作者Gabrie
相关产品推荐
相关产品推荐

