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がバックアップされます。
バックアップサーバーの活用法
バックアップサーバーは、自動クローンが実行されるまでは古いファイルが残っているため、メインサーバーのバックアップ用途以外に、ゴミ箱機能としても活用することができます。
メインサーバーにゴミ箱機能を付ける必要もなく、ディスク領域も節約できるので、おすすめの活用方法です。