![恢复巨大且损坏的 Gzip 文件](https://linux22.com/image/1123874/%E6%81%A2%E5%A4%8D%E5%B7%A8%E5%A4%A7%E4%B8%94%E6%8D%9F%E5%9D%8F%E7%9A%84%20Gzip%20%E6%96%87%E4%BB%B6.png)
我有一个 50.9 GB 的文件,它是我在 Ubuntu 12.04 上的主文件夹的备份。我在终端上使用 tar 将此文件从我的 sda (ext4) 驱动器压缩到 sdb (ext4)。我使用的命令是
tar cvfz /media/2ndHDD/home.tar /home/<my_username>
压缩后出现此错误:
tar: Exiting with failure status due to previous errors
。
我重复压缩了三次,但压缩完成后还是出现同样的错误。因为第三次尝试时我已经筋疲力尽了(尤其是花了我一整天的时间),所以我只是忽略了这个错误,希望它不会影响我解压文件。
之后,我在 sda 驱动器上安装了新的操作系统 Ubuntu 14.04。安装完成后,我尝试使用以下命令解压之前压缩的文件
tar xvf home.tar
但我收到了这个错误:
gzip: stdin: invalid compressed data--format violated
tar: Unexpected EOF in archive
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now
所以我尝试使用 gzip 压缩文件
gzip home.tar
然后等了将近 1 个小时才完成。之后,我又用 gzip 解压了一次。
tar -xvzf home.tar.gz
这个过程根本无法完成,15 分钟后就会停止,导致创建的“主”文件夹中没有我期望的文件。我一遍又一遍地重复这个过程,但并没有真正完成。
有什么方法可以恢复这个巨大的压缩文件吗?我已经尝试过gzrecover
(http://fosshelp.blogspot.com/2013/04/howto-recover-corrupted-targz-file.html) 但总是失败。当我尝试将其转换为 gzip 时,是否也可能我已经丢失了文件?我真的很后悔为什么我没有直接复制未压缩的主文件夹。:(
更新:刚才,我尝试使用此命令将其转换回 tar
gzip -d home.tar.gz
并通过运行来解压缩
tar xvf home.tar
现在我收到此错误:
gzip: stdin: invalid compressed data--format violated
tar: Unexpected EOF in archive
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now
即使只列出 tar 文件中的文件也无法完成处理
tar -tvf home.tar
我仍然会得到上述相同的错误
更新(2015 年 1 月 11 日):我尝试运行strace gunzip home.tar.gz
,大约 15-20 分钟后,我得到了这些:
read(3, "\231\300\2678\242p\206\371\341\322\352\312\374\271?\252.\1775sC\330|D$PF$\10r\362V"..., 32768) = 32768
write(4, "\256Y\341\224\362Nn\315\316\373>\31\202\275c\373\266\265\345\27 R\312\2\221b'6\263\321\10F"..., 32768) = 32768
read(3, "[\366\"\r\265\244\3s\201\223b\n\267\364\34\247Ej\210tF\22\255B\254\223\216E\26\242\321\210"..., 32768) = 32768
write(4, "\n1g\201\\m\231\364\352@\"%\207\"Q+\37a^!8\226\233\204\244\v\334&i\361\2a"..., 32768) = 32768
read(3, "\222\327\351\337(\376\376?\246AzC\371\231\200${V\361\310W9.\3571a\362\357\251\306o\234"..., 32768) = 32768
write(4, "\346\216sH\250\272\264T\335\356<?\377\266\272o{\32\21\264\367\34\377w\327\220\324\313\231\2775\337"..., 32768) = 32768
read(3, "\266\276\345\213\277}G\235\355\360\326\232\244\353Z\\\215\222g\354\202\356\351\303G~\210\363b\31\17P"..., 32768) = 32768
write(4, "\326!1\332\213\253\276\327\222<\345\25\210\366\266\337uSkj>\345$\257\225\2q\321^8Jk"..., 32768) = 32768
read(3, "~D\212\373\372\"\373\367m0\322%\365S\377\335\331\336\376RB\037727e'\371#S\224\223"..., 32768) = 26366
read(3, "", 6402) = 0
write(4, "\23\320\"\0059\24\20\"\5#M\210I\323\320\363T\220N\321\301\207\\\327(I\204\362\371\377\32!"..., 32768) = 32768
write(4, " \6\325\33\246\324\35\240h\225B\270\312\207\211\340)\314\27\17\"pv\2232?\"0Sez\247"..., 14402) = 14402
close(3) = 0
utimensat(4, NULL, {{1420884866, 686801693}, {1420818997, 36136000}}, 0) = 0
fchown32(4, 1000, 1000) = 0
fchmod(4, 0666) = 0
close(4) = 0
rt_sigprocmask(SIG_BLOCK, [HUP INT PIPE TERM XCPU XFSZ], [], 8) = 0
unlink("home.tar.gz") = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
_llseek(0, 0, 0xbf8c86a0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
close(0) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
有了上面的输出,我还能恢复它吗?我只是不知道从哪里开始:(
答案1
首先,使用以下命令创建一个 gzip 压缩的 tar 存档:
tar cvfz /media/2ndHDD/home.tar /home/<my_username>
您忽略了错误,没有向上滚动查看错误内容(这是一个很糟糕的主意)。然后,您尝试解压 tar 文件(即使没有 -z 选项,它也应该能够识别出这是一个经过 gzip 压缩的 tar 存档):
tar xvf home.tar
它不起作用,你压缩了已经压缩的(使用相同的压缩算法)档案。你能解释一下这里的思考过程吗?
gzip home.tar
然后,您尝试解压已再次 gzip 压缩的 tarball:
tar -xvzf home.tar.gz
让我问一下 - 你知道你想要实现什么吗,或者你只是尝试随机命令,“让我们看看会发生什么”而不注意它们实际做了什么?
我强烈建议在将来更好地规划备份并注意存在的错误,因为也许 tar 的开发人员认为它们足够重要(毕竟,它是一个备份 - 通常非常重要)应该在过程结束时重复它们......
这次,我会先尝试查看您的档案(或剩余部分)的实际格式。使用:
file <archive_file>
如果它确实是经过 gzip 压缩的 tar 存档,并且抛出了这些错误,恐怕你就倒霉了。
更新:我了解到您当前拥有的文件是一个 gzip 存档:
home.tar: gzip compressed data, from Unix, last modified: Fri Jan 9 22:07:25 2015.
根据压缩数据的类型,我猜你执行此操作的分区上应该有 4 倍的可用空间。如果 home.tar 不在其他地方,请将其移出 /home 目录。
运行以下命令作为解压它的最后手段:
gunzip -c home.tar > home1.tar
file home1.tar
第一个命令会尝试将 home.tar 文件解压为 home1.tar。另一个命令会告诉您 home1.tar 实际上是什么。它仍然可能是另一个 gzip 存档。
如果file
说这是 gzip 压缩的数据,请运行:
gunzip -c home1.tar > home2.tar
一定要注意文件名。找出 home2.tar 现在是什么:
file home2.tar
同样,如果它是经过 gzip 压缩的数据,请像上面一样再次对其运行 gunzip,这次重定向到 home3.tar。file
再次运行它。
如果它说:
homeX.tar: POSIX tar archive (GNU)
尝试使用以下命令列出其内容:
tar taf homeX.tar
如果有效,请尝试解压 tar 文件。