Chapter 23. スタッカブルVFSモジュール

Jelmer R. Vernooij

The Samba Team

John H. Terpstra

Samba Team

Tim Potter

Samba Team

Simo Sorce

original vfs_skel README 

Alexander Bokovoy

original vfs_netatalk docs 

Stefan Metzmacher

Update for multiple modules 

Ed Riddle

original shadow_copy docs 

Table of Contents

機能と利便性
議論
含まれるモジュール
audit
default_quota
extd_audit
fake_perms
recycle
netatalk
shadow_copy
他で入手可能なVFSモジュール
DatabaseFS
vscan
vscan-clamav

機能と利便性

Samba-3から、スタッカブルVFS(バーチャルファイルシステム)モジュールがサポートされる。 SambaはUNIXファイルシステムへのアクセスリクエストの一つ一つを、ロードされた VFSモジュールに渡す。この章は、Sambaのソースに附属のモジュールについて説明すると同時に、 一部の外部モジュールについても言及する。

議論

異なるシステムでは異なる方法で共用ライブラリーをコンパイルしリンクするので、これらの モジュールが、プラットフォームディストリビューションのバイナリSambaパッケージと共に 供給されない場合、モジュールをコンパイルするのが困難になるかもしれない。

VFS モジュールを使用するには、以下の例に類似した共有を作成すること。重要なパラメーターは、 一つ以上のVFSモジュールを名前順に一覧表示できるvfs objects パラメーターである。例えば、ファイルへのアクセスをすべてログに取り、削除されたファイルを ゴミ箱に入れるには、VFSモジュールを使うsmb.confの例を 参照のこと:

Example 23.1. VFSモジュールを使うsmb.confの例

[audit]
comment = Audited /data directory
path = /data
vfs objects = audit recycle
writeable = yes
browseable = yes

モジュールは指定された順に使用される。例えば、ウィルススキャナーモジュールとごみ箱 モジュールを両方使用したいとする。この場合、ファイルに関して他のアクションが 取られる前に、最初にウィルスを検知するよう、ウィルススキャナーモジュールを最初の モジュールとし、このモジュールが最初に動くようにすべきである。 The modules are used in the order in which they are specified. Let's say that you want to both have a virus scanner module and a recycle bin module. It is wise to put the virus scanner module as the first one so that it is the first to get run and may detect a virus immediately, before any action is performed on that file. vfs objects = vscan-clamav recycle

SambaはSambaをインストールしたサーバーのrootディレクトリ中の/lib からいくつかのモジュールをロードしようとする(通常は /usr/lib/samba/vfs/usr/local/samba/lib/vfs)。

いくつかのモジュールは同じ共有に対して二度使用できる。これは 複数のVFSモジュールを使用するsmb.confの例の ような設定で可能となる。

Example 23.2. 複数のVFSモジュールを使用するsmb.confの例

[test]
comment = VFS TEST
path = /data
writeable = yes
browseable = yes
vfs objects = example:example1 example example:test
example1: parameter = 1
example: parameter = 5
test: parameter = 7


含まれるモジュール

audit

syslog機能へのファイルアクセスを監査するシンプルなモジュールである。 以下の操作のログが取られる:

  • share

  • connect/disconnect

  • directory opens/create/remove

  • file open/close/rename/unlink/chmod

default_quota

このモジュールは、Samba サーバー上で格納される既定値の quota 値を、Windows のエクスプローラーの GUI 画面で設定できるようにする。この試みは Linux ファイルシステムでユーザーとグループに対する quota を格納する場合のみだが、それは既定値を持たない。

Sambaは既定値としてNO_LIMITをquotaの既定値として返し、それは更新できない。このモジュールを 使うと、ユーザーに対するquotaレコード中でWindowsクライアントに表示される既定値のquota値を 格納できる。既定値では、通常quota制限がrootには適用されないため、rootユーザーが既定値として 利用される。

このモジュールにはsmb.confファイル中で2つのパラメーターを設定する。おのおのの既定値の プレフィックスはdefault_quotaである。これは、以下のようにして、 vfs modulesパラメーター中でモジュールをロードしたときに上書きできる:

