本ページでは、Linux 環境における rsync を利用したファイルバックアップ手順について解説する。
本手順では、設定ファイルやアプリケーションデータを対象に、NAS へ日次バックアップを取得し、世代管理および自動実行まで構成する。
rsync は、ファイルの差分のみを転送するバックアップツールである。
主な特徴は以下の通り。
・変更されたファイルのみ転送するため高速
・ネットワーク負荷を抑えられる
・削除されたファイルも同期可能
・バックアップ用途として広く利用される
| 役割 | サーバー名(仮称) | 備考 |
|---|---|---|
| Webサーバー | WEB-SRV01 | バックアップ実行元 |
| 監視サーバー | MON-SRV01 | 管理用途 |
| NAS | NAS01 | バックアップ保存先 |
rsync -av --delete /var/www/ /mnt/backup/WEB-SRV01/
rsync を利用して、バックアップ元(/var/www)からバックアップ先へファイルを同期する。
変更があったファイルのみ転送されるため、効率的にバックアップを取得できる。
・/var/www/
バックアップ対象ディレクトリ(転送元)
・/mnt/backup/WEB-SRV01/
バックアップ保存先(転送先)
※ 末尾の「/」の有無で挙動が変わる点に注意
rsync -av /var/www /backup/
→ www ディレクトリごとコピーされる
rsync -av /var/www/ /backup/
→ www 配下の中身のみコピーされる
以下の属性を保持してコピーする。
・-r(再帰コピー)
・-l(シンボリックリンク保持)
・-p(パーミッション保持)
・-t(タイムスタンプ保持)
・-g(グループ保持)
・-o(所有者保持)
バックアップ用途では必須のオプション。
処理内容を詳細に表示する。
ログ出力時やトラブルシュート時に有効。
転送時にデータを圧縮する。
ネットワーク越し(SSH 等)で使用すると転送量を削減できる。
転送元で削除されたファイルを、転送先でも削除する。
これにより、バックアップ先を常に最新状態に保つことができる。
実際にはコピーを行わず、差分のみ確認する。
本番実行前の確認として使用する。
転送状況(進捗)を表示する。
大容量ファイルの転送時に有効。
特定のファイルやディレクトリを除外する。
rsync -av --exclude="/tmp" /var/www/ /backup/
ログや一時ファイルを除外する場合に使用する。
--delete を使用すると、転送先のファイルが削除されるため、
誤ったパス指定を行うとデータ消失のリスクがある。
実運用では、事前に以下を確認すること。
・転送元パスの確認
・転送先パスの確認
・テスト実行(--dry-run の利用)
rsync -av --delete --dry-run /var/www/ /mnt/backup/WEB-SRV01/
実際にはコピーを行わず、差分のみ確認できる。
dnf install -y nfs-utils
mkdir -p /mnt/backup
mount -t nfs -o vers=4.1 192.0.2.10:/backup /mnt/backup
192.0.2.10:/backup /mnt/backup nfs defaults,_netdev 0 0
本手順では、以下のディレクトリをバックアップ対象とする。
・/etc
・/var/www
・/var/lib
・/opt
・/home
バックアップは日付ディレクトリ単位で保存する。
/mnt/backup/WEB-SRV01/file/20260319/etc
/mnt/backup/WEB-SRV01/file/20260319/var/www
/mnt/backup/WEB-SRV01/file/20260319/var/lib
/mnt/backup/WEB-SRV01/file/20260319/opt
/mnt/backup/WEB-SRV01/file/20260319/home
vi /usr/local/bin/rsync_backup.sh
BACKUP_DATE=$(date +%Y%m%d)
現在日付(YYYYMMDD形式)を取得し、バックアップディレクトリ名として利用する。
BASE_DIR="/mnt/backup/WEB-SRV01/file/${BACKUP_DATE}"
バックアップの保存先を定義する。
日付単位でディレクトリを分けることで世代管理を行う。
LOG_FILE="/var/log/rsync_backup.log"
バックアップ処理の実行ログを保存するファイルを指定する。
RETENTION_DAYS=7
バックアップの保存期間(日数)を指定する。
echo "[$(date '+%Y-%m-%d %H:%M:%S')] backup start" >> "${LOG_FILE}"
バックアップ開始時刻をログに記録する。
mkdir -p "${BASE_DIR}/var"
mkdir -p "${BASE_DIR}/opt"
mkdir -p "${BASE_DIR}/home"
バックアップ保存用のディレクトリを作成する。
rsync -av /etc "${BASE_DIR}/"
rsync -av /var/www "${BASE_DIR}/var/"
rsync -av /var/lib "${BASE_DIR}/var/"
rsync -av /opt "${BASE_DIR}/"
rsync -av /home "${BASE_DIR}/"
各ディレクトリをバックアップ先へコピーする。
差分のみ転送されるため効率的にバックアップが可能である。
find /mnt/backup/WEB-SRV01/file \
-maxdepth 1 -mindepth 1 -type d -mtime +${RETENTION_DAYS} \
-exec rm -rf {} \;
指定した日数を超えたバックアップディレクトリを削除する。
echo "[$(date '+%Y-%m-%d %H:%M:%S')] backup end" >> "${LOG_FILE}"
バックアップ終了時刻をログに記録する。
#!/bin/bash
BACKUP_DATE=$(date +%Y%m%d)
BASE_DIR="/mnt/backup/WEB-SRV01/file/${BACKUP_DATE}"
LOG_FILE="/var/log/rsync_backup.log"
RETENTION_DAYS=7
echo "[$(date '+%Y-%m-%d %H:%M:%S')] backup start" >> "${LOG_FILE}"
mkdir -p "${BASE_DIR}/var"
mkdir -p "${BASE_DIR}/opt"
mkdir -p "${BASE_DIR}/home"
rsync -av /etc "${BASE_DIR}/" >> "${LOG_FILE}" 2>&1
rsync -av /var/www "${BASE_DIR}/var/" >> "${LOG_FILE}" 2>&1
rsync -av /var/lib "${BASE_DIR}/var/" >> "${LOG_FILE}" 2>&1
rsync -av /opt "${BASE_DIR}/" >> "${LOG_FILE}" 2>&1
rsync -av /home "${BASE_DIR}/" >> "${LOG_FILE}" 2>&1
find /mnt/backup/WEB-SRV01/file -maxdepth 1 -mindepth 1 -type d -mtime +${RETENTION_DAYS} -exec rm -rf {} \; >> "${LOG_FILE}" 2>&1
echo "[$(date '+%Y-%m-%d %H:%M:%S')] backup end" >> "${LOG_FILE}"
crontab -e
# --------------------------------------------------------------------
# rsync バックアップ(毎日 02:00)
# /etc /var/www /var/lib /opt /home を NAS にバックアップ
# 世代管理(7日)を実施
# ログは /var/log/rsync_backup.log に出力
# --------------------------------------------------------------------
0 2 * * * /usr/local/bin/rsync_backup.sh > /dev/null 2>&1
tail -n 20 /var/log/rsync_backup.log
・rsync による差分バックアップを実装
・日付単位で世代管理
・cron による自動化
・ログによる実行確認