オプションでrsyncを使用しています
-r for recursive
-l copy symlinks as symlinks
-t preserve modification time
-D preserve devices and specials
-v verbose
--Prune-empty-dirs
ソースFSはext4、宛先はXFSです。数百ギグから数TBの範囲の数百のフォルダをコピーしましたが、すべてがサイズの違いは1 GB未満ですが、この特定のフォルダーはソースで264 GBであり、rsyncを実行すると286 GBになります。これは大きな違いであり、何が問題なのかわかりません。
ソースext4 FS=に破損がある場合、それは正しいディスク使用量を報告していない可能性がありますか? 'du -skh'を使用しています。
私はすべてを削除して3回再起動しましたが、同じ結果が得られます。
「du -b -d0 source destination」を使用すると、この「問題」に遭遇しました
ドリルダウンすると一致しないものの膨大なリストがあったため。
問題は、duがディレクトリとファイルのディスク使用量を報告することを主張していることであり、私はファイルのサイズのみを求めていました。
したがって、いくつかのディレクトリを作成すると、一部のファイルシステムではより多くのバイトが使用され、他のファイルシステムでは使用されなくなるため、違いが生じます。
解決策は、ディレクトリではなく、実際のファイルのサイズを比較することだけです。
次のコマンドラインは、findを使用してmusicディレクトリ内のファイルのみを出力し、duを使用してバイトカウントを合計します。
find music -type f -print0 |du --files0-from=- -cb
誰かが同じことをするためにsedスクリプトを投稿するなら、してください
Rsync FAQページにこれらの理由がリストされています: https://sanitarium.net/rsyncfaq/#differentsizes
ただし、知る唯一の方法は、ファイルを比較することです。
少数のファイルに対しては、diff -r /mnt/data /mnt/data-BACKUP
。ただし、途中で停止した場合は、中断したところから再開することはできません。古いdiffプログラムはバイナリファイルをうまく処理しません。
多数のファイルの場合は、すべてのファイルのハッシュを計算して違いを探すことをお勧めします。このようにして、プロセスが停止または中断した場合でも、問題なく続行できます。
例としてこのスクリプトを見てください:
https://github.com/TomOnTime/tomutils/blob/master/bin/md5tree
md5tree /mnt/data >/var/tmp/list.orig
md5tree /mnt/data-BACKUP >/var/tmp/list.backup
# NOTE: For these next 2 lines TAB means press the TAB key.
sort -t'TAB' -k6 </var/tmp/list.backup >/var/tmp/list.backup.sorted
sort -t'TAB' -k6 </var/tmp/list.orig >/var/tmp/list.orig.sorted
diff /var/tmp/list.orig.sorted /var/tmp/list.backup.sorted
最も可能性の高い原因はハードリンクです。デフォルトでは、Rsyncは2つのハードリンクされたファイルをターゲット上の複製ファイルに変換し、2倍のディスク容量を使用します。ハードリンクを保持したい場合は、-H/--hard-links
オプション。
次に可能性が高い問題はスパースファイルです。デフォルトでは、Rsyncはファイルがソース上にあっても、ファイルをスパースファイルとして書き込みません(実際にはわかりません)。スパースファイル(最も一般的には仮想マシンイメージと不完全なp2pダウンロードとして使用される)がある場合は、--sparse option
。
両方のファイルシステムで使用されているブロックサイズは同じですか?
ファイルが破損したことについて本当に疑いがある場合は、rsyncに(遅い!)-cオプションを使用することを検討してください。