rsync を用いたバックアップ

この記事では、ファイルやディレクトリの同期・バックアップに使われるコマンドラインツール rsync について解説します。rsync は差分転送により、変更があった部分のみを転送します。ここでは、SSH を利用したリモートサーバーへのバックアップ方法を扱います。

事前準備

rsync で SSH 経由のバックアップを行うには、次の情報を準備します。

SSH 公開鍵認証 を設定しておくと、パスワード入力が不要になり、スクリプトによる自動実行ができます。設定は次のように行います。

# 鍵を作成する(既に鍵がある場合は不要)
ssh-keygen -t ed25519

# 公開鍵をバックアップ先マシンに登録する
ssh-copy-id <ユーザ名>@<IPアドレス>

基本的なリモートバックアップ手順

次のコマンドは、ローカルディレクトリの内容を SSH 経由でリモートマシンのディレクトリに同期します。

sudo rsync -avz --delete -e ssh <バックアップしたいディレクトリ>/ <ユーザ名>@<IPアドレス>:<バックアップ用のディレクトリ>

コマンドの説明:

< > で囲まれた部分は、実際の値に置き換えて実行してください。

転送元パスの末尾のスラッシュ(/)

事前確認(--dry-run)の実行例: 上のコマンドに -n を追加して実行し、転送・削除の対象を確認します。

sudo rsync -avzn --delete -e ssh <バックアップしたいディレクトリ>/ <ユーザ名>@<IPアドレス>:<バックアップ用のディレクトリ>

更新日時が新しいファイルのみバックアップする手順

find コマンドと組み合わせると、条件に一致するファイルのみを転送できます。次の例は、/home の中で過去30日以内に更新されたファイルのみを、ローカルの /backup にコピーします。

cd /home && find . -mtime -30 -type f -print0 | rsync -avz --files-from=- --from0 /home /backup

コマンドの説明:

この手順では --delete を使いません。--files-from で渡すのは更新の新しいファイルのみであり、--delete を併用すると、更新のない古いファイルが転送先から削除されます。転送先には過去の転送結果が蓄積される形になります。

このコマンドも、-n を追加して転送対象を確認してから実行します。

cd /home && find . -mtime -30 -type f -print0 | rsync -avzn --files-from=- --from0 /home /backup