eastpoint

システムバックアップ

linuxサーバからNASへのシステムバックアップの方法を整理しておく。

作成日:2022年4月17日

システム構成

サーバ
NAS
ルータ

ネットワーク構成

blockdiag dmz 192.168.1.x/24 internal 192.168.10.x/24 192.168.1.5 server 192.168.1.2 192.168.10.1 rooter 192.168.10.200 NAS

要件

  • サーバのシステムバックアップを1日1回、NASに保存する。

  • バックアップはrsyncを用いてミラーリング+差分バックアップ方式とする。

  • 差分バックアップは1週間程度保存する。

手順1(NAS)

  1. NASにてrsyncを有効にする。

NASとして使用しているTerraMasterは出荷時の状態ではrsyncdが起動していないのでrsyncdを有効にする。

TerraMasterのデスクトップにログインし、コントロールパネル>ファイルサービス>Rsyncサーバを選択する。

Rsyncサーバ設定画面
  • 「Rsyncサーバを有効にする」にチェックを入れる。

  • ポート番号はデフォルトの873のままではなく10873に変更する。

  • rsyncdに接続するユーザ名、パスワードを設定する。

  • 権限のあるディレクトリに/publicを追加する。(public配下にバックアップを取りたいので)

  1. バックアップ保存先のディレクトリを作る。

public配下にバックアップ保存先のディレクトリとしてdell.backupを作成し、その配下にミラーリングデータの保存用にbackup-latestディレクトリを差分データの保存用にbackup-historyディレクトリを作成する。ディレクトリはrootオーナで作成するがTerraMasterのファイルマネージャで操作出来るように属性は777にしておく。

root@TNAS-018638:# mkdir /mnt/public/dell.backup
root@TNAS-018638:# mkdir /mnt/public/dell.backup/backup-latest
root@TNAS-018638:# mkdir /mnt/public/dell.backup/backup-history
root@TNAS-018638:# chmod 777 /mnt/public/dell.backup/backup-latest
root@TNAS-018638:# chmod 777 /mnt/public/dell.backup/backup-history

手順2(ルータ)

  1. サーバからNASへのrsyncが行えるように、ポートマッピングの設定を行う。

Aterm(ルータ)のクイック設定Web画面にログインし、詳細設定の「ポートマッピング設定」画面を開き、「追加」ボタンからポートマッピングを追加する。

ポートマッピング設定画面
  • 優先度は1としておく。

  • LAN側ホストにNASのIPアドレス192.168.10.200を設定する。

  • プロトコルはTCPのまま。

  • ポート番号にNASで設定したrsyncのポート番号10873を設定する。

  1. サーバからNASへの疎通確認をする

サーバから10873で接続できるか確認をする。 (192.168.1.2はNAT変換されたNASのIPアドレスです。)

$ telnet 192.168.1.2 10873
Trying 192.168.1.20...
Connected to 192.168.1.2.
Escape character is '^]'.
@RSYNCD: 31.0

rsyncdに接続できたので、^]を入力して切断する。

手順3(サーバ)

  1. バックアップスクリプトの作成

バックアップはsudoでrsyncを実行する必要があり、cronから起動することを想定しているため事前にsudoersにてrsyncをパスワード無しで実行できるようにしておくこと。

バックアップスクリプトは下記の通り。

fullbackup.sh:

$ cat /home/hoge/bin/fullbackup.sh
#!/bin/bash -x

# システムバックアップを行う

RSYNC_SERVER="192.168.1.2"
RSYNC_PORT="10873"
RSYNC_USER="hoge"
export RSYNC_PASSWORD="hogehoge"

DEST_DIR="rsync://$RSYNC_USER@$RSYNC_SERVER:$RSYNC_PORT/public/dell.backup/backup-latest"
BACKUP_DIR="/dell.backup/backup-history/$(date +%Y%m%d-%H%M%S)"
LOGFILE="/var/log/rsync.log"

# dry run option : -n

sudo -E rsync -avh -s -H \
--log-file="$LOGFILE" \
--delete --backup --backup-dir="$BACKUP_DIR" \
--exclude='dev' --exclude='proc' --exclude='sys' --exclude='tmp' \
--exclude='run' --exclude='mnt' --exclude='media' --exclude='lost+found' \
--exclude='swap.img' --exclude='var/log' \
/ \
"$DEST_DIR"

