rsync を用いたバックアップ
この記事では、ファイルやディレクトリの同期・バックアップに広く使われているコマンドラインツール `rsync` について解説します。`rsync` は、差分転送アルゴリズムにより、変更があった部分のみを効率的に転送する点が特徴です。ここでは、SSH を利用した安全なリモートサーバーへの基本的なバックアップ方法に焦点を当てます。
事前準備
`rsync` を SSH 経由でリモートマシンにバックアップを行うためには、以下の情報を事前に確認・準備しておく必要があります。
- バックアップ先マシンの IP アドレスまたはホスト名 接続対象のサーバーを特定するために必要です。(例: `192.168.1.100`, `backup.example.com`)
- バックアップ先マシンへのログインユーザ名 リモートサーバー上でファイルの書き込み権限を持つユーザーアカウントが必要です。
- バックアップ先マシンでのバックアップ用ディレクトリ バックアップデータを保存するリモートサーバー上の絶対パスまたは相対パスを指定します。(例: `/var/backups/mydata`, `~/backups`)
補足:
- `rsync` を `-e ssh` オプション付きで利用する場合、事前にバックアップ元マシンからバックアップ先マシンへ SSH 公開鍵認証 を設定しておくと、パスワード入力が不要になり、スクリプトによる自動実行が容易になります。セキュリティ向上の観点からも推奨されます。
- バックアップ先ディレクトリに対する書き込み権限が、指定したログインユーザーに付与されていることを確認してください。
基本的なリモートバックアップ手順
転送元パスの末尾スラッシュ(`/`)について
- 転送元パスの末尾に `/` を付けると、そのディレクトリの中身のみが転送先のディレクトリ直下にコピーされます。
- 転送元パスの末尾に `/` を付けないと、そのディレクトリ自体が転送先のディレクトリ内に作成され、その中に内容がコピーされます。
以下のコマンドは、指定したローカルディレクトリの内容を、SSH を経由してリモートマシンの指定ディレクトリに同期(バックアップ)する基本的な例です。
sudo rsync -avz --delete -e ssh <バックアップしたいディレクトリ>/ <ユーザ名>@<IPアドレス>:<バックアップ用のディレクトリ>
コマンド解説:
- `sudo`: コマンドをスーパーユーザー権限で実行します。バックアップ対象ディレクトリへの読み取り権限がない場合や、システム全体のバックアップを行う場合などに必要となることがあります。実行ユーザーが対象ディレクトリへの十分な権限を持っている場合は不要です。
- `rsync`: ファイル同期・バックアップを実行するコマンドです。
- `-a` (archive): パーミッション、所有者、タイムスタンプなどの属性を保持したまま再帰的にコピーします (`-rlptgoD` と同等)。
- `-v` (verbose): 処理中のファイル名など、詳細な情報を表示します。
- `-z` (compress): 転送中にデータを圧縮します。ネットワーク帯域を節約できますが、高速なネットワーク環境ではCPU負荷により逆に遅くなる場合もあります。
- `--delete`: 転送元に存在しないファイルを転送先から削除します。これにより、転送元と転送先が完全に同じ状態(ミラーリング)になります。意図しないファイル削除を防ぐため、使用には十分注意してください。
- `-e ssh`: 転送プロトコルとして SSH を使用します。通信が暗号化され安全です。
- `-n` または `--dry-run`: 実際の転送は行わず、どのようなファイルが転送・削除されるかのシミュレーション結果を表示します。特に `--delete` を使用する前には、このオプションでテスト実行することを強く推奨します。
- `<バックアップしたいディレクトリ>/`: ローカルマシン上のバックアップ対象ディレクトリのパス。末尾の `/` はディレクトリの中身をコピーする意図を示します。(例: `/home/user/data/`, `./project/`)
- `<ユーザ名>`: リモートマシンへのログインに使用するユーザー名。
- `<IPアドレス>`: リモートマシンの IP アドレスまたはホスト名。
- `<バックアップ用のディレクトリ>`: リモートマシン上のバックアップ先ディレクトリのパス。
プレースホルダーについて:
- `< >` で囲まれた部分は、ご自身の環境に合わせて実際の値に置き換えてください。
更新日時が新しいファイルのみバックアップする手順
`find` コマンドと組み合わせることで、特定の条件に一致するファイルのみを `rsync` でバックアップする応用例です。以下のコマンド例は、`/home` ディレクトリ内で過去30日以内に更新されたファイルのみを抽出し、ローカルの `/backup` ディレクトリにバックアップします。
cd /home && find . -mtime -30 -type f -print0 | rsync -avz --delete --files-from=--from0 /home /backup
コマンド解説:
- `cd /home`: まず、カレントディレクトリを `/home` に移動します。
- `&&`: 左のコマンド (`cd`) が成功した場合のみ、右のコマンドを実行します。
- `find . -mtime -30 -type f -print0`: カレントディレクトリ (`.`) 以下から、最終更新日時 (`mtime`) が30日以内 (`-30`) のファイル (`-type f`) を検索し、そのリストをヌル文字区切り (`-print0`) で標準出力に送ります。(ヌル文字区切りはファイル名に特殊文字が含まれる場合に安全です)
- `|`: パイプ。左のコマンド (`find`) の標準出力を、右のコマンド (`rsync`) の標準入力に渡します。
- `rsync -avz --delete --files-from=--from0 /home /backup`:
- `-avz`: 基本的なオプション(前述の通り)。
- `--delete`: 転送元(この場合は `find` でリストアップされたファイル群)に存在しないファイルを転送先 (`/backup`) から削除します。注意: この `--delete` は `/backup` ディレクトリ全体に対して作用するため、`/home` 内の古いファイル(30日以上更新がないファイル)に対応するファイルが `/backup` に存在する場合、それらは削除されます。意図した動作か十分に確認してください。 安全のためには `--dry-run` での事前テストが不可欠です。
- `--files-from=-`: 標準入力からファイルリストを読み込んで、それらのファイルを転送対象とします。
- `--from0`: 標準入力からのファイルリストがヌル文字区切りであることを示します (`find` の `-print0` に対応)。
- `/home`: 転送元ディレクトリの基準パス。`find` が `./...` のように相対パスで出力した場合、`rsync` はこの基準パスからの相対パスとしてファイルを扱います。
- `/backup`: 転送先ディレクトリ。この例ではローカルの `/backup` ディレクトリです。(リモートに送る場合は `<ユーザ名>@<IPアドレス>:<バックアップ用のディレクトリ>` の形式にします)
注意点:
- この例のバックアップ先はローカルの `/backup` ディレクトリです。リモートにバックアップする場合は、転送先を適切に変更してください。
- `find` と `--files-from` を組み合わせる場合、特に `--delete` オプションの挙動は複雑になることがあります。必ず `--dry-run` オプションで意図通りの動作をするか確認してから実行してください。
セキュリティに関する推奨事項:
`rsync` を `-e ssh` で利用する場合、パスワード認証ではなく、より安全な SSH 公開鍵認証 を設定することを強く推奨します。これにより、パスワードの漏洩リスクを低減でき、パスワード入力が不要になるためスクリプトによるバックアップの自動化も容易になります。