rsync を使用して 2つの大きなディレクトリをコピーする場合、最も安全な方法は、2つのコピー元パスを 1 つのコマンドに記述するのではなく、まず各コピー元ディレクトリがどのコピー先ディレクトリに対応するかを明確にしてから、グループごとに実行することです。
|
|
各ディレクトリの組み合わせを、まず--dry-runで確認します。本番コピーでは未完了ファイルを保持してログを記録し、コピー後に読み取り専用の照合を実行します。
通常の照合で出力がない場合は、rsync がファイル サイズ、変更時間、および関連する属性に基づく差異を検出できないことを意味します。ファイルの内容が一貫していることを確認したい場合は、完全読み取り検証用に --checksum を追加します。
そのまま使える安全な同期手順
以下は、コピー元ディスクとコピー先ディスクの両方が正しくマウントされていることを前提としています。
|
|
まず、コピー先ディレクトリを作成します。
|
|
2つのグループの同期を個別にプレビューします。
|
|
コピー元パス、コピー先パス、変更一覧が正しいことを確認したら、-nを外して2つの同期を順番に実行します。
|
|
最初の移行時には --delete を追加しないことをお勧めします。
こうすることで、コピー先ディレクトリに余分なファイルがあっても、rsync はそれらを削除しません。ディレクトリ構造と検証結果を確認したら、コピー先をコピー元の完全なミラーにする必要があるかどうかを決定します。
2組のディレクトリを別々に同期する理由
rsync の最後の位置オプションはコピー先ディレクトリであり、前のオプションはコピー元とみなされます。
この書き方:
|
|
これは、両方のコピー元が同じ /target/ にインポートされることを意味しますが、/source/a/ が /target/a/ に対応し、/source/b/ が /target/b/ に対応することを意味するわけではありません。
2つのコピー元を別々のコピー先へ送る場合は、rsyncを2回実行するか、対応関係を明記した順次実行スクリプトを使います。
個別の操作を実行することには、いくつかの実用的な利点があります。
- 各ディレクトリには独立したログと終了ステータスがあります。
- 一方のグループが失敗しても、もう一方のグループの結果が曖昧になることはありません。
- 検証中にグループごとに相違点を見つけることができます。
- これにより、機械式ハードディスクは連続して読み書きできるようになり、磁気ヘッドをめぐって競合する 2つのタスクが回避されます。
- ディレクトリごとに異なる除外ルールを設定できます。
2つのコピー元を同じコピー先へまとめる場合は、同名の相対パスが含まれていないか先に確認します。
たとえば、2つのコピー元に 2026/report.pdf があり、後で実行されたコピー元が、最初に実行された同じ名前のファイルを上書きする可能性があります。現時点では、個別のサブディレクトリを保持しておいた方が安全です。
コピー前にマウントポイントを確認する
大規模なディレクトリの移行における最も危険な間違いの 1 つは、コピー先ディスクが正常にマウントされていないにもかかわらず、コピー先パスがまだ存在していることです。
このとき、rsync は、システム ディスクがいっぱいになるまで、ルート ファイルシステムの通常のディレクトリにデータを書き込みます。
開始する前に、ブロック デバイス、ファイルシステム、マウントポイントを確認してください。
|
|
確認すべき重要なポイント:
/mnt/disk1および/mnt/disk2は、予期されるデバイスに対応します。- コピー先ディスクには十分な空き領域があります。
- コピー先 マウントは読み取り専用状態ではありません。
- 2つのパスが誤って同じファイルシステムの場所を指すことはありません。
- 宛先パスはコピー元パス内のサブディレクトリではありません。
次のコマンドを使用して、解析された実際のパスを表示できます。
|
|
別の小さな書き込みテストを実行します。
|
|
ここでは、作成したテスト ファイルのみを明示的に削除し、コピー先ディレクトリをクリーンアップするためにワイルドカードを使用しないでください。
末尾のスラッシュでコピー階層が変わる
これら 2つのコマンドの結果は異なります。
|
|
/source/ のコンテンツの最初のコピー:
|
|
2 番目のコピーは、source ディレクトリ自体をコピーします。
|
|
確立された 2つの対応するディレクトリを同期する場合、通常、コピー元パスとコピー先パスの後に / が書き込まれます。
|
|
ディレクトリ名に基づいて結果を推測しないでください。初めて実行する前に、--dry-run --itemize-changes を使用して、作成される相対パスを確認します。
各オプションの役割
基本的なオプションの組み合わせは次のとおりです。
|
|
で:
| オプション | 効果 | 注意事項 |
|---|---|---|
-a |
アーカイブ モード、再帰的、共通プロパティの保持 | すべてのハードリンク、ACL、拡張属性を自動的に保持するという意味ではありません |
-H |
ハードリンク関係を維持する | ハードリンクの数が多いとメモリ消費量が増加します |
-A |
POSIX ACL を保持する | コピー先ファイルシステムは ACL をサポートする必要があります |
-X |
拡張属性を保持する | コピー先ファイルシステムは xattr をサポートする必要があります |
--numeric-ids |
UID および GID 値を直接保持する | Linuxのディスク移行やシステムデータのコピーに最適 |
--partial |
中断後も未完成のファイルを保持する | 次回の実行でも転送を確認して続行します |
--partial-dir=.rsync-partial |
未完成のファイルを専用のディレクトリに置く | 検証が完了する前にディレクトリを手動で削除しないでください。 |
--info=progress2 |
タスク全体の全体的な進行状況を表示します | 統計の合計数は、ファイル リストの生成方法によって異なります。 |
--info=stats2 |
最後に転送統計を表示 | コピー後の独立した検証の代わりにはなりません |
--log-file |
詳細な記録をログに書き込む | ログ ディレクトリは書き込み可能でなければなりません |
通常のドキュメント、写真、ビデオをコピーしていて、コピー元ディレクトリにハードリンク、ACL、または拡張属性がない場合は、必要に応じてオプションを減らすことができます。
オプションが多ければ多いほど安全であると機械的に考えないでください。
たとえば、コピー先が FAT、exFAT、または一部のネットワーク ファイルシステムである場合、権限、所有者、ACL、および xattr が完全に保存されず、-A、-X、または所有者の設定でエラーが報告される場合があります。
まず、両端のファイルシステム タイプを確認します。
|
|
両端の機能が異なる場合は、ファイルの内容と完全な Linux メタデータのどちらを保持する必要があるかを最初に明確にする必要があります。
差分同期でコピーされるもの
デフォルトでは、rsync は主にファイル サイズと変更時間に基づいてファイルを更新する必要があるかどうかを判断します。
同じコマンドを再度実行する場合:
- 新しいファイルがコピーされます。
- サイズまたは変更時間が変更されたファイルは更新されます。
- 変更されていないファイルはスキップされます。
- コピー先固有のファイルは保持されます。
- 中断されたファイルは、現在のステータスに応じて再チェックされ、処理が続行されます。
これが、増分同期が大規模なディレクトリの移行に適している理由です。
ただし、これはファイルシステムのスナップショットではありません。
コピー プロセス中にコピー元ディレクトリが変更され続ける場合、最終的なコピー先には、異なる時点のファイル ステータスが含まれる可能性があります。通常の写真ライブラリまたはアーカイブ ディレクトリは、最初のコピーの後に増分補完を実行できます。データベース、仮想マシン イメージ、および書き込み中のアプリケーション データは、最初にサービスを停止するか、書き込みをフリーズするか、ファイルシステムのスナップショットを使用する必要があります。
dry-runの変更一覧を読む方法
推奨されるdry-runコマンドは次のとおりです。
|
|
-n は、--dry-run の短縮形です。計画を計算するだけであり、ファイルには書き込みません。
--itemize-changes には各変更項目とその理由が表示されます。一般的な出力形式は次のとおりです。
|
|
おおよそ次のように理解できます。
>f+++++++++: ファイルはコピー先に存在しないため、作成されます。>fで始まり、属性タグが続きます。ファイルのコンテンツまたは属性が更新されます。.d: ディレクトリ自体のプロパティを調整する必要があります。*deleting:--deleteと組み合わせると、コピー先の固有のコンテンツが削除されます。
予期しないトップレベルのディレクトリ名がプレビューに表示される場合は、通常、コピー元パスの末尾に / が誤って書き込まれていることが原因です。
ほとんどすべての大きなファイルが再送信されているように見える場合は、両端の時間、ファイルシステムの時間精度、マウント オプション、およびファイルがアプリケーションによって継続的に書き換えられているかどうかを確認する必要があります。
2組のディレクトリを順番に同期するスクリプト
繰り返し実行する必要がある場合は、/usr/local/sbin/sync-two-dirs.sh として保存できます。
|
|
実行権限を与えて実行します。
|
|
スクリプトは set -Eeuo pipefail を使用します。
rsync の最初のセットがゼロ以外のステータスを返した場合、スクリプトは停止し、タスク全体が誤って成功として報告されることはありません。エラーを処理した後に再実行してください。すでに一貫性のあるファイルはスキップされます。
長時間の転送をtmux内で実行する
数テラバイトのデータの場合、これには数時間、場合によっては数日かかる場合があります。常に開いている SSH ウィンドウに依存するのではなく、tmux で実行することをお勧めします。
|
|
セッションに入ったら次を実行します。
|
|
バックグラウンドでセッションを続行するには、Ctrl+b、次に d を押します。
再接続します:
|
|
同時に、別の端末からログを観察できます。
|
|
進行状況を確認します。
|
|
複数の同一のスクリプトを同時に開始しないでください。 2つのタスクが同じ機械的ハード ドライブに書き込む場合、並列コピーは通常、ランダム シーク時間と待機時間を増加させるだけです。
rsyncの終了ステータスとログを確認する
コマンドが終了したら、まず終了ステータスを確認します。
|
|
0 は、この実行でエラーが検出されなかったことを意味しますが、各ファイルの内容が完全に検証されたことを単独で証明することはできません。
一般的なゼロ以外の状態は次のとおりです。
| ステータスコード | 共通する意味 | 加工方向 |
|---|---|---|
11 |
ファイルI/Oエラー | カーネル ログ、ディスク、ファイルシステムのステータスを表示する |
12 |
rsync プロトコル データ フロー エラー | リモート接続、バージョン、ログを確認する |
23 |
一部のファイルは転送されませんでした | 検索権限、欠落ファイル、xattr、および I/O エラー |
24 |
転送中にコピー元ファイルが消えてしまう | プログラムがファイルを移動または削除しているかどうかを確認する |
30 |
データ転送タイムアウト | ネットワーク、SSH、タイムアウトオプションを確認してください |
ログの最後を見てください。
|
|
ターミナルの最後に表示される「合計バイト数」だけを見ないでください。 IO error、Permission denied、failed、または vanished file がログに存在する場合でも、それが検証に影響するかどうかを判断する必要があります。
検証レベル1:dry-runを再実行する
本番コピーした後、次の 2 セットのディレクトリを実行します。
|
|
ここでも -n が使用されているため、--delete はコピー先側の過剰なコンテンツを報告するだけで、実際には削除しません。
出力がない場合は通常、次のことを意味します。
- rsync は追加または更新する必要があるファイルを見つけませんでした。
- 送信元に存在しない追加のパスが宛先に存在することはありません。
- 今回保持する必要がある共通属性に違いはありません。
出力が.rsync-partial/のみの場合は、まず未完了のタスクがないことを確認してください。すべての同期と検証が完了したら、一時ディレクトリをクリーンアップするかどうかを決定します。
出力に *deleting が含まれている場合は、コピー元ディレクトリにないファイルが宛先にあります。まず、これらのファイルを保持する必要があるかどうかを確認し、-n をすぐに削除しないでください。
検証レベル2:チェックサムで内容を比較する
通常のdry-runは、主にサイズと修正時間に依存しており、「サイズと時間が同じで内容が異なる」というまれな状況を排除できません。
厳密な検証を使用できます。
|
|
ここで、-c は --checksum と同等です。
ファイルの内容を両側から読み取り、サイズと変更時間を単に比較するのではなく、チェックサムを計算します。 -n も含まれているため、相違点が見つかった場合、相違点は報告されるだけで修正されず、ファイルは削除されません。
テラバイトのデータに対して -c を実行すると、長い時間がかかり、コピー元ディスクとコピー先ディスクに完全な読み取り負荷が発生する可能性があります。
厳密な検証に適したシナリオは次のとおりです。
- 元のディスクでオーバーリード エラーが発生したか、ディスクが削除されました。
- 不安定なネットワークを介した移行。
- ファイルの内容は非常に重要であるため、他の検証メカニズムはありません。
- 最終的な検証は、コピー元ディスクをオフラインにする前に完了する必要があります。
- コピー先のファイルシステムまたはメモリがサイレント破損を引き起こしている疑いがあります。
ディスクの状態が良好でない場合は、最初に SMART ログとカーネル ログを確認し、検証目的で障害のあるディスクを繰り返し読み込まないでください。
検証レベル3:ファイル数と論理バイト数を比較する
通常のファイルの数を数えます。
|
|
通常のファイルの合計論理サイズの統計:
|
|
-xdev は、ディレクトリにマウントされている他のファイルシステムに入らないことを意味します。
コピー元ディレクトリに元々ネストされたマウントポイントが含まれており、これらの内容もコピーする必要がある場合、-xdev を直接使用することはできず、rsync のマウントポイント処理ポリシーが期待を満たしていることを確認する必要があります。
ファイル数と論理バイト数が等しいということは、補助的な証拠としてのみ使用できますが、パスと内容が一貫していることを 1 つずつ証明することはできません。
スパース ファイル、圧縮、重複排除、ブロック サイズ、ハードリンク、およびファイルシステムのメタデータはすべて、実際に占有される領域に影響を与えるため、du -sh を検証の唯一の基準として使用することはできません。
独立検証用のSHA-256マニフェストを作成する
コンテンツの監査可能なリストを保持したい場合は、各ディレクトリ内の相対パスで SHA-256 を計算できます。
|
|
2 番目のディレクトリセットも同様に処理されます。
|
|
diff には出力がなく、終了ステータスは 0 であり、2つのリストが一貫していることを示しています。
これでも、通常のファイル コンテンツと相対パスのみが検証され、ディレクトリのアクセス許可、ACL、所有者、ハードリンク関係、または拡張属性は検証されません。完全な Linux データ移行は、rsync -aHAXnc の結果と併せて確認する必要があります。
権限、ACL、拡張属性、ハードリンクを検証する
キーファイルの基本属性をランダムにチェックします。
|
|
ACL を確認します。
|
|
拡張属性を確認します。
|
|
ハードリンクされたファイルの i ノードとリンク番号を確認します。
|
|
送信元と宛先の i ノード番号は同じである必要はありませんが、もともとハードリンクのセットに属していた同じ終端内のファイルは i ノードを共有し、正しいリンク数を保持する必要があります。
–deleteを有効にするタイミング
--delete により、コピー先は最終的にコピー元とのミラーリング関係を維持できるようになります。コピー先には存在するがコピー元には存在しないパスは削除されます。
最初に読み取り専用のdry-runを実行します。
|
|
注: --delete-delay も削除セマンティクスを有効にしますが、実際の削除は転送が終了するまで延期されます。
公式ミラーリングの前に、少なくとも次のことを確認してください。
- コピー元とコピー先は逆になりません。
- コピー先のマウントポイントは確かにオンラインです。
- dry-runのすべての
*deletingは期待どおりに機能します。 - コピー先上には、独立して保持する必要があるファイルはありません。
- 復元可能なバックアップがもう 1 つあります。
削除を引き続き確認したい場合は、最初にバックアップ ディレクトリを使用できます。
|
|
バックアップ ディレクトリは十分なスペースのある場所に配置する必要があり、再度同期されるコピー元ディレクトリ ツリーに収まらないようにする必要があります。
ごみ箱と一時ディレクトリを除外する
NAS またはデスクトップ ディスクには、移行する必要のない共通のキャッシュ ディレクトリがいくつかあります。除外ルールは、実際に破棄可能であることを確認した後にのみ追加します。
|
|
'#recycle/' は引用符で囲む必要があります。そうしないと、シェルは # の後の内容をコメントと見なす可能性があります。
本番コマンドと検証コマンドは同じ除外ルールを使用する必要があります。そうでない場合、意図的に無視されたコンテンツは検証中に欠落として報告されます。
多数の除外ルールがある場合は、それらをファイルに保存します。
|
|
次に、次を使用します。
|
|
ディスクとネットワークの負荷を抑える
運用サーバー上の大規模なディレクトリを移行する場合、プロセスの CPU と I/O の優先順位を下げることができます。
|
|
クロスネットワーク伝送でも速度が制限される場合があります。ローカル変数とリモートパスの混同を避けるために、リモート コピー先は絶対パスを直接記述することをお勧めします。
|
|
通常、ローカル ディスクからローカル ディスクへの場合、-z 圧縮は必要ありません。写真、ビデオ、圧縮パッケージもそれ以上圧縮するのが難しく、-z をオンにすると CPU 負荷が増加するだけです。
よくあるエラーと対処方法
Permission denied
まず、コピー元ファイルの読み込みに失敗したか、コピー先ファイルの作成に失敗したか、所有者、ACL、xattrの設定に失敗したかをログで確認します。
|
|
コピー先全体に対して広範な chmod -R 777 を直接実行しないでください。マウント オプション、コピー先ディレクトリの所有者、およびコピー先ファイルシステムの機能を確認する必要があります。
No space left on device
容量と i ノードの両方を確認します。
|
|
df -h にまだ空き容量が表示されている場合でも、小さなファイルが多数あると、最初に i ノードが使い果たされる可能性があります。
Input/output error
カーネルとディスクのステータスを今すぐ表示します。
|
|
/dev/sdX を実際のデバイスに置き換えます。永続的な読み取りエラーが発生した場合は、まず読み取り可能なデータを保護し、障害が発生したディスクへの負荷を高めるためにフルディスク検証を繰り返し実行しないでください。
file has vanished
ステータスコード 24 は通常、コピー元ファイルがスキャン後コピー前に移動または削除されたことを示します。
これがキャッシュ、ログ、ダウンロード ディレクトリで時々発生するのは珍しいことではありません。一貫性が必要な業務ディレクトリの場合は、スナップショットからの書き込みまたはコピーを一時停止し、再実行して、欠落しているファイルが表示されなくなったことを確認する必要があります。
すべてのファイルが再転送される
一般的な理由は次のとおりです。
- コピー先ファイルシステムはコピー元時間の精度を保持できません。
- アプリケーションはファイルをコピーした後、ファイルを書き換えます。
- 異常なコピー元および宛先クロック。
- ファイル属性を変更するマウント方法を使用してください。
- ファイルは、中間プログラムを通じて再エンコードまたは再パッケージ化されます。
まず、--dry-run --itemize-changes を使用して、コンテンツ、サイズ、時間、または権限が更新をトリガーするかどうかを観察します。
最終確認チェックリスト
2つの大きなディレクトリの移行が完了したら、少なくとも次の証拠を保持してください。
- 2つの本番
rsyncコマンドがどちらも0で終了している。 - どちらのログにも未解決のI/O、権限、空き容量エラーがない。
- 通常のdry-runの両方のセットから予期しない出力はありませんでした。
- ミラーリングが必要な場合、
--deleteを使用したドライランでは誤って削除されることはありません。 - コピー元とコピー先で、ファイル数と論理バイトの合計が一致している。
- 重要なデータは
rsync -ncまたは独立した SHA-256 検証を完了します。 - コピー先から重要なファイルを実際に開ける。
- アクセス許可、ACL、xattr、およびハードリンクは、運用要件に従って保持されます。
- 検証が完了する前に、コピー元ディスクがフォーマットまたはオフラインになっていません。
- 可能であれば、コピー先から実際にファイルを復元するテストを行う。
最も実用的な確認コマンドは次のとおりです。
|
|
出力がない場合は、rsync が現在の除外ルールとオプション内でコンテンツ、パス、または関連する属性の違いを見つけられなかったことを意味します。
数TBのデータでは、厳密な検証に時間がかかるのは正常です。コピーコマンドに100%と表示されても、コピー元データをすぐに削除しないでください。コピー完了、検証合格、復元可能性の確認は別々の段階です。
よくある質問
中断後に特別な「再開」コマンドを追加する必要がありますか?
通常は必要ありません。同じ rsync コマンドを再実行するだけです。 --partial --partial-dir=.rsync-partial は不完全なデータを保持し、すでに一貫性のあるファイルはスキップされます。
2つの大きなディレクトリを並行してコピーできますか?
技術的には可能ですが、同じコピー元ディスクまたはコピー先HDDで並列実行すると、通常はスループットが低下します。標準では順番に実行した方が、ログ確認、再試行、検証が容易です。
--progress と --info=progress2 の違いは何ですか?
--progress は現在のファイルの進行状況を表示することを優先しますが、--info=progress2 は転送タスク全体の全体的な進行状況を表示します。通常、非常に大きなディレクトリの方が見やすくなります。
コピー後に両側のdu -shが異なるのはなぜですか?
ファイルシステムのブロック サイズ、スパース ファイル、圧縮、ハードリンク、メタデータ、予約ブロックはすべて、占有率の違いを引き起こす可能性があります。 du だけを見るのではなく、rsync の比較、ファイル リスト、コンテンツの検証を優先してください。
rsync -ncはコピー先のファイルを変更しますか?
しません。 -n はdry-runであり、-c はファイル コンテンツのチェックサムに基づいて差分を判断することのみを必要とします。このコマンドはディスクからの一括読み取りを実行しますが、コピーや削除は実行しません。
検証時にも--deleteを指定する理由は何ですか?
コピー元に存在するファイルのみが比較されるため、コピー先側の余分なパスは見つかりません。 -n と一緒に使用すると、--delete はこれらの追加コンテンツを報告するだけで、実際には削除されません。
コピー元ディレクトリはいつ削除できますか?
少なくとも、2 セットの同期終了ステータスが正常になり、ログに未解決のエラーがなく、厳密な検証に合格し、重要なファイルが正常に開かれるか、コピー先側から復元されるまで待ちます。重要なデータについては、別の独立したバックアップを保持する必要があります。