samba NASを別サーバーにcronで定期的に自動バックアップ

Linux

Ubuntu Sambaで組んだファイルサーバーを、別サーバーに自動バックアップする方法を紹介します。

筆者の自宅はSambaで構築したファイルサーバーを運用していますが、ストレージにHDDを使っているため、突然故障に備えて定時バックアップするようにしています。

システム環境

解説する環境は以下の通りです

  • メインSamba:192.168.0.100:/mnt/share
  • バックアップSamba:192.168.0.110:/mnt/share-backup
  • バックアップ実行日時:毎週水曜日 午前2時5分に実行

SambaサーバーはProxmox上のubuntu24.04で構築しています。

ubuntuでのsamba構築方法についてはこの記事この記事を参考にしてください。

※バックアップサーバーはRAIDを組まずにシングルドライブで構築がおすすめです。

初回バックアップ

バックアップサーバーを構築後、バックアップ側Sambaからrsyncで初回コピーを行います。

サーバー間のコピーであるため、メイン側のユーザーとパスワードが要求されます。

rsyncコマンドの特にフォルダ最後の "/" の記載に注意し、コピー元とコピー先のそれぞれに"/"をつけるようにします。(もしくは両方とも"/"をつけない)

片方の"/"をつけなかった場合は、場所の意味が変わってしまい、バックアップNASにあるディレクトリ構造が変わってしまいます。

192.168.0.110のSambaで設定
$ rsync -av falcon@192.168.0.100:/mnt/share/ /mnt/share-backup/

ストレージがHDDの場合、全体コピーには数時間~半日程度かかります。

コピー作業は時間のあるときにおこなうのが良いでしょう。

cron用シェルスクリプト作成

定期動作にcronを使うため、cron用シェルスクリプトを作成します。

手動コマンドがうまく動作することを確認した後、ホームディレクトリ上に/home/falcon/falcon_backup.sh のシェルスクリプトを記載します。

サーバー間コピーは、ユーザー・パスワードが聞かれてシェルスクリプトが止まってしまうため、expectで自動化も行います。

  • ID(root権限あり): falcon
  • PW: falcon-pass
  • rsyncオプションは-av
  • パスワードはexpectを用いて自動入力
  • logは/var/log/rsync_日時.logに自動保存
  • set timeoutは-1(無制限):データコピーは12時間くらいかかることもあるため必須設定
$ nano /home/falcon/falcon_backup.sh
expect -c "
  set timeout -1
  spawn rsync -av --log-file=/var/log/rsync-`date +"%Y%m%d-%H%M"`.log falcon@192.168.0.100:/mnt/share/ /mnt/share-backup/
  expect \"password:\"
  send -- \"falcon-pass\r\"
  expect eof
  exit

falcon_backup.shに実行権限を付与します。

$ sudo chmod +x falcon_backup.sh

root権限でシェルスクリプトを実行し、手動コマンドと同じ動作になることを確かめます。

# cd /home/falcon
# ./falcon_backup.sh

--deleteオプション追加

完全クローンする場合、古いファイルを削除する --deleteオプションを追加します。

--deleteオプションは、ファイル削除を伴う危険操作であるため、-nオプションを追加してDryRUNを行います。

# rsync -avn --delete --log-file=/var/log/rsync-`date +"%Y%m%d-%H%M"`.log falcon@192.168.0.100:/mnt/share/ /mnt/share-backup/
deleting document/a.log
deleting document/b.log
deleting document/c.log
~~中略~~
sent 236,040 bytes received 76,439,666 bytes 596,698.10 bytes/sec
total size is 1,994,550,713,399 speedup is 26,012.81 (DRY RUN)

DryRUNを実施後、メインNAS、バックアップNASのフォルダを比較し、deleteされるファイルが適切であることを確認します。

意図した通りに動作することを確かめたら 、falcon_bakchup.shの-nオプションを削除します。

$ nano /home/falcon/falcon_backup.sh
expect -c "
  set timeout -1
  spawn rsync -av --delete --log-file=/var/log/rsync-`date +"%Y%m%d-%H%M"`.log falcon@192.168.0.100:/mnt/share/ /mnt/share-backup/
  expect \"password:\"
  send -- \"falcon-pass\r\"
  expect eof
  exit

再度、シェルスクリプトを起動し、意図したとおりの結果になることを確認します。

実行結果はコンソールでも表示されますが、/var/log/rsync-(日時)ファイルでログが保存できていることも確認します。

# cd /home/falcon
# ./falcon_backup.sh

$ cat /var/log/rsync-20250524-0200.log
deleting document/a.log 
deleting document/b.log 
deleting document/c.log 
~~中略~~ sent 236,040 bytes received 76,439,666 bytes 596,698.10 bytes/sec 
total size is 1,994,550,713,399 speedup is 26,012.81

cronに登録

バックアップサーバー側でcronを登録し、毎週水曜日の午前2時5分にクローン動作するように設定します。

初回のcron操作は、エディター選定ができるため、nanoを使います。

$ sudo crontab -u root -e
no crontab for root - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.tiny
  3. /bin/ed

Choose 1-3 [1]: 1

#毎水曜日の午前2時5分に実行を追記する
5 2 * * 3 /home/falcon/falcon_backup.sh

※crontab [option]の意味

-u: cronを設定するユーザーを指定
-l: cronを一覧で表示
-r: cronの設定を全消去
-e: cronを設定するエディタを起動する

※cron記述フォーマットと曜日の定義

[フォーマット]
分 時 日 月 曜日 <実行コマンド>

例:
5,15 3 * * * /home/falcon/falcon_backup.sh
意味:毎日3時5分と3時15分に/home/falcon/falcon_backup.shを実行

[曜日の定義]
0または7=日, 1=月, 2=火, 3=水, 4=木, 5=金, 6=土

cronに登録されたことを確認します。

root@samba-backup:/home/falcon# crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
5 2 * * 3 /home/falcon/falcon_backup.sh

システムの再起動は不要です。

crontabへの記述だけでシェルスクリプトが起動され、自動でNASがバックアップされます。

バックアップサーバーの活用法

バックアップサーバーは、自動クローンが実行されるまでは古いファイルが残っているため、メインサーバーのバックアップ用途以外に、ゴミ箱機能としても活用することができます。

メインサーバーにゴミ箱機能を付ける必要もなく、ディスク領域も節約できるので、おすすめの活用方法です。