BTRFSでOpenMediaVaultのファイルの変更履歴を残すには

現在のWindows 10, 11をベースとしたOSは、VSS(ボリューム・シャドウ・コピー・サービス)という機能が実装されていて、任意の時刻にファイルの履歴を残すことが可能です。

では、NASで同じ機能は実現できないものでしょうか?

先日作成した、OpenMediaVaultのNASですが。

64ビット版Raspberry Pi OSでNAS構築 OpenMediaVault 6 令和5(2023)年1月版
64ビット版のRaspberry Pi OSに、OpenMediaVault 6をインストールしてみました。 USBストレージ...

共有フォルダのファイルシステムとしてBTRFSを選択することで、ファイルシステムが持つスナップショット機能を使用して、任意の時刻にファイルの履歴を残すことが可能のようです。

これは、単純にファイルをコピーして、無駄にストレージを消費することとは異なります。BTRFSの機能により、無駄なストレージ領域を消費することなく、高速に効率よく、かつ確実に履歴を残すことが可能です。

そのような、NASの機能を拡張するような、サブシステムの構築手順を記録しておこうと思います。


OMVのファイルシステムをBTRFSで作成

今からストレージ→ファイルシステムを新たに作成する場合は、BTRFSで作成して下さい。

既にEXT4で共有フォルダを作成した場合ですが。いちどデータをどこか別のストレージに退避してから、ファイルシステムを作り直す必要があります。

具体的には、次の手順になります。

  1. SMB/CIFS等のサービスの共有フォルダ解除
  2. ストレージ→共有フォルダ削除
  3. ストレージ→ファイルシステムのアンマウント
  4. ディスクのワイプ

こちらの記事に、具体的な操作手順が御座います。

OpenMediaVaultで共有フォルダを作り直すには
先日作成しましたOpenMediaVaultのNASですが 共有フォルダを作り直したい場合など、手順がやや複雑なように思えます...

ディスクのワイプ→クイックまで進めて頂き、USBストレージのパーティションをすべて削除します。

その後、改めてBTRFSでファイルシステムを作成します。作成したファイルシステムをマウント後、ストレージ→共有フォルダを作成します。こちらの画像は「share」という共有フォルダになります。

タイプ欄が「BTRFS」となります。

この段階で、ファイルシステムの下準備は完了です。


BTRFSファイルシステムでSMB/CIFS、NFS等のサービスを設定

BTRFSでストレージ上のファイルシステムが出来ましたら。

必要に応じて、サービス設定でSMB/CIFSやNFS、RSyncファイル共有を行います。

スナップショットの保存は、ファイルシステム上で行うため、サービスとは切り離して実行可能です。

もちろん、複数のサービスを同時に有効にしても問題ありません。


BTRFSスナップショットの保存機能追加

この記事を作成したいと思ったきっかけは、OpenMediaVaultの次の投稿からです。

https://forum.openmediavault.org/index.php?thread/7331-guide-windows-previous-versions-and-samba-btrfs-atomic-cow-volume-shadow-copy/

Windows Serverのファイル共有機能は、VSS(Volume Shadow Copy Service)が実装されており、任意の時刻でスナップショット(ファイルやフォルダの変更履歴)を保存する機能を持っています。

またMacのTimeMachineも同様に、ファイル・フォルダの履歴を保存することが可能です。