vfs objects = default_quota:myprefix

default_quotasモジュールに対して指定することが出来るパラメーターのエントリは以下の通り:

myprefix:uid

既定値のユーザーquotaを格納するために使われるquotaレコードのためのuidを 指定する整数値。

既定値は0(ルートユーザー)。使用例は以下の通り:

vfs objects = default_quota
default_quota:	uid = 65534

上記の例ではmyprefixが省略され、そのため、既定値の プレフィックスはモジュールの名前になる。myprefix パラメーターが指定されると、上記は以下のように書き換えられる:

vfs objects = default_quota:myprefix
myprefix:	uid = 65534

myprefix:uid nolimit

既定値のquota値がユーザーのレコードとしても表示される場合か、 NO_LIMITが、prefix:uidパラメーターに よって指定されたユーザーとしてWindowsクライアントに表示される場合、この パラメーターは論理値となる。

既定値はyesである(NO_LIMITが表示される)。使用例は以下の通り:

vfs objects = default_quota:myprefix
myprefix:	uid nolimit = no

myprefix:gid

このパラメーターはprefix>:uidと同じように整数値を引数と して取るが、グループquotaであるところが違う。注意:グループquotaはWindows エクスプローラーではサポートされていない。

既定値は0である(rootグループ)。使用例は以下の通り:

vfs objects = default_quota
default_quota:	gid = 65534

myprefix:gid nolimit

このパラメーターは、prefix>:uid nolimitと同じように 真理値を取るが、グループquotaであることが違う。注意:グループquotaは Windowsエクスプローラーではサポートされていない。

既定値はyes(NO_LIMITが表示される)。使用例は以下の通り:

vfs objects = default_quota
default_quota:	uid nolimit = no

複数のパラメーターを組み合わせた使用例は以下の通り:

...
vfs objects = default_quota:quotasettings
quotasettings:	uid nolimit = no
quotasettings:	gid = 65534
quotasettings:	gid nolimit = no
...

extd_audit

このモジュールは上記のauditモジュールとほぼ同じで あるが、監査ログをsyslogとsmbdのログファイルに送る 事が異なる。このモジュールのlog levelsmb.confファイル中で設定する。

有効な設定と記録される情報を下記のテーブル中に示す。

Table 23.1. 拡張監査ログの情報内容

ログレベルログ内容 - ファイルとディレクトリ操作
0ディレクトリの作成、削除、Unlink
1ディレクトリのオープン/改名、ファイル名の変更、パーミッション/ACLの変更
2ファイルのオープン&クローズ
10最大のデバッグレベル

監査の設定

この監査ツールはたいていの人が容易に認知するよりもより自由度が高い。 有用なログ情報を記録するためのいくつかの方法がある。

  • すべてのトランザクションを記録するためにsyslogが使える。 これは、smb.confファイル中に syslog = 0を設定することで無効に出来る。

  • xがログレベルであるlog level = 0 vfs:xsmb.confファイル中に設定することによりすべてのロードされた VFSモジュールに対して既定値のログファイル (log.smbd)をログの出力として使える。これは、 ログレベルで指定された、VFSモジュールの動作のすべてのログが 有効になっているが、通常のログは無効にする。

  • ユーザー単位、クライアントマシン単位などで詳細なログを取れる。 これは、log fileの特別な設定方法と 上記を一緒にすることを要求する。

    ユーザー単位とマシン単位の詳細なログの例は、 log file = /var/log/samba/%U.%m.log のようにして行う。

監査情報は、しばしば長い期間保存する必要はある。ログファイルがローテート されないように、smb.confファイル中でmax log size = 0 を設定するのは必須である。

fake_perms

このモジュールは、(UNIX配下のSambaサーバーで)移動プロファイルのファイルと ディレクトリを読み込み専用に設定することができるようにするために作成 された。 このモジュールは、プロファイル共有にインストールされている場合、 プロファイルのファイルとディレクトリが書き込み可能であると、クライアントに 通知する。これにより、クライアントがログアウトまたはシャットダウンした 時に、ファイルを上書きしなくなるが、クライアントのニーズは充足する。

