はじめに
HAMMER2について調べているうちに,スナップショットやレプリケーションなど,どこかZFSに似た機能を持っていることを知りました.(というか先に世に出たのはZFS)
ZFSといえばTrueNASなどはじめとした,NASやバックアップサーバでの王者だと見ました.なら,DragonflyBSDでもNASのようなものを作ることはできるんじゃないかと思い,実際に構築してみることにしました.
実際に製品になっているものと性能比較をするというよりは,HAMMER2を搭載したDragonFlyBSDで,どこまでNASっぽいことができるのかを試してみます.
完全に自己満です.
NASの機能
実際に構築する前に,NASにはどんな機能があるのか知らないといけませんね.整理しておきましょう.
NASは,簡単に言えばネットワーク越しに利用できる保存場所です.
NAS(Network Attached Storage)は,LANに直接接続する形式のストレージです.ファイル共有に特化したOSやネットワークインターフェースなどを備えていることから,ファイルサーバ専用機とも言えます.(引用:令和7年【春季】【秋季】応用情報技術者合格教本)
しかし,最近のNASは単なるファイル置き場ではありません.
代表的な機能としては,
- ファイル共有(SMB,NFSなど)
- バックアップ
- スナップショット
- RAIDによる冗長化
- Web管理画面
- クラウド連携
などがあります.特にTrueNASのような製品では,データを安全に保存することを重視しており,ZFSによるスナップショットや冗長化機能が大きな特徴となっています.
これら機能をすべて実現しようとすると日が暮れてしまうので,
- ファイルを保存できる
- 別マシンからアクセスできる
- スナップショットを作れる
- レプリケーションを組み立てる
このあたりを目標にしてみます.
構成
今回構築するシステムは以下のような構成です.
- クライアント(Windows / Linux)
- バックアップサーバ(DragonFlyBSD)
クライアント側からSFTP等を用いてファイルを転送し,
DragonFlyBSD側で保存します.
Windows
\
\
Linux -----> DragonFlyBSD -------> 別マシン(今回ない)
(バックアップサーバ)
DragonFlyBSDではHAMMER2を利用し,
- データ保存
- 定期的なスナップショット取得
- スナップショットから差分計算
- 差分を別マシンに送るふり
- 別マシンで差分からファイルを再構築するふり
を行います.
つまり,「ファイルを集約する」+「過去の状態を残す」ことを目的としたシンプルな構成です.
今回は流石にWebUIなどは導入せず,バックアップ用途に絞って構築していきます.
また,バックアップ元のマシンとDragonflyBSDのアクセスの設定は,こちらの記事にまとめました.
DragonflyBSDでスナップショット作成
本来はマシンごとにフォルダを分けたほうが良さそうですが,面倒なので 簡単なプロトタイプなので,混ぜちゃいます.
定期的に実行するってことは,CRONの出番です.管理者権限が必要なので,rootのcronに書いておきましょう.
0 0 * * * snapshots.sh # 毎日0時に実行
#!/bin/sh
hammer2 snapshot /path/to/BACKUP snap_$(date +%Y%m%d)
hammer2 -s <mountpoint> pfs-delete snap_"$(date -v-3d +%Y%m%d)"
あと,定期的にスナップショットを消しておかないと倍々に増えてしまいます.3日経ったものは消してしまいます.
今回は1日に1回スナップショットを取るようにしていますが,その日の中での変化には対応できないことになります(∴戻れるのは直近でも昨日の状態).
レプリケーションを実現
レプリケーションを実現するにはスナップショットに加えて,
- その差分を定期的に計算
- 差分を別マシンに送信し,そこでファイルを再構成
をしなければなりません.雰囲気だけやっていきます.
1 0 * * * replikation.sh # 毎日0:01時に実行
差分計算はスナップショットをマウントして,直接rsyncで比較します.力技ぁ
#!/bin/sh
mount_hammer2 /dev/serno/XXXX.s1d@snap_$(date +%Y%m%d) /mnt/snap1
mount_hammer2 /dev/serno/XXXX.s1d@snap_$(date -v-1d +%Y%m%d) /mnt/snap2
rsync -a --link-dest=/mnt/snap2 /mnt/snap1 diff_$(date +%Y%m%d)
mv diff_$(date +%Y%m%d) /tmp/backup/
diff_$(date +%Y%m%d)が出力されるので,その中身を別のマシンのディスクに保存しておきましょう.とりあえず/tmp/backupを別マシンに見立てていますが..
ちゃんと別マシンに保存するとレプリケーションシステムが完成します!!
rsync --link_dest=XXX SOURCE DEST
--link-dest= → 1つ前のスナップショット
SOURCE → 現在のスナップショット
DEST → 差分を考慮して合成した結果
定期的にバックアップ削除
本来別マシン内でやることです
差分を受け取ったマシン内ではこれもやっておかないと,バックアップでいっぱいになってしまいます.これも3日経ったものは消してしまいます.
5 0 * * * Sortout.sh
#!/bin/sh
BACKUP_DIR=/tmp/backup
# 3日前の日付
CUT=$(date -v-3d +%Y%m%d)
for d in "$BACKUP_DIR"/diff_*; do
# ディレクトリ名から日付部分を抽出
name=$(basename "$d")
datepart=$(echo "$name" | sed 's/diff_//; s/_.*//')
# 古ければ削除
if [ "$datepart" -lt "$CUT" ]; then
rm -rf "$d"
fi
done
結果
何日か放置した後のスナップショットと複製ファイルを見てみると,
$ sudo hammer2 pfs-list / # スナップショット
SNAPSHOT dd05b0c8-76ef-11f1-963d-691def5121c1 snap_20260704
SNAPSHOT 07d1ab79-77b9-11f1-963d-691def5121c1 snap_20260705
SNAPSHOT 322b9f02-7882-11f1-963d-691def5121c1 snap_20260706
$ ll /tmp/backup/ # 複製ファイル
total 32
drwxr-xr-x 2 root wheel 352B 03-Jul-2026 00:00 diff_20260703/
drwxr-xr-x 2 root wheel 440B 04-Jul-2026 00:00 diff_20260704/
drwxr-xr-x 2 root wheel 352B 05-Jul-2026 00:00 diff_20260705/
drwxr-xr-x 2 root wheel 528B 06-Jul-2026 00:00 diff_20260706/
中身も見てみると,テキトーにファイルを変更したのが反映されていました.
なので,ファイルを間違ってrm -rfしてしまっても安心です!
$ ls /tmp/backup/diff_20260703
ded.txt ded.txt~ file.txt foo.bar
$ ls /tmp/backup/diff_20260704
click.py ded.txt ded.txt~ file.txt foo.bar
$ ls /tmp/backup/diff_20260705
click.py click.py~ file.txt foo.bar
まとめ
今回試作したシステムはNASの基本的な機能と,障害にも耐えうる構造をHAMMER2で実現しました.ZFSのようにファイルシステムレベルで様々な機能があるわけではないので,部分部分は自分で実装しないといけませんが,NASを理解したい,NASを0から作ってみたいと思う人にはぴったりのおもちゃです.
ちなみに,HAMMER2にはDragonflyBSDが分散OSとして設計されていた名残で,スナップショットを別のDragonflyBSDマシンへ自動同期するというとんでもない機能のガワが残されています.実際にはまだ使えませんが...
For now don't try to cluster anything. That work is still in-progress. (現時点では、クラスタリングは試さないでください。その機能は現在開発中です。)
https://lists.dragonflybsd.org/pipermail/users/2020-April/451326.html
仮にこれが完成したら,DragonflyBSDはFSレベルでレプリケーションができます.完成したら面白そうですね.
感想
正直に言うと,ストレージとしての完成度はFreeBSD + ZFSが圧倒的です.
自分で構築したNASを本番運用したいなら迷わずそちらを使うべきです🥲
今回の試作は「差分レプリケーション」ってどんなものなのかを学ぶことが出来たことが一番大きな成果でした.どんなものか今ならこう説明できます.
【差分レプリケーションってなぁに?】
- ファイルを別マシンにも保存して,マシンの障害に備える
- スナップショットを使う(リアルタイムの変更に影響されないようにするため)
- 前回とのスナップショットの差分を別マシンに送信する
- 受信側で差分から,同じ状態のファイルシステムを再現する
- RAIDとの違いは敵.RAIDはディスクの故障,レプリケーションはマシン(ディスク含む)の障害