QNAPからLinuxへ rsyncでバックアップをとろう

##はじめに

先日、社内サーバーのバックアップを行ったので、
備忘録としての意味もかねて軽く解説していこうと思います。

内容はタイトルにあるとおりです。サーバーとして利用しているQNAP NASを、rsyncを利用してLinux(CentOS8)に同期し、定期的なバックアップをとることが目標になります。今回、Linuxの基本的な構築は完了しているものとして、rsyncのインストールから同期の完了までの部分を解説していこうと思います。

ちなみに今回バックアップ先として用意したLinuxは、HP社のMicroServer上に構築してあります。


##前提

- 今回LinuxのOSとして使用しているのはCentOS8である
- QNAP, Linuxともに固定IPアドレスが割り当てられている
- QNAP, Linuxは同一ネットワーク上にある


##やってみよう
###rsyncの構築

QNAP NASではバックアップ用のアプリケーションがGUIで搭載されているので、行う作業はほとんどLinux側になります。(指定がない限り基本Linux側での作業として解釈してください)

まずはインストールからしていきましょう。

###Linuxにrsyncをインストール

ここではdnfコマンドを使用していますが、お使いのOSによって変わってくると思います。

```bash:
dnf -y install rsync rsync-daemon
```

###設定ファイルの編集

```bash:
vi /etc/rsyncd.conf
```

開いたrsyncの設定ファイルに、下記を追記します。

```:/etc/rsyncd.conf
pig file = /var/run/rsyncd.pig
log file = /var/log/rsyncd.log
max connections = 4
transfer logging = yes
```

###ブール値の変更、firewallのサービス許可

rsyncのアクセスを許可するようブール値とFirewallの設定を変更します。永続化は必須ではないですが、しない場合は起動のたびに同じ作業を行う必要があるので注意してください。

```bash:
setsebool -P rsync_full_access on　　　　　　　　　//-Pオプションで永続化
firewall-cmd --add-service=rsyncd --permanent　　//permanentで永続化
firewall-cmd --reload
firewall-cmd --list-all　　　　　　　　　　　　　　　//サービスにrsyncdが追加されたことを確認
```

###rsyncの起動

さっそく起動していきましょう。ここではrsyncをデーモンで起動し、ポートの空きとLISTEN状態を確認しています。

```bash:
rsync --daemon --config /etc/rsyncd.conf
grep rsync /etc/services | head　　//rsyncのポートを確認
lsof -i:873　　　　　　　　　　　　　　//rsyncのtcpポート(873番)がLISTENになっていることを確認
ps `cat /var/run/rsyncd.pid`　　　　//rsyncがデーモンで起動していることを確認
systemctl enable rsyncd　　　　　　　//rsyncの自動起動を設定
```

ここまででrsyncのインストールから設定、起動まで完了しました。




##rsyncのテスト

大事なサーバーのバックアップを行う際などは、万が一にも事故が起こらないよう慎重に一つひとつテストを行うことをお勧めします。ここでは2段階に分けてテストを行っていきます。

###Linux内でrsync

まずはLinuxからLinuxへと同期を行います。

Linux内にテスト用のディレクトリを作成。/varの部分には、バックアップ先として使用したいディレクトリを選択してください。

```bash:
mkdir -p /var(任意のパス)/test/origin
mkdir /var(任意のパス)/test/destination
```

作成したディレクトリにテスト用ファイルを作成し、任意の中身を記述

```bash:
vi /var(先ほど設定したパス)/test/origin/test.txt　　//なんでもいいので中身を記述して保存
```

/etc/rsyncd.confファイルにテスト用の記述を追加

```:/etc/rsyncd.conf
[test]
path = /var(先ほど設定した同じパス)/test
hosts allow = "LinuxのIPアドレス"
hosts deny = *
list = true
uid = root
gid = root
read only = false
```

originからdestinationへテスト同期し、成否を確認

```bash:
rsync -avz /var/test/origin/test.txt /var/test/destination
tree /var/test
cat /var/test/destination/test.txt
```

test.txtファイルがdestinationディレクトリに中身ごと複製されていればテスト成功です。

###QNAPからLinuxへ、テストファイルを同期

次にQNAPからLinuxへと同期テストを行います。

