【ShellScript】rsyncコマンドを使用したバックアップシェルスクリプトを紹介！！

# 1 はじめに
Linuxにおいてバックアップの方法は多々あります。
有名所だと、dump, dd, rsync等です。どれも使い勝手の良い便利なコマンドになります。
本記事では、その中でもオプションが豊富で様々なケースで使用できるrsync（アールシンク）コマンドを使用した指定ディレクトリのバックアップを行うシェルスクリプトを作成しましたので、使い方と一緒に紹介させていただきます。
# 2 概要
<b>● 概要</b>
Linuxで、指定のディレクトリのバックアップを行うシェルスクリプトを作成する。
また、日次でスクリプトを実行することを想定し、差分バックアップ（ミラーリング）が可能なrsyncコマンドを使用する。

<b>● 機能要件</b>
・バックアップ方法はミラーリングを採用する
・コマンドの実行ログは別途ログファイルに出力する

<b>● 実行環境</b>
Linux OS
#3 rsyncについて
UNIXシステムにおける、差分符号化を使ってデータ転送量を最小化し、遠隔地間のファイルやディレクトリの同期を行うアプリケーションソフトウェアの1つです。
<b>「変更があった分だけ更新する」</b>という機能があるので、ディレクトリ単位のバックアップで特に便利に使えます。

## 3.1 rsyncコマンドの構文
<b>● rsyncコマンドの書式</b>

```:rsyncコマンドの書式
rsync [オプション] [同期元] [同期先]
```

<b>● rsyncコマンドのオプション</b>

|短いオプション |長いオプション |説明 |
|:---------------:|:---------------:|:---------------|
|	-a	|	--archive	|	-rlptgoD と同じ	|
|	-r	|	--recursive	|	指定ディレクトリ配下をすべて対象とする	|
|	-l	|	--links	|	シンボリックリンクをそのままシンボリックリンクとしてコピー	|
|	-p	|	--perms	|	パーミッションをそのままコピー	|
|	-t	|	--times	|	タイムスタンプをそのままコピー	|
|	-g	|	--group	|	グループをそのままコピー	|
|	-o	|	--owner	|	ファイル所有者をそのままコピー (root のみ有効)	|
|	-D	|		|	--devices --specials と同じ	|
|		|	--devices	|	ブロックデバイスをコピー (root のみ有効)	|
|		|	--specials	|	名前付きパイプや FIFO などの特殊ファイルをコピー	|
|	-H	|	--hard-links	|	ハードリンクをそのまま反映	|
|	-h	|	--human-readable	|	ファイルサイズのbytesをKやMで出力	|
|	-v	|	--verbose	|	コピーしたファイル名やバイト数などの転送情報を出力	|
|	-z	|	--compress	|	データ転送時に圧縮	|
|		|	--compress-level=NUM	|	NUMがゼロでない場合 --compress オプションが暗黙的に指定される	|
|		|	--skip-compress=LIST	|		|
|	-c	|	--checksum	|	タイムスタンプとファイルサイズではなくチェックサムで差分を確認	|
|	-u	|	--update	|	転送先に既にファイルが存在し、転送先のタイムスタンプの方が新しい場合は転送しない	|
|	-n	|	--dry-run	|	コピーや転送を実際には行わず転送内容のみ出力	|
|		|	--delete	|	転送元に存在しないファイルは削除	|
|		|	--exclude=PATTERN	|	同期から除外	|
#4 スクリプトの紹介
本スクリプトは以下GitHubにも記載していますのでそちらでもご確認ください。
https://github.com/chibiharu/ShellScript-Tools/tree/master/RsyncBackup

## 4.1 使用方法

<b>① バックアップ対象リストの作成</b>
バックアップ対象ディレクトリ、ファイルを登録したバックアップ対象リストを作成します。

```:バックアップリストの作成
# バックアップ対象リストに/homeディレクトリを追加
$ echo "/home" >> BK_Target.conf
# バックアップ対象リストに/var/logディレクトリを追加
$ echo "/var/log" >> BK_Target.conf
```