recycle

ゴミ箱と同様のモジュールである。 使用すると、unlinkシステムコールを 横取り、ファイルを削除する代わりにゴミ箱ディレクトリに移動する。 これはWindowsコンピューターにおけるゴミ箱の機能と 同じである。

ごみ箱は、Windows エクスプローラー のネットワークファイルシステム(共有)のビューにも、マッピングされたドライブの いずれのビューにも表示されない。その代わりに、.recycle というディレクトリが、初めてファイルを削除したときと recycle:repositoryが設定されていないときに自動的に 作成される。もし、recycle:repositoryが設定されている 場合、作成されるディレクトリはrecycle:repositoryに 依存する。ユーザーはごみ箱からファイルを取り戻すことが出来る。もしも、 recycle:keeptreeが指定されていた場合、 削除されたファイルは、ファイルが削除された元の場所と同一のパスから、 見つけることができる。

recycleがサポートするオプションは以下の通り:

recycle:repository

削除されたファイルの移動先であるディレクトリのパス。

recycle:directory_mode

recycleディレクトリに設定したい8進のモードを指定する。 もしも存在しないか、最初にファイルが削除された時、 このモードでrecycleディレクトリが作成される。 もしも、recycle:subdir_modeが 設定されていない場合、それらのモードはサブディレクトリ にも適用される。もしも、 directory_modeが設定されて いない場合、既定値として0700が使われる。

recycle:subdir_mode

recycleディレクトリのサブディレクトリに設定したい 8進のモードを指定する。このモードでサブディレクトリ が作成される。もしも、 recycle:subdir_modeが 設定されていない場合、サブディレクトリのモードは directory_modeのモードで 作成される。

recycle:keeptree

ディレクトリ構造を維持するか、あるいは削除された ファイルはゴミ箱に別に保存するかを指定する。

recycle:versions

このオプションを設定すると、同名の二つのファイルが削除 されたとき、 二つとも別のファイルとしてゴミ箱に保存する。 より新しい方の削除ファイルは、 Copy #x of filename という名称で保存される。

recycle:touch

ファイルがごみ箱に移されたときに、ファイルのアクセス 日付を変更するかどうかを指定する。

recycle:touch_mtime

ファイルがごみ箱に移されたときに、ファイルの最終変更 時刻を変更するかどうかを指定する

recycle:maxsize

このパラメーターで指定したバイト数より大きいファイルは、 ごみ箱に入れない。

recycle:exclude

ごみ箱に入れないで、普通に削除するべきファイルをリストする。

recycle:exclude_dir

ディレクトリのリストを指定する。これらのディレクトリから ファイルが削除されると、ごみ箱には入れずに、普通に削除する。

recycle:noversions

recycle:versionsの反対である(*や?のワイルドカードもサポート) する。recycle:versionsが有効な時に 便利である。

netatalk

netatalkモジュールは、Sambaとnetatalkのファイル共有サービスの共存を やり易くする。

従前のnetatalkモジュールと比較した長所は以下の通り:

  • .AppleDouble フォークの作成を気にかけず、ただ同期を取る。

  • smb.conf中の共有の「隠し(hide)」または「拒否(veto)」 リスト中に.AppleDoubleのアイテムを含まないとき、自動的に追加される。

shadow_copy

Warning

これはバックアップでも、アーカイブでも、バージョンコントロールソリューションでもない!

SambaかWindowsサーバーでは、shadow_copyはエンドユーザーツールとしてのみ設計されて いる。バックアップやアーカイブソリューションの機能強化や置き換えにはならず、 そのように考えてはいけない。更に、バージョンコントロール機能が必要な場合には、 バージョンコントロールシステムを入れること。これは警告である。

