samba vfs_shadow_copy2とZFS snapshotでsambaでも「以前のバージョン」を使う

Windows 7以降では「以前のバージョン」と呼ばれる機能があり、NTFSのスナップショットにエクスプローラからアクセスし、特定のファイルの以前のバージョンを復元させたり、あるいはファイルシステムの過去の状態をブラウズすることができる。

この機能はSMBによる共有フォルダ上でも利用できる。これまで僕は当該機能はsambaではサポートされておらず、使いたい場合はフォルダを共有する側のOSとしてWindowsを利用しなければならないと思いこんでいたが、どうやらsambaでもshadow_copy2 VFSモジュールを使うことで利用できるらしく、さらにZFSが提供するスナップショットをそのまま利用できることが分かったので設定した。なお、ZFSはZFS on Linuxで利用している。

環境

  • Debian Wheezy 7.8
  • ZFS on Linux 0.6.3
  • Samba 4.1.11

なお、ZFSはhttp://zfsonlinux.org/debian.html で入れた。Sambaはwheezy-backportsから入れた。

pool0/mecabというZFSファイルシステムを作成しており、/pool0/mecabにマウントしている。このディレクトリがそのままsambaによって公開されている。すなわち、smb.confには以下のような記述がある。

[mecab]
  path = /pool0/mecab
  .
  .

手順

  1. ZFSスナップショットをファイルシステム上で見えるようにする。

    # zfs set snapdir=visible pool/mecab
    

    この操作により作成したスナップショットをファイル単位で/pool0/mecab/.zfs/snapshot/以下でアクセスすることができるようになる。

  2. sambaにshadow_copy2 VFSモジュールを設定する。smb.conf内の適切なセクションに記述を加える。設定後sambaをリスタートする。

    [mecab]
      path = /pool0/mecab
      vfs objects = shadow_copy2
      shadow:snapdir = .zfs/snapshot
      shadow:sort = desc
      shadow:format = zfs-auto-snap_hourly-%Y-%m-%d-%H%M
    

    この操作により/pool0/mecab/.zfs/snapshot以下の、zfs-auto-snap_hourly-%Y-%m-%d-%H%Mにの形式に従う名前を持つディレクトリは、当該日時のスナップショットとして「以前のバージョン」から参照できるようになる。すなわち、後はZFSスナップショットをこの形式で作成するだけでよい。

  3. おもむろにスナップショットを作成し、エクスプローラから参照する。エクスプローラから「以前のバージョン」としてZFSスナップショットを参照できていることが確認できる。
    エクスプローラからネットワークドライブの「以前のバージョン」を確認している様子。ZFSスナップショットを参照できていることが確認できる。

その他

調べている最中、smb.conf

follow symlinks = yes  
wide links = yes  
unix extensions = no  

としないと動かないといった記述をいくつか見つけたが、少なくとも僕の環境ではこれらは設定しなくても動作している。

ZFSのスナップショットの自動取得やローテーションには zfs-auto-snapshotを利用している。make installすれば、全ZFSファイルシステムについて、hourly、daily、weekly、monthlyおよび15分毎でスナップショットを作成し、さらに1周期(例えば、hourlyについては24個)でローテーションしてくれるcronを勝手に作ってくれるので楽だ。なお、上記で設定したshadow:formatはこのシェルスクリプトによって作成されるhourlyスナップショットのデフォルトの名前になっている。

問題があるとすれば、少なくとも現在はshadow:formatを複数指定したり、正規表現を利用することができないうえ、zfs-auto-snapshotはローテーションにスナップショットの名前を利用しているため、上記cronで作られるスナップショットのすべてを「以前のバージョン」として公開できないところだ。自分でスクリプトを書くか、そのうちvfs_shadow_copy2が複数のshadow:formatに対応すれば解決するだろう。

今回はvfs_shadow_copy2の設定でZFSのスナップショットを「以前のバージョン」として公開するようにしたが、当然ながらZFSを使わなければならないわけではなく、ディレクトリの名前さえ正しく設定すれば、例えば単純にフォルダをまるっとコピーしたものでも問題ないことは言うまでもないだろう。LVMのスナップショットを利用する例もあるようだ。

おわりに

この記事ではsambaのshadow_copy2 VFSモジュールを利用して、ZFSで作成したスナップショットをネットワークドライブの「以前のバージョン」として公開する方法を説明した。vfs_shadow_copy2では日時を含むディレクトリの形式を指定することで、当該ディレクトリをその日時のスナップショットとみなして「以前のバージョン」として公開できる。またZFSには作成したスナップショットそれぞれを、ファイルシステム上でディレクトリとして見えるようにする機能があるので、これらを組み合わせることでこれらは容易に実現できた。

SMBでアクセスできるNASを構築している場合など特に有用だと思われる。ファイルを間違って消してしまったり、上書きしてしまった場合に、NASにログインしてコマンドを叩かずとも、サクッとエクスプローラからファイルを復元出来るのは良い。