rsyncで世代管理(1)

【概要】
rsyncで世代バックアップを取得するスクリプトです。
シェルスクリプト(bash)で、
CRONに登録することを想定しています。
手動実行も可能です。

バックアップサーバ(リモート)からSSHでバックアップ元にアクセスしてrsyncする想定です。
バックアップサーバ内で世代管理を行います。
※バックアップサーバを使用しない、ローカルでも使用可能です
その場合「DIR_SRC=<バックアップ元ディレクトリフルパス>」となります。

処理の流れとしては下記になります。
◆3世代の例
 ①世代2を世代3にrsync
 ②世代1を世代2にrsync
 ③コピー元を世代1にrsync

【動作確認した環境】
Centos7.9

【前提条件】
・SSHを使用する場合はSSH公開鍵認証でバックアップ元にパスワードなしで接続可能なこと
(下記の【その他】参照)
・SSHを使用する場合は接続元と接続先の両方にrsyncがインストールされていること
(下記の【その他】参照)

【rsyncgen.sh】

#!/bin/bash

# rsync source directory
# / is not required at the end of the directory
# (exsample: DIR_SRC=/root/testsrcdir)
DIR_SRC=<ユーザ>@<IPアドレス>:<バックアップ元ディレクトリフルパス>

# rsync destination directory
# / is not required at the end of the directory
# (exsample: DIR_SRC=/root/testdstdir)
DIR_DST=<バックアップ先ディレクトリフルパス>
# backup generation
BKUP_GEN=<数字>

# variable initialization
NUM=${BKUP_GEN}
NUM_SRC=0
NUM_DST=0
RC=0

# backup generation check
echo "${BKUP_GEN}" | grep -q "^[0-9]\+$"
RC=$?
if [ "${RC}" != "0" ] ; then
  /usr/bin/logger "ERROR:rsync script NUM_SRC variable error: ${BKUP_GEN}"
  exit
fi

# rsync directory check
if [ -z ${DIR_SRC} ] || [ "${DIR_SRC}" = "/" ] ; then
  /usr/bin/logger "ERROR:rsync script DIR_SRC variable error: ${DIR_SRC}"
  exit
fi
if [ -z ${DIR_DST} ] || [ "${DIR_DST}" = "/" ] ; then
  /usr/bin/logger "ERROR:rsync script DIR_DST variable error: ${DIR_DST}"
  exit
fi

# loop for backup generations
for i in $(seq 1 ${BKUP_GEN}) ; do
  # conducted in order from the last generation
  NUM_SRC=$(expr ${NUM} - 1)
  NUM_DST=${NUM}
  
  # rsync directory set
  if [ "${NUM_SRC}" = "0" ] ; then
    SRC=${DIR_SRC}
  else
    SRC="${DIR_DST}/BKUP_GEN_${NUM_SRC}/"
    if [ ! -e ${SRC} ] ; then
      mkdir -p ${SRC}
    fi
  fi
  DST="${DIR_DST}/BKUP_GEN_${NUM_DST}/"
  if [ ! -e ${DST} ] ; then
    mkdir -p ${DST}
  fi
  
  # run rsync
  /usr/bin/rsync -a --delete ${SRC} ${DST}
  RC=$?
  # return code check and logging
  if [ "${RC}" = "0" ] ; then
    /usr/bin/logger "INFO: rsync success ${SRC} ${DST}"
  else
    /usr/bin/logger "ERROR:rsync ${SRC} ${DST} return code: ${RC}"
  fi
  
  # go back generations
  NUM=$(expr ${NUM} - 1)
done

exit

【使用方法】
①viでシェルスクリプト作成
 viエディタでファイルを新規作成して、上記「rsyncgen.sh」の内容を貼り付けます。
 $ vi rsyncgen.sh
 下記を環境にあわせて編集し、保存します。
 ・DIR_SRC=<ユーザ>@<バックアップ元IPアドレス>:<バックアップ元ディレクトリ>
 ・DIR_DST=<バックアップ先ディレクトリ>
 ・BKUP_GEN=<数字>
②パーミッションを変更
 $ chmod 700 rsyncgen.sh
③スクリプトを実行して動作確認
 詳細な動作確認をする場合
 「/usr/bin/bash -x rsyncgen.sh」で実行できます。
 スクリプト実行前に、スクリプトを動作確認用に編集すると安全です。
 rsyncはオプションが多数ありますので、必要に応じてスクリプト処理を変更ください。
  「/usr/bin/rsync -a --delete ${SRC} ${DST}
 →「/usr/bin/rsync -ahvn --delete ${SRC} ${DST}」など。
 (-nはDRY RUNで実際には実行せず動作確認できます)
 通常実行は下記です。
 $ ./rsyncgen.sh
④CRON登録
 「crontab -l」で確認、「crontab -e」で編集します。編集時の操作方法はviのエディタと同じです。
 「<分> <時> <日> <月> <曜日> <シェルスクリプトのフルパス> > /dev/null 2>&1」
 例)
 45 22 * * * /root/backup/rsyncgen.sh > /dev/null 2>&1

【注意点】
※rsyncはフルバックアップを使用しています。rsyncを繰り返しているのでディスクへの負荷は高いです。
※バックアップはバックアップ先ディレクトリ配下の「BKUP_GEN_X」(Xは数字)に格納されます
※loggerコマンドで/var/log/messageにログを出力しています

【その他】
◆rsyncのインストール
 rootユーザにて「yum install rsync」コマンドで可能です。

◆SSH公開鍵接続の設定例
 ・接続元
  ①接続用ユーザでログインまたは「su <ユーザ名>」コマンドでスイッチ
  ②ユーザのホームディレクトリへ移動
   $ cd
  ③鍵確認
   (「id_rsa」、「id_rsa.pub」ファイルが無いこと。ある場合は⑤へ)
   (「.ssh」ディレクトリがない場合はコマンド「mkdir .ssh」→「chmod 700 .ssh」)
   $ ls -l .ssh
  ④鍵作成
   (確認事項は格納ディレクトリとパスワード。全部Enterキー押下でもOKです)
   $ ssh-keygen -t rsa
  ⑤公開鍵id_rsa.pubの内容を表示
   (メモ帳等にコピペして記録)
   $ cat .ssh/id_rsa.pub
  ⑥鍵ファイルのパーミッションを変更
   $ chmod 600 .ssh/id_rsa
   $ chmod 600 .ssh/id_rsa.pub
  
 ・接続先
  ①接続許可ユーザでログインまたはsuでスイッチ
  ②ユーザのホームディレクトリへ移動
   $ cd
  ③鍵確認
   (「.ssh」ディレクトリがない場合はコマンド「mkdir .ssh」→「chmod 700 .ssh」)
   $ ls -l .ssh
  ④鍵接続許可ファイル作成
   (「authorized_keys」ファイルに公開鍵id_rsa.pubの内容を記載。既存で内容がある場合は追記)
   $ vi .ssh/authorized_keys
  ⑤鍵接続許可ファイルのパーミッションを変更
   $ chmod 600 authorized_keys
  
 ・接続元
  ①接続用ユーザでログインまたは「su <ユーザ名>」コマンドでスイッチ
  ②SSH接続
   (初回接続時はknown_hostsファイルに登録するフィンガープリントを確認されるので
   「yes」を入力してEnterキー)
   $ ssh <接続先ユーザ>@<接続先IPアドレス>