FreeBSDのNFSでファイルロックをとれるようにする

FreeBSDのNFSでファイルロックをとれるようにする。

OSのバージョンは、サーバ側がFreeBSD 7.3(FreeNAS 0.7.2)、クライアントがFreeBSD 8.2。6系列だと動かないとか。

ずっと、NFSではファイルのロックがとれないと聞いていた(思い込んでいた)けど、さっくり調べたらLinuxではとれるとか。 だったらFreeBSDでもいけるっしょ、と調べてみた。

結論から行くとロックはとれる様子。

まずはテストコードを書いてみた。

<?php
$fp = fopen("/mnt/nfs/hoge.txt", "r+");
if(flock($fp, LOCK_EX)){
 echo 'got exclusive file lock'."\n";
 flock($fp, LOCK_UN);
}else{
 echo 'cannot get file lock'."\n";
}
fclose($fp);
?>

shell> touch /mnt/nfs/hoge.txt
shell> php flock.php
cannot get file lock

ファイルのロックはとれていない。これが普通の(mountでnfsserver:/path/to/mount /mnt/nfsとかしたときの)nfsをマウントしたときの動作。いままではここであきらめていたけどここからちょっと突っ込んでみる。

さっくり調べてみるとrpc.lockd, rpc.statdを起動させるとロックが取得できるらしい。で、早速起動させてみる。rc.confに以下を追加して起動する。


shell> grep rpc /etc/rc.conf
rpc_lockd_enable="YES"
rpc_statd_enable="YES"

shell> sudo /etc/rc.d/statd start
shell> sudo /etc/rc.d/lockd start

shell> php flock.php
got exclusive file lock

サーバ側でもrpcを走らせる必要があるとか色々書いてあった。今回サーバはFreeNASのNFSを使っている。確認したらrpc.{statd, lockd}は動いていた。


shell> ssh freenas ps auxww | grep rpc

root         69671  0.0  0.0  6912  1452  ??  Ss   Mon10AM   0:00.37 /usr/sbin/rpcbind
root         69955  0.0  0.0 267976  1348  ??  Is   Mon10AM   0:00.03 /usr/sbin/rpc.statd
root         69992  0.0  0.0  6912  1300  ??  Is   Mon10AM   0:00.00 /usr/sbin/rpc.lockd

おかげでうまくいっているみたい。めでたしめでたし。

参考リンク

http://groups.google.com/group/mailing.freebsd.fs/browse_thread/thread/0cd34288efff29ec/d8202d636557a2ae

「FreeBSDのNFSでファイルロックをとれるようにする」への1件のフィードバック

コメントを残す