Skip to content
VDS · バックアップとディスク

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。