オプション

-a(--archive)

転送元のディレクトリを再帰的にオーナー・グループ・パーミッション・タイムスタンプをそのままコピーする。 (-rlptgoD オプションと同義)

-v(--verbose)

転送情報を詳しく表示する。

-h(--human-readable)

ファイルサイズの表記をbytesをKやMなど人が見て見やすい単位で出力する。

-s(--protect-args)

ファイル名にスペースや特殊文字があってもそのままコピーする。

-H(--hard-links)

ハードリンクを維持する。

--log-file="$LOGFILE"

ログを$LOGFILEに出力する

--delete

削除したファイルを差分バックアップする

--backup

差分バックアップを行う。

--backup-dir="$BACKUP_DIR"

差分バックアップを$BACKUP_DIRに保存する。

--exclude='xxxx'

xxxをバックアップから除外する。

以下を除外しています。 /dev /proc /sys /tmp /run /mnt /media /lost+found /swap.img /var/log

注釈

バックアップ先のディレクトリはNASの /mnt/public/dell.backup/backup-latestなのですが

DEST_DIR="rsync://$RSYNC_USER@$RSYNC_SERVER:$RSYNC_PORT/public/dell.backup/backup-latest"

と指定すると目的のディレクトリにバックアップしてくれます。

差分バックアップはNASの /mnt/public/dell.backup/backup-historyに残したいので、相対パスで

BACKUP_DIR="../backup-history/$(date +%Y%m%d-%H%M%S)"

と書くと、何故か

/mnt/public/dell.backup/backup-latest/backup-history/$(date +%Y%m%d-%H%M%S)

に作成されてしまう。相対パスを../../としても同じ。。。。ならばと、絶対パスで

BACKUP_DIR="/mnt/public/dell.backup/backup-history/$(date +%Y%m%d-%H%M%S)"

とすると、これまた何故か

/mnt/public/mnt/public/dell.backup/backup-latest/backup-history/$(date +%Y%m%d-%H%M%S)

何故か"/mnt/public"が親ディレクトリに補完されてしまう。理由はよく分かりませんが、

BACKUP_DIR="/dell.backup/backup-history/$(date +%Y%m%d-%H%M%S)"

とすることで、ちょうどいいディレクトリになるみたい。なんなん?

ちなみに、rsyncのバージョンは下記の通り:

$ rsync --version
rsync  version 3.1.3  protocol version 31
Copyright (C) 1996-2018 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
append, ACLs, xattrs, iconv, symtimes, prealloc

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.
  1. バックアップスクリプトのcronへの登録

$ crontab -u hoge -l
# system backup
05 0 * * * /home/hoge/bin/fullbackup.sh

手順4(NAS)

差分バックアップが日々増加するため1週間まえのものを自動で削除するようにする。

  1. TerraMaster(NAS)にはpython2が入っていたのでpython2でスクリプトを作成する。

削除スクリプトは下記の通り:

root@TNAS-018638:# cat /mnt/public/dell.backup/clean_history.sh
#!/usr/bin/python

import os
import shutil
import datetime
import syslog

TARGET_DIR = '/mnt/public/dell.backup/backup-history'

now = datetime.datetime.now()

# delete past 1 week
tgtdt = now - datetime.timedelta(weeks=1)

syslog.syslog(syslog.LOG_INFO,
        'delete directory older than {}.'.format(
                tgtdt.strftime('%Y-%m-%d %H:%M:%S')))

for dir in os.listdir(TARGET_DIR):
        tgt = TARGET_DIR+ '/' + dir
        timestamp = os.path.getmtime(tgt)
        dir_time = datetime.datetime.fromtimestamp(timestamp)
        if dir_time < tgtdt:
                shutil.rmtree(tgt)
                syslog.syslog(syslog.LOG_INFO, 'delete {}'.format(tgt))
  1. NASのcronに登録する。

root@TNAS-018638:/mnt/public/dell.backup# crontab -u root -l
# delete rsync backup file
30 0 * * * /mnt/public/dell.backup/clean_history.sh