FreeBSD/cpdup
cpdup は、FreeBSD環境において、ファイルシステムを正確にミラーリングするための強力なコマンドラインユーティリティです。本ハンドブックでは、その基本的な使い方から、より高度なオプションまでを解説します。
cpdup の概要
[編集]cpdup は、指定されたソースディレクトリの内容を、宛先ディレクトリに完全にコピーします。単にファイルをコピーするだけでなく、以下の点もミラーリングします。
- タイムスタンプ (UTimes)
- ハードリンク
- シンボリックリンク
- デバイスファイル
- パーミッション
- フラグ
また、宛先ディレクトリに不要なファイルやディレクトリが存在する場合は、デフォルトで削除の確認を求め、ソースと宛先のファイルサイズと更新日時が一致する場合は、再コピーをスキップします。
基本的な使い方
[編集]最も基本的な cpdup の使い方は以下の通りです。
cpdup source_dir target_dir
これにより、sourcedir の内容が targetdir にミラーリングされます。宛先ディレクトリが存在しない場合は作成されます。
例: ローカルディレクトリのミラーリング
[編集]cpdup /usr/local/etc /backup/etc
このコマンドは、/usr/local/etc ディレクトリの内容を /backup/etc ディレクトリにミラーリングします。
主要なオプション
[編集]cpdup には、さまざまな状況に対応するための豊富なオプションが用意されています。以下に主要なオプションとその説明を示します。
-v[v[v]]: 詳細表示モード。-v: 宛先への変更のみを表示します。-vv: ディレクトリのトラバースと宛先への変更を表示します。-vvv: 全てのファイルとディレクトリの処理を表示します。
-n: ドライランモード。実際には何も変更せず、実行内容のプレビューを行います。-u:-vおよび-dの出力をバッファリングしません。パイプ処理時に便利です。-I: 処理終了時にパフォーマンスカウンタの概要を表示します。-f: 強制アップデート。ファイルが同一に見えても強制的にコピーします。-Hオプションと併用すると、ハードリンクパスのファイルとソースファイルをバイト単位で比較します。-i0: 削除時の確認を求めません。注意して使用してください。-o: 上書き/追加のみを行い、削除は行いません。-m: 各ディレクトリに.MD5.CHECKSUMSファイルを作成・維持し、宛先ファイルが同一に見えてもMD5チェックを行い、不一致があれば再コピーします。宛先ディレクトリを指定しない場合は、ソース内の全ファイルのMD5チェックファイルを強制的に再生成します。-M file:-mと同様ですが、MD5チェックファイル名を指定できます。-H path: 指定したパスにあるファイルがソースファイルと同一の場合、コピーせずに宛先へのハードリンクを作成します。増分バックアップなどに利用できます。- 警告:
-Hオプションを使用すると、cpdupは処理中に遭遇した全てのファイルのパスを記録するため、大量のメモリを消費する可能性があります。
- 警告:
-V: ファイルが同一に見えても内容を検証します。-fと異なり、内容が同一であれば再書き込みを避けます。-VV:-Vと同様ですが、更新日時 (mtime) を無視して比較します。HAMMERファイルシステムのマスタースレーブ比較や、mtimeが保持されないコピーの比較に適しています。-x: ソースディレクトリにある.cpignoreファイルに記述されたパターンに一致するファイルを無視します。.cpignoreファイル自体もコピーされません。-X file:-xと同様ですが、無視するファイル名を指定できます。絶対パスを指定した場合、コマンド実行ホストから排他ファイルが読み込まれ、フルパスやワイルドカードで指定できます。相対パス(または-x指定時)の場合、ソースホスト上のそのディレクトリにある排他ファイルのみが適用され、パス要素のみが照合されます。-C: ソースまたはターゲットがリモートホストの場合、ssh接続を圧縮します (-F -Cと同じ)。-F ssh-arg:sshコマンドにssh-argを渡します。例:-F -p222。-s0: デフォルトで有効な、宛先ディレクトリをファイルで置き換えるのを防ぐ安全機能を無効にします。誤操作によるデータ損失を防ぐための機能ですので、注意して使用してください。-j0: CHR (キャラクタデバイス) または BLK (ブロックデバイス) デバイスの再作成を試みません。-l: 詳細出力の行バッファリングを行います。-q: 静粛モード。エラーメッセージ以外は何も表示しません。-S: スレーブモードでcpdupを起動します。リモートマシンでのスレーブプロトコル開始に使用され、通常は人間が直接使用しません。-R: スレーブを読み取り専用モードにします。ソースがリモートの場合のみ使用可能で、SSHキーによる無人バックアップに便利です。
リモートコピー
[編集]cpdup は、異なるマシン間でのディレクトリ構造のミラーリングや、第三者的なコピーもサポートしています。異なるバイトオーダーのマシン間でも動作します。リモートマシンとの通信には ssh(1) が使用され、リモートマシンでは cpdup がスレーブモードで実行されます。
リモートパスの指定構文は scp(1) と同様です。[user@]host:path の形式を使用します。ローカルパスにコロンが含まれる場合は、誤ってリモートホストと認識されないように、前にスラッシュ (/) を付ける必要があります (./foo:bar)。
localhost: プレフィックスもサポートされており、これは無視されますが、パス内のコロンが誤ってホスト名として解釈されるのを防ぎます。
例: リモートディレクトリのミラーリング
[編集]cpdup /local/data user@remotehost:/remote/backup
このコマンドは、ローカルの /local/data ディレクトリの内容を、リモートホスト remotehost の /remote/backup ディレクトリにミラーリングします。
cpdup user1@host1:/source/data user2@host2:/target/backup
このコマンドは、host1 の /source/data ディレクトリの内容を、host2 の /target/backup ディレクトリにミラーリングします(第三者コピー)。この場合、cpdup はローカルマシンから両方のホストへの ssh 接続を確立します。
注意点とベストプラクティス
[編集]-i0および-s0オプションの利用: これらのオプションは、確認なしの削除やディレクトリの上書きを許可するため、使用する際は十分な注意が必要です。誤った使用はデータ損失につながる可能性があります。-Hオプションのメモリ消費: 大規模なファイルシステムで-Hオプションを使用すると、cpdupが全てのファイルパスを記録するために大量のメモリを消費する可能性があります。メモリ不足によるエラーに注意してください。- スパースファイルの扱い: スパースファイル(「穴」のあるファイル)をコピーすると、宛先ファイルでは穴が埋められ、ディスク容量をより多く消費する可能性があります。
- リモートコピーの効率: リモートファイルへの書き込みに関して、スレーブプロトコルは読み込みほど効率的ではありません。リモートコピーを行う際は、ターゲットマシン上で
cpdupを実行し、ソースマシンをリモートとして指定することを推奨します。
終了ステータス
[編集]cpdup は、成功した場合は 0 を、エラーが発生した場合は 0 より大きい値を返します。
関連コマンド
[編集]cp(1): ファイルやディレクトリのコピーcpio(1): アーカイブユーティリティscp(1): SSH を使用した安全なファイルコピーssh(1): SSH クライアントtar(1): アーカイブユーティリティ
歴史
[編集]cpdup コマンドは、1997年頃に BEST Internet でサーバーを更新するために作成され、1999年に FreeBSD の ports 領域に組み込まれました。Matthew Dillon、Dima Ruban によって書かれ、後に Oliver Fromme によって大幅に改良されました。
バグ
[編集]- UFS(5) ファイルシステムには、32767 のハードリンク制限があります。CVS など、多くのプログラムは大量のハードリンクを生成するため、
-Hオプションを使用しても、cpdupがこれらのハードリンクを維持できない場合があります。この場合、リンクの代わりにファイルのコピーが行われ、完全なファイルシステムのコピーが作成できない可能性があります。