WebDAV( apache 2.0.64,2.2.17 )のディスク容量制限パッチ
サタケ <satake@goodcrew.ne.jp>
2010/11/09
・前書き
WebDAV の欠点のひとつにディスク容量制限がかけられないということがあります。
WebDAV Resource JP( http://webdav.todo.gr.jp/download/ )で公開されている Disk Quota を
使用したパッチが公開されていますが、
・使用者ごとにOS上でのアカウントを発行しなければならない
・apache の実行ユーザー権限問題
といったちと面倒な欠点を持っているので、ならば・・ということで全然別の方法で
実現させるようアパッチのソースを書き換えて自作してみました。
Apach-Users ML で疑問点を聞いた経緯もあるのでここで公開します。
『このパッチと同じアイディアのものはあるよ』とか『こっちのパッチのほうがいいよ』といった
情報がありましたら、サタケまで連絡を下さるとうれしいです。
Version: 2.5
・小林氏から「2GB超のファイルがある場合、正常に容量判定していない」という指摘をいただきました。(ありがとうございました)
⇒2GB超対応
・システム依存版の容量判定時のクラスタ計算にミスがあったのを修正
※apache の 2GB超 の対応について
apache 2.2.x で 2GB超 のファイルを扱えるようにするためにはコンパイル時にオプションとして
-D_LARGEFILE64_SOURCE
-D_FILE_OFFSET_BITS=64
を指定する必要があるようです。
指定する方法はいろいろとあるかと思いますが、環境変数 CFLAGS に上記文字列をセットして make する方法が簡単かと思います。
スクリプト例:
===
#! /bin/bash
CFLAGS="${CFLAGS} -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64"
export CFLAGS
buildconf && configure [オプション] && make
===
Version: 2.4
・Sebastian氏から「apache2.2.xで apr_lstat()が undefine」という指摘をいただきました。
んで apr_lstat() -> apr_stat() に変更
Version: 2.3
・eduardoh氏から「.htaccess内でDAVSATMaxAreaSizeを指定してぇ」とメールでリクエストが
来たので、対応。・・・でもあまりお勧めできませんが・・。
・大野氏(http://atwiki.jp/)より「<Directory> のなかで '*' 付きのディレクトリを指定した場合、容量制限が
効かない」という指摘をいただきました。(ありがとうございました)
んでそのバグ対応。
Version: 2.2
./buildconf を行うと configure が書き換えられてこのパッチであてた修正がチャラになってしまう不具合を修正。
この不具合を指摘してくれた Marco Gobenich 氏が 2.0.50 のSPRMパッケージにこのパッチを当てる方法や
そのときのスペックファイルを公開してくれてます。
http://www.needful.de/docs/projekte/webdav-quota/
感謝感謝!
■パッチのダウンロード
■パッチの処理の説明
■パッチをあてたapacheのmake方法
■WebDAVの設定(ディスク容量制限の設定)
・WebDAVパッチのダウンロード
WebDAV容量制限パッチ(システム依存版):
[latest]http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.17-quota-2.5.txt
[latest]http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.0.64-quota-2.5.txt
http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.16-quota-2.5.txt
http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.15-quota-2.5.txt
http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.14-quota-2.5.txt
http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.13-quota-2.5.txt
http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.12-quota-2.5.txt
http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.3-quota-2.5.txt
http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.0.63-quota-2.5.txt
WebDAVパッチアーカイブファイル(システム非依存版):
[latest]http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.17-quota-2.5any.txt
[latest]http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.0.64-quota-2.3any.txt
http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.16-quota-2.5any.txt
http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.15-quota-2.5any.txt
http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.14-quota-2.5any.txt
http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.13-quota-2.5any.txt
http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.12-quota-2.5any.txt
http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.2.3-quota-2.5any.txt
http://dirkschneider.o.oo7.jp/webdav/files/webdav-2.0.63-quota-2.3any.txt
・パッチの処理の説明
webdav-2.0.55-quota-2.3.txt システム依存型パッチ
webdav-2.0.55-quota-2.3any.txt システム非依存型パッチ
webdav-2.0.55-quota-2.3.txt はシステムに依存します
具体的には lstat() 関数を使用してストレージ上のデータ占有サイズを計算しています。
一応、算出するサイズは "du -sk" の出力とあわせてあるつもりです。
ただし、ハードリンクは考慮していません。重複してサイズを計算しますが、WebDAV上での
使用ということであまり問題は無いかな・・と勝手に判断して入れ込みませんでした。
大抵の Unix系OSには lstat() 関数が実装されていると思いますが、もし無い場合は
ある関数に変更するか、システム非依存バージョンのパッチをあててください。
ただしシステム非依存のパッチは lstat() を使用せずにアパッチの内部関数でファイルサイズを
合算するだけですので、実際にストレージを占有しているサイズと合致しません。
一応クラスタサイズを quota.h 内で定義(デフォルトで 4k )し、クラスタサイズに変換してから
合算していますので、小さいファイルが大量にあっても激しく違う値が出るということは
ないとは思います・・・たぶん。
このクラスタサイズは、quota.h 内で
#define DAV_CLUSTER_SIZE 4096
としている部分を書き換えるか、コンパイラオプションに -DDAV_CLUSTER_SIZE=xxx 等と指定して
ご自分のストレージのものに書き換えればより近い値で使用量が出てくると思います。
設定の方法はWebDAVの設定(ディスク容量制限の設定)を参照していただくとして、
それに関連してちとわからない点が・・。
※1参照
思うに追加した DAVSATAreaPath ディレクティブは内部処理をうまくすることで
必要なくなるかと想像するのですが、
・uri -> fullpath 変換
・module 内で <Directory>なのか <Location>なのかの判別
( request_rec->filename と dir の違いで判別?
でも↑だとリクエストごとに毎回処理しないと・・)
のしかたが良くわからなかったので、それならば・・ってことで追加したディレクティブな
もんですんで。
この辺の情報をお持ちの方も、もしよかったら教えてはくれませんでしょうか・・。
・apache アーカイブの解凍
下記のように解凍します。
#gtar xvfz httpd-2.0.55.tar.gz
・パッチをあてる
#cd httpd-2.0.55
としてディレクトリ内に入り、その場所にパッチファイル webdav-2.0.55-quota-2.3.txt を置く。
#patch -p2 < webdav-2.0.55-quota-2.3.txt
として apache にパッチをあてる
webdav-2.0.55-quota-2.3.txt:
このパッチで次の3つのファイル modules/dav/main/mod_dav.c, configure,
modules/dav/main/config5.m4 を変更し、
次の2つのファイル modules/dav/main/quotachk.h, modules/dav/main/quotachk.c を
新たに追加します。
・apache の make
あとは mod_dav , mod_davfs が on になるように configure & make してください。
configure は私の場合は以下のようにしました。
#./buildconf
#./configure \
--enable-modules=most \
--enable-mods-shared=all \
--enable-ssl \
--with-ssl=/usr/local/ssl
#make
#su
#make install
・WebDAVの設定
WebDAV の各種設定に関しては、さまざまなWebページや書籍を参考にしてください。
※参考URL
WebDAV Resources (http://www.webdav.org/)(本家)
WebDAV Resources JP (http://webdav.todo.gr.jp/)(日本版)
ここではサタケが作成したディスクの容量制限に関する部分についての設定について説明します。
設定の追加
(1)DAVSATMaxAreaSize ディレクティブを追加しました
このディレクティブで各ディレクトリ以下の容量を制限できます。
WebDAV はこのディレクティブで示されたディレクトリ以下の合計容量が指定された
サイズ以下になるように書き込み時に監視するようになります。
指定するMAXサイズはKB単位の数字のみ(計算式は不可)で指定してください
このDavMaxAreaSizeディレクティブを指定しないか、0を指定すれば容量チェックは行いません。
※1参照
注1:
このディレクティブを<Directory>以下に配置せず、<Location>以下に配置する場合は、
次の説明するDAVSATAreaPathディレクティブの指定も必ず行ってください。
<Location>以下に配置した場合はDAVSATAreaPathの指定をしないと容量チェックは行われません。
注2:
シンボリックリンクは追いかけません。容量算出ルーチンの出力は du -sk コマンドにあわせました。
(このシンボリックリンクに未対応なのもWebDAVの欠点・・なんとかならんかなぁ〜)
ただし、du コマンドはハードリンクを考慮しますが、このルーチンは考慮しません。
同じ Directory 以下にハードリンクされたファイルはそれぞれ容量を持っているものとして
算出します。
設定例)
DAVLockDB /usr/local/apache2/logs/DAVLock
Alias /dav-test-one "/var/NAS/00001"
<Directory "/var/NAS/00001">
DAV on
#
# このディレクトリ以下の容量を100MBに制限
#
DAVSATMaxAreaSize 102400
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
Alias /dav-test-two "/var/NAS/00002"
<Directory "/var/NAS/00002">
DAV on
#
# このディレクトリ以下の容量を100KBに制限
#
DAVSATMaxAreaSize 100
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
この例では /dav-test-one は 100MB , /dav-test-two は 100KB に
容量制限されます。
※1参照
(2)DAVSATAreaPath ディレクティブを追加しました
DAVSATMaxAreaSize の項で記したとおりapacheでは<Directory>,<Location>を
解析順序の違い以外、あまり区別していない(ように思う・・んだけど)ので、<Location>以下で
指定した場合に必須のものになります。
このディレクティブでは<Directory>だった場合のパラメータをそのまま指定します。
上記の設定例を<Location>でした場合の例を示せば、すぐにわかると思います。
例)
DAVLockDB /usr/local/apache2/logs/DAVLock
Alias /dav-test-one "/var/NAS/00001"
<Location "/dav-test-one">
DAV on
#
# このディレクトリ以下の容量を100MBに制限
#
DAVSATMaxAreaSize 102400
DAVSATAreaPath /var/NAS/00001
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Location>
Alias /dav-test-two "/var/NAS/00002"
<Location "/dav-test-two">
DAV on
#
# このディレクトリ以下の容量を100KBに制限
#
DAVSATMaxAreaSize 100
DAVSATAreapath /var/NAS/00002
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Location>
上記のように容量チェックを行うディレクトリを指定してください。
モジュール内では、書き込もうとしているファイルのフルパスとこのディレクトリ名を
比較して正当性をチェックしていますので、このディレクティブで素っ頓狂なパスを
指定しても容量チェックは行われませんので、typoなどに注意してください。
・その他
・容量制限は階層化できます。例えば /dav-one/pub は 10KB 、/dav-one/etc は 20KB 、
その他のディレクトリをあわせて /dav-one 全体で 50KB ・・のような指定です。
・version 2.3 からは容量制限DAVSATMaxAreaSizeは .htaccess 等で上書き設定できます。
警告メッセージが error_log に出る場合は、.htaccess 内に DAV On を入れておくと
出なくなります。・・・でもあまりこの方法はお勧めしませんが・・・。
※1
2.0 からは DAVSATAreaPath の定義を削除しています。
逆に conf ファイル内にあるとエラーを起こします。
佐竹輝之