Rsync

rsync 和使用 du 後的不同目錄大小

  • January 9, 2022

我將一些特殊目錄(常用遷移工具不支持)從一個 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

感謝@they 在 OP 下的評論中,我找到了根本原因。原始源卷包含許多硬連結目錄/文件,它們都被複製到新卷作為新的獨立(固定)目錄/文件。

實際上有兩件事幫助我理解了這個問題:

  • rsync預設情況下不尊重硬連結。經驗教訓:rsync使用switch執行--hard-links,也可能使用--sparseswitch 來有效地處理較小的文件。
  • du預設情況下不包括硬連結文件的大小。**經驗教訓:**執行du -lswitch 以計算所有文件的大小,包括。那些硬連結。與顯示的大小類似ls

如果不知道這兩個方面,我就不知道我的文件是否正確同步。

引用自:https://unix.stackexchange.com/questions/679882