rsync によるバックアップ
SSH 経由で別のサーバーにファイルをコピーする設定、ハードリンクによるバージョン履歴の作成、危険な --delete オプションで削除しすぎない方法について説明します。
更新日 2026年8月23日
rsync はコピーを作成する最も簡単で確実な方法です。どこでも利用でき、変更された部分だけを転送し、SSH 経由で動作します。小規模なデータセットならこれで十分です。
基本コマンド
rsync -avz --delete \
-e "ssh -i /root/.ssh/backup_key -p 22" \
/var/www/ backup@backup.example.com:/srv/backup/vds/www/
フラグの内訳:
-a— パーミッション、所有者、タイムスタンプ、リンクを保持します。-v— 実行内容を表示します。-z— 転送中に圧縮します(データ量が多い場合、帯域が 500 Mbps までなら有効です)。--delete— 転送先にある、転送元にもう存在しないものを削除します。
転送元パスの末尾にスラッシュを付けると「ディレクトリの中身」を意味し、付けない場合はディレクトリ自体がコピーされます。
/var/www/と/var/wwwは異なる結果になり、--deleteと組み合わせるとその違いが誤ったものを消してしまいます。必ず最初に--dry-runを付けて実行してください。
rsync -avzn --delete /var/www/ backup@backup.example.com:/srv/backup/vds/www/
-n フラグがドライランです。
パスワードなしのアクセスキー
定期的なコピーには、パスワードを入力せずにログインできる必要があります。
ssh-keygen -t ed25519 -f /root/.ssh/backup_key -N ""
ssh-copy-id -i /root/.ssh/backup_key.pub backup@backup.example.com
転送先では、このキーを単一のコマンドに制限してください。そうすれば、キーが盗まれてもシェルを取得されることはありません。転送先の ~/.ssh/authorized_keys に記述します。
command="rrsync -wo /srv/backup",restrict ssh-ed25519 AAAA... backup
ハードリンクによるバージョン履歴
通常の rsync は現在の状態しか保持しません。昨日削除したファイルに今日気づいても、復元する場所がありません。--link-dest を使えば履歴を残せます。変更のないファイルは再コピーされずリンクされるため、30 世代分のコピーでも 1 世代分とほとんど変わらない容量で済みます。
#!/bin/bash
set -euo pipefail
DEST=/srv/backup/vds
TODAY=$(date +%F)
rsync -a --delete \
--link-dest="$DEST/latest" \
/var/www/ "$DEST/$TODAY/"
ln -sfn "$DEST/$TODAY" "$DEST/latest"
find "$DEST" -maxdepth 1 -type d -mtime +30 -name "20*" -exec rm -rf {} +
スクリプトを夜間にスケジュール実行し、必ずログを記録してください。
除外設定
rsync -avz --exclude-from=/root/backup-exclude.txt / backup@host:/srv/backup/vds/root/
/proc/
/sys/
/dev/
/run/
/tmp/
/var/lib/docker/
/var/cache/
*.log
ルート全体をコピーする必要はほとんどありません。何をバックアップすべきかの記事を参考に、正確なリストを作成するほうが有用です。
rsync が適さない場合
- ストレージの暗号化と重複排除が必要な場合は、Restic を使用してください。
- データが絶えず変化し、整合性が重要な場合は、まずデータベースをダンプし、その結果のファイルを rsync してください。
- 転送先が信頼できない他人のストレージである場合:rsync はファイルをそのまま書き込むため、クライアント側の暗号化は行われません。
よくある間違い
- 誤った転送元パスでの
--delete。 空の転送元ディレクトリは転送先を消去します。ドライランは必須です。 - 同じディスク上へのコピー。 これはバックアップではなく、同じ障害に対する 2 つ目の対象にすぎません。オフサイトコピーを参照してください。
- すでに圧縮されたデータへの圧縮。
-zはアーカイブや画像を遅くするだけです。 - 夜間実行がディスクのボトルネックに達する。 書き込みスループットの上限はティアによって異なります。ディスク速度を参照してください。
--bwlimit=20000とオフピーク時間帯での実行が助けになります。 - 誰も結果を確認しない。 戻り値をログに記録し、監視してください:
rsync ... || echo "backup failed" | mail -s alert you@example.com。