rsync 和使用 du 后目录大小不同

rsync 和使用 du 后目录大小不同

我将一些特殊目录(常见迁移工具不支持)从一个 Synology NAS 卷 (ext4) 迁移到另一个 (btrfs)。检查同步是否成功后,发现大小相差很大。

我知道存在块大小差异,但du在同一卷中给出了错误的数据大小。

整个目录的总大小超过 1 TB,因此我将以下命令缩小到更小的子目录。

不同尺寸:

sudo du -sm /volume[12]/@synologydrive/@sync/repo/1/2
11418   /volume1/@synologydrive/@sync/repo/1/2
11122   /volume2/@synologydrive/@sync/repo/1/2

但是对于每个子目录,我都会得到正确的大小(使用字节时或多或少) -n选择子目录:

sudo du -sm /volume[12]/@synologydrive/@sync/repo/1/2/n
295     /volume1/@synologydrive/@sync/repo/1/2/n
295     /volume2/@synologydrive/@sync/repo/1/2/n

sudo du -sb /volume[12]/@synologydrive/@sync/repo/1/2/n
308387853       /volume1/@synologydrive/@sync/repo/1/2/n
308391693       /volume2/@synologydrive/@sync/repo/1/2/n

*但是,在使用时我得到了完全不同的大小(即,即使在上面的相同卷比较命令和卷2上的这个命令上):

sudo du -sm /volume[12]/@synologydrive/@sync/repo/1/2/* | grep n$
295     /volume1/@synologydrive/@sync/repo/1/2/n
200     /volume2/@synologydrive/@sync/repo/1/2/n

sudo du -sb /volume[12]/@synologydrive/@sync/repo/1/2/* | grep n$
308387853       /volume1/@synologydrive/@sync/repo/1/2/n
209533219       /volume2/@synologydrive/@sync/repo/1/2/n

我还计算了目录下所有文件的大小n,并且得到了相同的大小:

ls -lA /volume1/@synologydrive/@sync/repo/1/2/n | tr -s ' ' | cut -f5 -d" " | awk '{s+=$1} END {print s}'
308387597
ls -lA /volume2/@synologydrive/@sync/repo/1/2/n | tr -s ' ' | cut -f5 -d" " | awk '{s+=$1} END {print s}'
308387597

因此,目录似乎正确“同步”(文件数量相同,大小相同),并试图排除两个不同文件系统之间的差异。但du在新卷 1 上给了我明显更大的尺寸(或者更准确地说 - 在旧卷 2 上明显更小)。

你对此有什么解释吗?

笔记:

  • volume1是新的 btrfs 目标卷(我将数据复制到)
  • volume2是旧的 ext4 源卷(我从中复制数据)
  • 数据复制使用sudo rsync -a --progress --delete /volume2/@synologydrive /volume1

答案1

感谢OP下评论中的@他们,我找到了根本原因。原始源卷包含大量硬链接目录/文件,它们都作为新的独立(固定)目录/文件复制到新卷。

实际上有两件事帮助我理解了这个问题:

  • rsync默认情况下不尊重硬链接。得到教训:rsync使用switch运行--hard-links,也可能使用--sparseswitch 来有效地处理较小的文件。

  • du默认情况下不包括硬链接文件的大小。得到教训:运行du -lswitch 来计算所有文件的大小,包括。那些硬联系的。与显示的尺寸类似ls

如果不了解这两个方面,我将不知道我的文件是否正确同步。

相关内容