では、Linuxで作成したNASは、そのような機能を持っていないのか?と申しますと。残念ながら、標準ではありません。WindowsやMacと比較すると、時代遅れの印象です。(直球ですみません

BTRFSのスナップショット機能を、Sambaから使用する事は可能ですが、WindowsやMacOSよりも統合性が無いと言いますか・・・少々使いづらい印象でした。

上記の記事では、subvolumeを作成し、cronでスナップショットを作成することで、任意の時刻のファイル履歴を保存しております。これは確かに、VSSやTimeMachineと似た機能を実現できている印象を受けました。

さらにOMV-extrasのSMBのshadow_copy2を連携させています。この記事では、cronによる任意の時刻のスナップショットの作成まで行っておりますが、Sambaの連携までは行っておりませんので、予めご了承下さい。

では具体的に任意の時刻にスナップショットを保存できる環境を作りたいと思います。

フォルダ構成

NASの共有フォルダshareの下に次の2つのフォルダを作成しました。

  1. withsnapshot →ファイルとフォルダの履歴を保存する対象フォルダ
  2. snapshots →その履歴が入ったフォルダ

withsnapshotフォルダに、履歴を残したいファイルを置きます。こちらに大切なデータを入れて、メインの共有フォルダとして使用する感じです。

snapshotsフォルダですが。

このような感じで、日時のフォルダが自動的に出来てゆきます。

昔のデータを取り出したい場合、こちらを参照するという使い方です。

こちらの日時のフォルダは、cronで作成しています。この記事では、毎日0時と12時の2回、スナップショットを作成しています。

BTRFSの機能を使用しておりますので、無駄にストレージを消費することはありません。またコマンドで作成しておりますため、作成するタイミングを変えたり、古すぎるスナップショットを削除したり、そのあたりは自由に設計できると思います。

履歴保存対象のwithsnapshotフォルダの作成

作成はコマンドを使用します。SSHでOpenMediaVaultサーバへ接続します。

共有フォルダまでcdコマンドで移動しました。

mount |grep srv
# 共有フォルダのマウント先を確認
cd /srv/<UUID>/<共有フォルダ名>

履歴保存対象のwithsnapディレクトリは、btrfs subvolumeコマンドで作成します。

sudo btrfs subvolume create withsnapshot
mkdir snapshots

スナップショットの保存ディレクトリは、普通にmkdirで作成しました。

作成後、ディレクトリのオーナー(グループ)とパーミッションを調整します。

sudo chgrp users withsnapshot snapshots
sudo chmod g+ws withsnapshot snapshots

よく考えたら、snapshotsフォルダは変更不可のほうが良いのかも知れません。このコマンドは最適解ではありませんので、snapshotsフォルダに関しては必要に応じて調整して下さい。

以上で履歴保存対象の「withsnapshot」フォルダと、履歴が保存される「snapshots」フォルダができました。


履歴の保存コマンド

BTRFSを使用したスナップショットの保存は、下記のコマンドになります。

sudo btrfs subvolume snapshot -r /srv/<UUID>/<共有フォルダ名>/withsnapshot /srv/<UUID>/<共有フォルダ名>/snapshots/`date +%Y.%m.%d-%H.%M.%S`

引数の最初は、スナップショット作成対象ディレクトリ。

その後に、スナップショットのディレクトリを指定しますが、dateコマンドで出力した日時をフォルダ名にしています。

作成したスナップショットの確認コマンドはこちらです。

sudo btrfs subvolume list snapshots

最初に作成したwithsnapshotディレクトリそのものが、最初のスナップショットになるのですね。ID 258が割り当てられています。

手動で作成したスナップショットは、ID 259が割当られました。

もしも履歴(スナップショット)を削除したい場合は、btrfsコマンドで削除する必要があります。

あとは、指定した日時に自動的にスナップショットが作成されるような設定を行います。


crontabで指定時刻にスナップショットを作成

スナップショットを取りたい時刻を指定し、crontabでタイマーを起動しようと思います。

sudo crontab -e

次の1行を追加しました。

0 0,12 * * * /usr/bin/btrfs subvolume snapshot -r /srv/<UUID>/<共有フォルダ名>/withsnapshot /srv/<UUID>/<共有フォルダ名>/snapshots/`/usr/bin/date +\%Y.\%m.\%d-\%H.\%M.\%S`

※23.1.10追記:crontabの中で%を使う場合、エスケープ付き「\%」と書かないとcronでうまく実行されないのですね。修正しました。

2列目の0,12は、毎日0時と12時に履歴を保存する設定になります。

共有フォルダのファイルは、作成・編集、そして削除してしまう場合もあるかと思いますが。

午前中に行った変更の内容を保存、そして夜に保存、という状況を想定しています。

誤って削除してしまったファイルや、誤って編集してしまったファイルを、もとに戻したい。という状況を考えたとき。

いつ、スナップショットを保存しておけば良いか、を考えて設定して頂ければと思います。

もちろん、より細かく1時間おき、等に設定して頂いても問題ないと思いますが、ストレージの空き容量にはご注意下さい。


vfs_shadow_copy2によるSamba連携

こちらのSambaマニュアルを拝見しますと。

http://www.samba.gr.jp/project/translation/3.6/htmldocs/manpages-3/vfs_shadow_copy2.8.html

この記事の冒頭。「以前のバージョン」に、snapshotの一覧を表示する機能が実装されているようです。

一方、BTRFSのスナップショットですが、対象のフォルダ(withsnapshot)を、過去のスナップショットにロールバックして時間を戻す機能も存在します。

前者は、smb.confファイルの編集が必要です。

後者は、btrfsコマンドによるロールバック操作が必要になります。

OpenMediaVaulutの標準機能で、そのあたりを連携するのは難しいかなと考えておりますので。

今のところ、snapshotsフォルダを見ると、過去の履歴が入っていますよ、というレベルで使用させて頂こうと思います。


以上のようなかたちで。

構築したOpenMediaVaultのNASに。

ファイルの履歴を保存する機能を追加してみました。

業務利用で、細かくドキュメントの作成・編集を行う場合など。

履歴を保存する機能は、絶対にあったほうが良いと思います。

ヒューマンエラーは、発生することを前提に考える必要があります。操作ミスによって、誤ってファイルを削除した場合。その発覚が、たとえば1ヶ月遅れの場合。長期間の履歴を取らないNASでは、対応が難しいと思います。

ファイル・フォルダの履歴を取ることで、完全復元まで行かなくても、まあ3時間、6時間前の状態に戻れる、というのは、完全消失と比べたら重要な機能かと思います。

本気でNASを運用される場合、ぜひ検討してみて下さい。

・・・・

ええ?業務利用でも、アクティビティが記録可能な、Nextcloud使います?

スポンサーリンク