NAS のバックアップを外付け HDD に

(2025-08-09)

我が家には NAS が全部で 3 台あって、自宅内のサーバーとして使っています。

QuickConnect を設定して外部からファイルをダウンロードしたりする系と我が家のアルバムのようなプライペートな外部からアクセスできない系の 2 つに分けています。

QuickConnect でアクセスできる系もパスワードはガチガチにしてあるので基本的にはセキュリティは高いと思っています。

自宅内サーバーは rsync を使ってバックアップ用の NAS に同期していますが、やはり外付の HDD で更にバックしたいと思います。<

これまでは hyperbackup を使っていましたが、cron を外部からいろいろといじるのでおかしくなってしまいました。そもそも hyperbackup は以前から割と使いにくと感じていました。

外付け HDD の認識

NAS に ssh ログインして sudo -i で昇格して、

fdisk -l

とすると、いろいろと表示されて最後の方に、

Disk /dev/sdq: 931.5 GiB, 1000204883968 bytes, 1953525164 sectors
Disk model: External USB 3.0
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x82f61537

これが外付け HDD です。

マウントポイントを確認します。

mount | grep sdq

すると、

root@NAS718:~# mount | grep sdq
/dev/sdq1 on /volumeUSB1/usbshare type ext4 (rw,relatime,nodelalloc,synoacl,data=ordered)

backup 用のディレクトリ Bak を作成します。

mkdir -p /volumeUSB1/usbshare/Bak

シェルスクリプトを作成

シェルスクリプトを作成します。
chatGPT に作ってもらいました。

backup.sh
#!/bin/bash
# バックアップ先ディレクトリ
BACKUP_DIR="/volumeUSB1/usbshare/Bak"
# バックアップ元ディレクトリ一覧
declare -A SRC_DIRS=(
[document]="/volume1/document"
[music]="/volume1/music"
[web]="/volume1/web"
)
# ログファイル(実行日時付きで分かりやすく)
LOGFILE="/var/log/rsync_backup_$(date +%Y%m%d_%H%M%S).log"
echo "Backup started at $(date)" | tee -a "$LOGFILE"
for key in "${!SRC_DIRS[@]}"; do
SRC=${SRC_DIRS[$key]}
DST="$BACKUP_DIR/$key"
echo "Backing up $SRC to $DST" | tee -a "$LOGFILE"
rsync -avh --delete "$SRC/" "$DST/" >> "$LOGFILE" 2>&1
if [ $? -eq 0 ]; then
echo "Backup of $key succeeded." | tee -a "$LOGFILE"
else
echo "Backup of $key failed!" | tee -a "$LOGFILE"
fi
done
echo "Backup finished at $(date)" | tee -a "$LOGFILE"

実行権限を与えます。

chmod +x /usr/local/bin/backup.sh

タスクスケジューラか cron で設定

タスクスケジューラに

/bin/bash /usr/local/bin/backup.sh

というタスクを設定して実行した方が簡単ですが、root でないと動かないかもしれません。

実行権限があれば「/bin/bash」は必要ないようですが、あっても構いません。

タスクスケジューラを設定すると cron に記録されるので、私のように外部から NAS の cron をコントロールする場合には、新しく設定された cron を削除しないようにする必要があります。

例えば私の場合は、上のタスクスケジューラを設定した場合、以下のような cron が追加されました。

30 0 * * * root /usr/syno/bin/synoschedtask --run id=5

これで、hyperbackup を使わなくても外付け HDD にバックアップができるようになりました。

やはり hyperbackup の方が便利

hyperbackup は何ヶ月も前のバックアップもされているので、間違って削除してしまった場合でもリカバリできます。

そういうことを考えるとやはり hyperbackup の方が便利と言えます。

もし NAS 本体がクラッシュしたら、外付け HDD を他の NAS に持っていけるのか疑問だったので hyperbackup をやめたのですが、 実験してみたところ簡単に他の NAS に持っていけることがわかったので、もう一度 hyperbackup でバックアップすることにしました。