/etc/rsyncd.confファイルにテスト用の記述をさらに追加

```:/etc/rsyncd.conf
[test2]
path = /var(先ほど設定した同じパス)/test
hosts allow = "バックアップしたいQNAPのIPアドレス"
hosts deny = *
list = true
uid = root
gid = root
read only = false
```

ここでやっとQNAP NASの出番になります。

QNAPのWeb-UIにログインし、順番に操作を行っていきます。
<img width=158 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643982/c9a01ba7-94b6-98aa-d931-93b353b7e11a.png"><img width=487 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643982/40f0be5f-5107-0717-009e-525be9f451ba.png">

左上にあるメニュータブから[Backup Station]というアプリケーションを選択し、リモートレプリケーションの[Rsync]へと進みます。その後リモートレプリケーションジョブの作成画面へ進み、設定作業を行っていきます。

ジョブの名前は任意です。一目でわかりやすい名前にすると良いと思います。

<img width=487 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643982/666f90ef-edbf-b1ae-949e-4c25d76b55aa.png">

また、リモートサイトの欄には先ほどまで設定をしていたLinuxの情報を設定します。ユーザ名はバックアップ先フォルダの書き換え権限を持つユーザを指定してください。

**ここで、テストの成否を必ず確認しましょう。**
処理自体は数秒で終わるものなので、処理中のまま止まっていたり、失敗となった場合は、ここまでの設定でどこかに異常がある可能性が高いです。

処理が終了し、平均送信時間が表示されたら無事成功です。

ソースフォルダにはバックアップ対象のフォルダを、宛先フォルダにはバックアップ先のフォルダを設定します。

今回はテストなので、ソースには万が一破損しても問題がないフォルダ(**ない場合は別途作成してください**)を指定し、宛先には先ほどパスとして設定したtestフォルダを指定します。

その後任意のオプションを設定し、設定を適用させ同期を開始します。
![スクリーンショット-2020-09-28-16.30.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643982/ca72bae1-1098-6560-35f5-bcf1da3320d8.png)
このようにレプリケーションが開始され、無事完了となれば成功です。(一応Linux側でもtreeコマンドなどで確認をしてください)

##本同期を実行

無事テストが終了し、問題が無ければ本同期に移ります。

QNAPからLinuxへの同期ではデータ全体を一括で設定することができないため、ジョブの作成時に表示されたソースフォルダから一つひとつ個別に同期する形になります。

したがって、Linux側のrsync設定ファイルにもその数だけ記述を増やす必要があります。下記フォーマットを元に名前とpathを編集し、同期対象の数だけ追記してください。

また、宛先フォルダも同じ数だけ作る必要があります。大元となるディレクトリを作成し、宛先フォルダを全て同じディレクトリに格納すると管理が楽です。

```:/etc/rsynd.conf
["任意の名前"]
path = "バックアップの宛先フォルダ"
hosts allow = "バックアップしたいQNAPのIPアドレス"
hosts deny = *
list = true
uid = root
gid = root
read only = false
```

記述し終えたらさっそく同期をしていきましょう。といっても、手順はテストの際とほとんど同じです。
今回はテストではないのでソースフォルダと宛先フォルダを本番用に設定します。

オプションについては任意です。内容は書いてある通りなのでつけたいものをつけたらいいと思います。

今回は、デフォルトでチェックされている
- コピー先のファイルと異なるファイルのみをコピーする
- スパースファイルを効率的に処置する

に加えて、下記2つのオプションにチェックをいれました。
- ファイル圧縮を有効にする
- リモート宛先の余分なファイルを削除する

あとは同期を開始し、レプリケーションが完了となれば無事同期成功となります。テストと同様、Linux側でも成否を確認しておきましょう。

最後に希望のペースでスケジュールを設定し、スケジュールを有効にすることで定期的な自動バックアップができるようになります。(QNAP→LinuxのRsyncでは常時同期に対応していないので最短は1時間おきです)

##最後に

QNAPからQNAPへ、LinuxからQNAPへ、などとQNAPをパックアップ先とした資料はたくさん出てくるのですが、逆を行っている資料はあまり多くないのでなかなか大変でした。

QNAPからLinuxがやりたいんじゃという人のお役に立てればと思います。