过去,我使用 备份了部分已满的分区dd if=/dev/sda1 | gzip -5 > file.gz
。一段时间后,当分区上的可用空间较小时,我使用相同命令再次创建了映像文件,输出文件略小。
在两种情况下,我都使用了相同版本的 dd 和 gzip、相同的参数、相同的硬件、相同的分区,并且从 dd 获得了相同的(时间和速度除外)输出,关于记录输入/输出量和复制字节数。
是什么原因造成的?又该如何解释?假设其中一个图像文件无效,如何检查哪个图像文件无效?更可能的是:硬盘损坏导致未检测到的数据丢失,还是差异与压缩问题有关?
答案1
这是压缩的本质。压缩的效果取决于输入数据。由于每次压缩的数据都不同,因此压缩后的大小也不同,即使未压缩时的大小相同。
答案2
您似乎认为自由空间压缩效果更好。没有这样的规则。
常见的文件系统仅将可用空间标记为可用,而不会用零或其他任何内容覆盖它。旧数据仍然存在,直到被新内容覆盖。(旁注:这就是为什么有时可以恢复已删除的文件的原因)。
dd
读取所有内容,它对文件系统或它们所认为的可用空间一无所知;然后gzip
压缩所有内容,包括“可用空间”中的旧数据,这些数据的压缩效果可能好也可能差。在这种情况下,没有可用空间;只有一些数据流需要处理。
可能是一些新的“高压缩性”文件替换了标记为可用空间的旧“低压缩性”数据。如果是这样,新存档将比旧存档小,尽管它包含更多您认为有用、实际或现有的数据。这可能是您遇到这种情况的主要原因。
请参见仅从硬盘克隆正在使用的空间, 和我的答案在那里。“准备”步骤用零覆盖空白空间,因此压缩效果非常好。如果您在每次备份之前都这样做,则生成的存档的大小可能与您的直觉一致。
“可能”,因为你问题的另一个答案总体上是正确的:一切都取决于输入数据。即使在将可用空间清零后,如果其中的文件不同,60% 已满的文件系统压缩成的存档可能比 50% 已满的同样大的文件系统压缩成的存档更小。