为什么两个同步的目录层次结构大小不同?

为什么两个同步的目录层次结构大小不同?

我正在使用 rsync 同步两个文件夹

rsync -arzv --times --delete-after --relative -e ssh user@host:path/./media/ ~/path/

它说一切都很好,但是目的地报告:

$ du -s path/media/
18335196    site_media/media/

消息来源报道称:

$ du -s path/media/
18473500        site_media/media/

当我深入研究问题时,所有文件的大小都相同,但目录的大小不同。为什么?两者都是运行 ubuntu 的 VM,源在 11.04 上,目标在 12.04 LTS 上

我明白为什么它们加起来不等于相同的数字,我想了解的是为什么文件夹报告的大小不同。

答案1

由于这是两个不同的虚拟机,它们运行着不同的 Ubuntu 主版本,我怀疑文件系统的块大小是罪魁祸首。du报告正在使用的磁盘大小,而不是文件大小的总和。这是一个微妙但重要的区别。

如果您有一个文件,其大小为 1 字节,并且块大小为 1KB,du则将报告已使用 1KB。如果块大小为 4KB,则将报告已使用 4KB。如果该文件为 1025B,则对于 1KB 块大小,它将报告已使用 2KB,对于 4KB,它将报告已使用 4KB。如果该文件为 4097B,则对于 1KB 块大小,它将报告已使用 5KB,对于 4KB 块大小,它将报告已使用 8KB。

以下序列演示了此行为:

$ touch foo ; du -h foo
  0B    foo
$ echo -n 1 > foo ; du -h foo
4.0K    foo

使用此命令显示文件系统的块大小:

tune2fs -l /dev/sda1 | grep -i 'block size'

(显然,/dev/sda1用适当的块设备替换。)

如果不同,那就是你的差异。

检查准确性的更好方法rsync是对文件进行哈希处理并进行比较。以下是示例:

find path/media -exec openssl sha1 {} + | sort > ~/hashes

然后是diff文件hashes

答案2

使用时存在许多差异来源du。请查看man参考。我也在 aix 上遇到过这样的问题。在手册中,有一个选项--apparent-size,很好地描述了这些差异。另外 - 注意计算大小的块大小(默认值为 1024 字节,但可能因系统而异)。您必须使用显示文件确切大小的命令(或)du来应对它,这是我用来解决这个问题的方法。lsfind

答案3

另一种可能性是rsync--archive标志默认不保留硬链接。如果您使用硬链接,那么这也可能是您的问题。

答案4

很有可能您已经在目录中添加和删除文件很长时间了。目录中未链接文件的空间会被回收,但将来添加的文件可能无法直接使用这些可用空间。

我假设您还没有镜像曾经发生过的每个文件链接和取消链接 - 源文件链接和取消链接的文件数量很容易比目标文件多十到二十倍 - 因此目标文件不会那么碎片化。

如果您执行一些超级复杂的目录体操,您可能能够减少源目录的大小;它看起来像这样:

mkdir foo
mv media/* foo
rmdir media
mv foo media

请注意,这不会节省足够的驱动器空间,因此不值得这么做。这只是一个有趣的玩具,如果那样的话……

相关内容