あるローカルドライブから別のローカルドライブに大量のファイルの新しいコピーを作成したい。
Rsyncがファイルをネットワーク経由でリモートマシンに送信するときに、ファイルのチェックサム比較を行うことを読みました。
2つのローカルドライブ間でファイルをコピーするときに、rsyncは比較を行いますか?
検証を行う場合-それは安全な賭けですか?または、バイトごとの比較を行う方が良いですか?
rsyncは常にチェックサムを使用して、ファイルが正しく転送されたことを確認します。宛先ファイルがすでに存在する場合、変更時刻とサイズがソースファイルと一致すると、rsyncはファイルの更新をスキップできますが、rsyncがデータを転送する必要があると判断した場合、チェックサムはalways送信と受信のrsyncプロセス間で転送されるデータで使用されます。これは、受信されたデータが、ネットワークを介したバイトレベルの比較による大きなオーバーヘッドなしに、高い確率で送信されたデータと同じであることを確認します。
ファイルデータが受信されると、rsyncはデータをファイルに書き込み、カーネルが書き込みに成功したことを示した場合、データは破損せずにディスクに書き込まれたと信頼します。 rsyncはデータを再読み取りせず、追加のチェックとして既知のチェックサムと比較しません。
検証自体については、プロトコル30以降(3.0.0で最初にサポートされました)では、rsyncは MD5 を使用します。古いプロトコルの場合、使用されるチェックサムは MD4 です。
安全な暗号化ハッシュには古くから使われていると考えられていますが、MD5とMD4はファイルの破損をチェックするのに十分です。
ソース:manページとrsyncソースコードを確認して確認する。
rsync
does notローカルファイルコピーのコピー後検証を行います。 rsync
を使用して大きなファイルを低速の(つまりUSB)ドライブにコピーし、cp
を使用して同じファイルをコピーすることで、それが行われないことを確認できます。
_time rsync bigfile /mnt/usb/bigfile
time cp bigfile /mnt/usb/bigfile
_
どちらのコマンドもほぼ同じ時間がかかるため、rsync
はチェックサムを実行できない可能性があります。低速のディスクから宛先ファイルを再度読み取る必要があるためです。
man
ページは、残念ながらこれについて誤解を招きます。これをstrace
でも確認しました。コピーが完了した後、rsync
は宛先ファイルに対してread()
呼び出しを発行しないため、チェックサムを実行できません。もう1つ確認できるのは、iotop
のようなものです。rsync
が読み取りと書き込みを同時に行って(ソースから宛先にコピー)、それから終了します。整合性を検証している場合は、読み取り専用フェーズがあります。
rsync
は、チェックサムの比較を行いますbeforeコピー(場合によっては)、既存のコピーを回避します。チェックサム比較の要点は、コピーが成功したことを確認することではありません。それは、ファイルシステムドライバー、ディスクドライバー、ネットワークドライバーなど、基盤となるインフラストラクチャの仕事です。rsync
などの個々のアプリケーションは、この狂気に煩わされる必要はありません。 rsync
が実行する必要がある(そして実行する!)のは、システムコールの戻り値をチェックして、エラーがないことを確認することだけです。
質問への直接の迅速で汚い答え。
Q:rsync
は、2つのローカルドライブ間でファイルをコピーするときに比較を行いますか? A:何をコピーするかを比較します。
Q:検証を行う場合-安全な賭けですか?または、バイトごとの比較を行う方が良いですか? A:ファイルのMD5チェックサムの背後にある数学と同じくらい安全です。簡単な実験を行って、ツールを学び、信頼することができます。
長い答え:おそらく、ファイルをコピーした後、rsync
でファイル比較(ビットごとまたはチェックサムによる)を実行したいと思います。データの整合性を重視する数少ない企業の1つである場合は、以下が役立つことがあります。
rsync -avh [source] [destination] && rsync -avhc [source] [destination]
rsync
filesフォルダーは初回実行時に問題なく完了した場合、ファイル全体のハッシュを使用して同じファイル名の比較を実行している間、rsync
をすぐに再度実行します。このテストでドライブメディアからファイルを物理的に再度読み取ることを保証するために、このテストを実行する前に、両方のドライブの電源を切り、再起動することをお勧めします。これにより、内部の揮発性キャッシュがクリアされます。
Linuxも再起動しない場合は、少なくとも次のようにしてキャッシュ( * )を削除する必要があります。
Sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
次に、両方のツリーを再度読み取り、それらのチェックサムを比較します。
rsync --dry-run --checksum --itemize-changes --archive SRC DEST
最新のrsyncチェックサムは、128ビットのMD5を使用します。これが個々のファイルのエラーを検出できない可能性は天文学的に低いです(議論 here )が、不可能ではありません。