<b>② スクリプトの作成</b>
バックアップリストと同じディレクトリにスクリプトを作成します。

```:スクリプトの作成
# スクリプトを生成
$ touch rsync_backup.sh
# スクリプトに使用権限を付与
$ chmod 777 rsync_backup.sh
```
<b>③ コードの貼り付け</b>
スクリプトをvimで開き、<項番4-2>のスクリプトコードを貼り付けます。

```:コードの貼り付け
$ vim rsync_backup.sh
$ cat rsync_backup.sh
<項番3-2>のスクリプトコード>
```

## 4.2 スクリプト
以下、本スクリプトになります。

```:rsync_backup.sh
#####################################################################
#
# <スクリプト名>
# Rsyncコマンドを使用したバックアップスクリプト
#
# <概要>
# 指定ディレクトリを他のディレクトリへコピー(ミラーリング)する
#
# <使用方法>
# 1：BK_Target.confを本スクリプトを同ディレクトリに作成し、同期元ディレクトリ名
#    をconfに追記する
# 2：本スクリプトの[BK_TARGET_TO]を指定し、スクリプトを実行する
#
# <更新履歴>
# 20211012 - 新規作成
#
#####################################################################
#!/bin/bash


#####################################################################
## 事前設定
#####################################################################

# 日時取得(yyyymmdd)
data=`date "+%Y%m%d"`


#####################################################################
## パラメーター設定　※修正箇所
#####################################################################

# バックアップ先ディレクトリ
BK_TARGET_TO=<バックアップ先ディレクトリのフルパスを指定>

# ログファイル
LOGFILE="/var/log/rsync/rsync_${data}.log"

# ログディレクトリ
LOGDIR="/var/log/rsync"

######################################################################
## 必要リソースの生成
######################################################################

# ログディレクトリの生成
if [ ! -d $LOGDIR ]; then
    sudo mkdir ${LOGDIR}
fi

# ログファイルの生成
if [ ! -e $LOGFILE ]; then
    sudo touch ${LOGFILE}
fi

# 設定ファイルの存在確認
if [ ! -e BK_Target.conf ]; then
    echo "[Error] not found error - <設定ファイルが見つかりません>" | sudo tee -a ${LOGFILE}
    echo "処理を中断します" | sudo tee -a ${LOGFILE}
    Exit
fi


#####################################################################
## 実行前処理
#####################################################################

# ログ出力日時のフォーマットを yyyy/mm/dd hh:mm:ss に設定する
start_time=$(date '+%Y/%m/%d %T')

# ログ見出し出力
echo "##### $start_time Start rsync backup #####" | sudo tee -a ${LOGFILE}


#####################################################################
## バックアップ処理
#####################################################################

### バックアップ処理 ###
# 設定ファイルの読み込み
while read line
do
  # 読み込んだ設定ファイルの値を変数に代入
  VAL=`eval echo $line | awk '{print $1}'`
  # 読み込んだディレクトリが存在するのか確認
  if [ ! -e $VAL ]; then
    echo "[Error] not found error - <${VAL}が見つかりません>" | sudo tee -a ${LOGFILE}
    echo "処理を中断します" | sudo tee -a ${LOGFILE}
    Exit
  fi
  # 読み込んだディレクトリのミラーリング処理を行う
  rsync --progress -av --delete ${VAL} ${BK_TARGET_TO} | sudo tee -a ${LOGFILE}
  # 終了コードを取得
  CODE=$?
  # ${CODE}が0(正常終了)でない場合の処理
  if [ $CODE -ne 0 ]; then
    echo "[Error] script filed - <${VAL}のバックアップが失敗しました>" | sudo tee -a ${LOGFILE}
    echo "処理を中断します" | sudo tee -a ${LOGFILE}
    exit 1
  fi
done < BK_Target.conf


######################################################################
## 実行後処理
######################################################################

# ログ出力日時のフォーマットを yyyy/mm/dd hh:mm:ss に設定する
end_time=$(date '+%Y/%m/%d %T')

# ログ見出し出力
echo "###### $end_time End rsync backup ######" | sudo tee -a ${LOGFILE}
```