我将一些特殊目录(常见迁移工具不支持)从一个 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
,也可能使用--sparse
switch 来有效地处理较小的文件。du
默认情况下不包括硬链接文件的大小。得到教训:运行du -l
switch 来计算所有文件的大小,包括。那些硬联系的。与显示的尺寸类似ls
。
如果不了解这两个方面,我将不知道我的文件是否正确同步。