Gluster3.2.5 + Windows Server 2008 R2(NFS Client)の環境でファイル/フォルダが削除できないという問題に遭遇したので、ワークアラウンドのパッチを書きました。
[root@piyodesk glusterfs-3.2.5]# diff -uprN xlators/nfs/server/src/nfs3-helpers.c.orig xlators/nfs/server/src/nfs3-helpers.c --- xlators/nfs/server/src/nfs3-helpers.c.orig 2012-03-09 07:27:02.979568607 +0900 +++ xlators/nfs/server/src/nfs3-helpers.c 2012-03-09 07:28:01.889112681 +0900 @@ -578,7 +578,7 @@ nfs3_accessbits (int32_t accbits) accresult |= ACCESS3_READ; if (accbits & POSIX_WRITE) - accresult |= (ACCESS3_MODIFY | ACCESS3_EXTEND); + accresult |= (ACCESS3_MODIFY | ACCESS3_EXTEND | ACCESS3_DELETE); /* lookup on directory allowed only in case of execute permission */ if (accbits & POSIX_EXEC) @@ -595,7 +595,7 @@ nfs3_request_to_accessbits (int32_t accb if (accbits & ACCESS3_READ) acc_request |= POSIX_READ; - if (accbits & (ACCESS3_MODIFY | ACCESS3_EXTEND)) + if (accbits & (ACCESS3_MODIFY | ACCESS3_EXTEND | ACCESS3_DELETE)) acc_request |= POSIX_WRITE;
説明
本パッチ適用前は、ファイル/フォルダを削除しようとすると、こんな感じのエラーが出ます。
NFSv3では、クライアントがファイルアクセスを行う前に、アクセス権限の確認をサーバに対して行います。ここで必要な権限が得られないと、クライアントは上記のようなエラーを返して実際のアクセス処理は行いません。無事に権限が得られると、実際にアクセス処理を行います。
この時、最初に行われるアクセス権限確認は、実際のNFSサーバ上でのUnix/Linuxとしてのアクセス権限の有無とは独立して行われます。ローカルのUnix/Linuxとしてはアクセス権限があってもNFS経由ではアクセスさせたくない、などのアクセス制御を行うことが目的です。
一般にUnix/LinuxのNFSクライアントでは、ファイル/ディレクトリの削除については、NFSサーバから「ACCESS3_MODIFY」というフラグが返ると、権限があるものと認識します。ところが、WindowsのNFSクライアントでは、「ACCESS3_DELETE」というフラグでファイル/ディレクトリの削除権限の確認を行なうようです。(どちらの実装もNFSv3のRFCとは微妙にずれているので、どちらが正解と言えるものでもなさそうですが。。。)
Gluster3.2.5のNFSサーバは、「ACCESS3_DELETE」フラグを返していないのが前述のエラーの原因のようでしたので、「ACCESS3_MODIFY」とあわせて「ACCESS3_DELETE」も返すようにしたのが上記のパッチです。
Gluster3.2.1あたりは、xlators/nfs/server/src/nfs3-helpers.cの実装が若干違うので、上記のパッチをそのまま適用することはできませんが、本質的には同じ問題ですので、「ACCESS3_DELETE」フラグを返すように修正すればOKなはずです。。。
注意
前掲のパッチは、本ブログの筆者が独自に書いたものですので、ご利用にあたっては自己責任でお願いします。(某社が開発中のGlusterFS関連製品とは、一切関係ありません。同じ問題に対するパッチは入るとおもいますが、これと同じパッチかどうかは分かりません。。。。)
追記(2012/03/31)
Upstreamには同じパッチが入りました。http://review.gluster.com/#change,2872