shadow_copyモジュールはMicrosoftシャドーコピーサービスに似た機能を提供する。 適切に設定された場合、Sambaの共有上で、Microsoftシャドーコピークライアントが "シャドーコピー"を見えるようにする。シャドーコピークライアントのインストール が必要である。Microsoftシャドーコピークライアントは ここ から入手できる。Windows XPより前のクライアントには追加の要求があることに注意。 この機能はWindows XPより前のバージョンではテストされていない。Microsoftシャドーコピー に関するより詳細な情報は、 Microsoftのサイト を参照のこと。

shadow_copy VFSモジュールはLVM1、LVM2かEVMSのような、ある種の論理ボリューム マネージャ(LVM)でセットアップしたものがベースのファイルシステムを要求する。 LVMの設定はこの文書の範囲外である。しかし、例としてのみ この機能をテストするために行う手順の概要を示す。使いたいとしているLVMの 実装が使用対象に対して準備されているかを確かめる必要がある。十分にテストは されなければならない。

以下は、LVMとEVMSに対するよく使われる情報源である:

Shadow Copy のセットアップ

これを書いている時点では、十分なテストは終わっていない。シャドーコピー VFS モジュールを、製品環境では展開していないが、概念の照明としてはより多く、 特定のシナリオでテストした。シナリオは XFS ファイルシステムと LVM1 を使う Debian Sarge 上の Samba サーバーで改良された。ここで提示されたすべてのコンポーネント に関して、十分な評価をしないでソリューションとして使うことは推奨しない。 すなわち、以下は動作させたまでの基本的な概要である。

  1. インストールされたOS.  テストを行うにあたっては、 Debian Sarge (すなわちテスト版)をXFSファイルシステム上で使用した。OSの設定は、 この文書の範囲外である。Sambaが動作するOSがあるものと仮定する。

  2. Sambaのインストールと設定.  この件についてはこのHOWTOのインストールの章 を参照のこと。ドメインコントローラーかメンバーファイルサーバーであることは重要では ないが、Samba 3.0.3かそれ以降のサーバーが動作していることを仮定する。

  3. LVMのインストールと設定.  クライアントに対してシャドーコピーを有効にする前に、シャドーコピーを 作っておく必要がある。これはファイルシステムのスナップショットのような 事を行う事でできる。スナップショットはLVMのような、論理ボリューム マネージャでの一般的な機能であり、まずこれを最初に設定する必要がある。

    以下は、Debianユーザーにとっては最も手助けとなる例である。繰り返すが、 これは"testing"または"Sarge"を使ってテストしている。

    • まだ入れていないのであれば、lvm10とdevfsdパッケージをインストールする。 Debianシステム上では、devfsファイル名を要求するdevfsとlvm1が相互に 影響するので警告が出る。 apt-get update && apt-get install lvm10 devfsd xfsprogs を実行してこの例のためのトリックを行う。

    • 次にボリュームを作成する。そしてボリュームにパーティションを作成する 必要がある。好みのパーティション作成ツールを使うこと(たとえば、 Linuxのfdisk、cfdiskなど)。パーティションタイプは"Linux LVM"を 表す 0x8eに設定すべきである。この例では/dev/hdb1を使う。

      LVMパーティション(タイプ0x8e)が出来ると、LVMボリュームを作成するための 一連のコマンドを実行出来る。いくつかのディスクとパーティションを 使うことが出来るが、この例では一つのみを使う。 modprobe lvm-modのようにしてカーネルモジュールを ロードしてもよく、また、(/etc/modulesに追加 することによって)起動時にロードするように、rebootしても良い。

    • pvcreate /dev/hdb1で物理ボリュームを作成する。

    • vgcreate shadowvol /dev/hdb1でボリュームグループを作成し、/dev/hda1に追加する。

      vgdisplayを使ってボリュームグループについての情報を見る事ができる。

    • この時点でlvcreate -L400M -nsh_test shadowvolのようにして、論理ボリュームを作成できる。

      これは、shadowvolとして作成したボリュームグループ内に、400MBの、 "sh_test"という論理ボリュームを作成する。すべてがうまくいくと、 /dev/shadowvol中にそれらを見る事ができる。

    • この時点でsh_testという論理ボリュームを mkfs.xfs /dev/shadowvol/sh_test というコマンドでフォーマットできる準備が出来た。

      選択した任意のファイルシステムで論理ボリュームをフォーマット できるが、ファイルシステムのフリーズ、リサイズや拡張のような LVMの便利な追加機能を使えるようにしておくこと。

      これで、シャドーコピーVFSモジュールを使えるLVMボリュームが 準備できた。

    • 以下のようにしてディレクトリを準備する必要がある。 Now we need to prepare the directory with something like

      root#  mkdir -p /data/shadow_share
      

      あるいは、シャドーコピーが有効になったSamba共有の希望する名前を 指定する。その上で使えるように、パーミッションの設定をきちんと 行う事。もしも、わからなければ、 chmod 777 /data/shadow_shareを使い、うまく 動いてからパーミッションをきつくする。

    • mount /dev/shadowvol/sh_test /data/shadow_share のようにしてLVMボリュームをマウントする。

      システム起動時にこのパーティションをマウントできるよう、 /etc/fstabを編集しても良い。

  4. シャドーコピーVFSモジュールのインストールと設定.  最後に実際のシャドーコピーVFSモジュールを設定する。シャドーコピーVFS モジュールはSamba 3.0.3以降で有効である。smb.confの設定はとても標準的 である。以下はシャドーコピーVFSモジュールを使う共有定義の例である:

    Example 23.3. シャドーコピーVFSを使う共有

    [shadow_share]
    comment = Shadow Copy Enabled Share
    path = /data/shadow_share
    vfs objects = shadow_copy
    writeable = yes
    browseable = yes

  5. スナップショットの作成とシャドーコピーとしての有効化.  シャドーコピーを閲覧できる前に、それを作成してマウントする必要がある。 これは、cronジョブとして動作するスクリプトで行うのが最も良い。この特定の 解決方法に、LVMスナップショットを閲覧するのにシャドーコピーVFSモジュールが 使える。これらのスナップショットはモジュールによっては作成されない。また、 モジュールによって有効化もされない。このモジュールは、有効になったスナップ ショットを閲覧する事を、シャドーコピーが有効になったクライアントに対して 行う。

    以下はスナップショットの作成とマウントを行う単純なスクリプトである:

    #!/bin/bash
    # This is a test, this is only a test
    SNAPNAME=`date +%Y.%m.%d-%H.%M.%S`
    xfs_freeze -f /data/shadow_share/
    lvcreate -L10M -s -n $SNAPNAME /dev/shadowvol/sh_test
    xfs_freeze -u /data/shadow_share/
    mkdir /data/shadow_share/@GMT-$SNAPNAME
    mount /dev/shadowvol/$SNAPNAME \
           /data/shadow_share/@GMT-$SNAPNAME -onouuid,ro
    

    このスクリプトはリブート時にスナップショットの再マウントのような事は扱わないことに注意。

  6. クライアントからのテスト.  テストのために、 MicrosoftのWebサイト からシャドーコピークライアントを入手し、インストールする必要がある (訳注:URLは日本語版に差し替え済み)。これはXPクライアントでのみテストして いるので、他のXP以前のクライアントでは結果が異なる可能性がある。一度 XPクライアントにインストール後、指定したファイルかshadow_shareの 空白部分で右クリックすると、"プロパティ"が表示される。何か変更があると、 プロパティウィンドウの中に"以前のバージョン"が表示される。

