DebianからQNAPにSSH経由でrsyncを使ってバックアップする

Linux

はじめに

Linux(Debian)からQNAPにSSH経由でrsyncを使ってバックアップを行うメモです。

未解決

共有ディレクトリ(/backup)に対してadministrator権限のユーザに読み書きのアクセス権を与えましたが、以下のエラーが出ました。
administrator権限のユーザのホームディレクトリにはバックアップできるので、何かが足りないと思われます。

rsync: mkdir "/backup" failed: Permission denied (13)

環境

- Debian 12 bookworm
  - rsync 3.2.7-1
  - ssh-keygen
    - OpenSSH_9.2p1 Debian-2+deb12u2, OpenSSL 3.0.11 19 Sep 2023

- QNAP TS-873A / AZ
  - QTS 5.1.6.2722

ディレクトリ構成です。

/home/backup/
  - backup.sh
  - id_ed25519.pub
  - id_ed25519
  - log.txt

手順

1. QNAPでバックアップ用の専用アカウントを作成する。(管理者adminで行う場合は不要)
2. QNAPでSSHを有効にする。(1のユーザにアクセス許可する。)
3. LinuxでSSH鍵を生成する。
4. QNAPに作った1のユーザに公開鍵を登録する。
5. スクリプトをテストする。

QNAPでSSHを有効にする

QNAPでSSHを有効にします。
また、「アクセス許可の編集」でユーザにアクセス権を与えます。

LinuxでSSH鍵を生成する

作業ディレクトリに移動して、LinuxでSSH鍵をカレントディレクトリに生成します。
パスフレーズ無しとします。
公開鍵はid_ed25519.pub、秘密鍵はid_ed25519となります。

cd /home/backup

ssh-keygen -t ed25519 -f ./id_ed25519

QNAPの対象ユーザに公開鍵を登録する

QNAPのバックアップ用の専用アカウントに公開鍵を登録します。
id_ed25519.pubの内容をコピペします。


スクリプトを作成する

バックアップ用スクリプト(backup.sh)を作成します。

#!/bin/bash

# NASの設定
NAS_HOST="192.168.1.100"

NAS_USER="admin"
#NAS_USER="qnap_user"

# /home/backupuser(ホームディレクトリ)の下に作成する場合は、/(スラッシュ)は不要
#NAS_DIR="/backup"
NAS_DIR="backup"

# バックアップするディレクトリ
SOURCE_DIR="/data"

# ログファイル
LOG_FILE="/home/backup/log.txt"

# SSH秘密鍵のパス
SSH_KEY="/home/backup/id_ed25519"

# SSHのポート番号
SSH_PORT="22"

# rsyncコマンドのオプション
# 同期(--deleteあり)
#RSYNC_OPTS1="-avzho --delete --progress -e "
#RSYNC_OPTS1="-avzho --delete -e "
# 差分
#RSYNC_OPTS1="-avzho --progress -e "
RSYNC_OPTS1="-avzho -e "

# StrictHostKeyCheckingで問い合わせ無効
RSYNC_OPTS2="ssh -p ${SSH_PORT} -i ${SSH_KEY} -o StrictHostKeyChecking=no"

# ログファイルに日時を記録
echo "================ $(date) =================" >> "${LOG_FILE}"

# rsyncコマンドを実行
/usr/bin/rsync ${RSYNC_OPTS1} "${RSYNC_OPTS2}" ${SOURCE_DIR} ${NAS_USER}@${NAS_HOST}:${NAS_DIR} 2>&1

# 終了コードを確認
if [ $? -eq 0 ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') Backup completed successfully." >> "${LOG_FILE}"
else
    echo "$(date '+%Y-%m-%d %H:%M:%S') Backup failed." >> "${LOG_FILE}"
fi

テストする

スクリプト(backup.sh)をテストします。
QNAPのFile Stationでコピーされているか確認します。

sudo bash backup.sh

または、

cd /home/backup

sudo chmod 755 backup.sh

sudo ./backup.sh

cronに登録する

rootのcronに登録します。

sudo crontab -e

1日に1回、バックアップします。

30 4 * * * /home/backup/backup.sh

Comments