他で入手可能なVFSモジュール

この節では、投稿されてはいるが、SambaCVSツリー(訳注:現在はgit)には何らかの理由(例えば、 管理者が独自のCVSツリーを持つ方が管理しやすいなどの理由)で、現行のものには含まれない、 各種のVFSモジュールを紹介する。

ここで言及したからと言って、そのモジュールの安定性や機能性の良し悪しを示唆したとは解釈しないこと。

DatabaseFS

URL: Taylors University DatabaeFS

By Eric Lorimer.

私は、かなり完成された読み込み専用のファイルシステムを実現する VFS モジュールを作成した。 これは、異なるデータベースを使用するための、モジュール式あるいは一般的な方式のファイル システムとしてデータベースからの情報を表示する(元々は、アーティスト歌詞といったディレクトリでMP3ファイルを整理するために設計されたもので ある。これを私は、学生名簿データベースに応用した)。ディレクトリ構造はデータベース自身に 保存されており、その表を確認するプログラムが走りますが、それ以外に、データベース構造に 関して何らかの推定をすることはしない。

フィードバックを歓迎する。コメント、提案、パッチ、その他何でも送ってほしい。他に何の 役にも立たなくても、最低、誰かが仮想ファイルシステムを作成したい場合に役に立つことを 願っている。

vscan

URL: Open Anti-Virus vscan

Samba-vscan は、Sambaが使う共有化のファイルのための、オンアクセスアンチウィルス機能を提供する、 コンセプト実証(POC)モジュールである。samba-vscan は、各種のウィルス・スキャナーをサポートし、 Rainer Linkがメンテナンスを行っている。

vscan-clamav

Sambaユーザーは何の問題もなくSerNetからのRPMを使っている。OpenLDAP Linuxユーザーも とても良い結果が得られるvscanスキャナーを使っている。これは全体を通して書き込みの パフォーマンスに影響がある。

以下のような共有セクションはvscan-clamavを設定したい人のための良いガイドである:

[share]
vfs objects = vscan-clamav
vscan-clamav: config-file = /etc/samba/vscan-clamav.conf

以下のvscan-clamav.confファイルの例は、完全に動作可能なものの 手助けになるかもしれない:

<title>VFS: Vscan ClamAV制御ファイル</title>
#
# /etc/samba/vscan-clamav.conf
#

[samba-vscan]
; run-time configuration for vscan-samba using
; clamd
; all options are set to default values

; do not scan files larger than X bytes. If set to 0 (default),
; this feature is disable (i.e. all files are scanned)
max file size = 10485760

; log all file access (yes/no). If set to yes, every access will
; be logged. If set to no (default), only access to infected files
; will be logged
verbose file logging = no

; if set to yes (default), a file will be scanned while opening
scan on open = yes
; if set to yes, a file will be scanned while closing (default is yes)
scan on close = yes

; if communication to clamd fails, should access to file denied?
; (default: yes)
deny access on error = no

; if daemon failes with a minor error (corruption, etc.),
; should access to file denied?
; (default: yes)
deny access on minor error = no

; send a warning message via Windows Messenger service
; when virus is found?
; (default: yes)
send warning message = yes

; what to do with an infected file
; quarantine: try to move to quantine directory
; delete:     delete infected file
; nothing:    do nothing (default)
infected file action = quarantine

; where to put infected files - you really want to change this!
quarantine directory  = /opt/clamav/quarantine
; prefix for files in quarantine
quarantine prefix = vir-

; as Windows tries to open a file multiple time in a (very) short time
; of period, samba-vscan use a last recently used file mechanism to avoid
; multiple scans of a file. This setting specified the maximum number of
; elements of the last recently used file list. (default: 100)
max lru files entries = 100

; an entry is invalidad after lru file entry lifetime (in seconds).
; (Default: 5)
lru file entry lifetime = 5

; exclude files from being scanned based on the MIME-type! Semi-colon
; seperated list (default: empty list). Use this with care!
exclude file types =

; socket name of clamd (default: /var/run/clamd). Setting will be ignored if
; libclamav is used
clamd socket name = /tmp/clamd

; limits, if vscan-clamav was build for using the clamav library (libclamav)
; instead of clamd

; maximum number of files in archive (default: 1000)
libclamav max files in archive = 1000

; maximum archived file size, in bytes (default: 10 MB)
libclamav max archived file size = 5242880

; maximum recursion level (default: 5)
libclamav max recursion level = 5

もちろん、これを動作させるためにclamデーモンを走らせることは必要である。これはClamAVを 使うための動作例である。ClamAVの説明には追加の設定例が提供されている。それは、システム 内の/usr/share/doc/ディレクトリ配下に配置されている。いくつかの例は 他の使用可能なウィルススキャナーをターゲットにもしている。