SMB と NFS のロックについて
こんにちは。辻村です。
今回は、「ロック」を通して、SMBとNFSのプロトコルの差を考えてみたいと思います。この記事は、古いブログにあった「SMB と NFS のロックについて」のアンコールです。加筆・訂正がしてあります。
1. ロックはなぜ必要か?
コンピュータが稼働している中で、同じファイルが必要であったり、同じリソースを使いたいことがある。しかしながら、同時に使えないときに何らかの形で使う側の数を制御する必要がある。これを排他制御という。ロックはこの排他制御をおこなうための一つの手段である。例えば、複数のアプリケーションやクライアントから同じファイルを操作していた場合、ある瞬間特定のアプリケーションやクライアントが他に邪魔されることなく読みだしや書き込みを行えることが必要がある。書き込みの場合は特に同時に書き込むことはファイルやデータが壊れることになるので、この仕組みは大切である。
ロックの種類は大きく分けて 2 種類あり、強制的なロック (mondatory lock) とアドバイザリーロック(advisory lock)というものが存在する。前者はロックをかけたら他者は一切使うことができないロックであり、後者は、ロックがかかっていることを通知した上で、どうするかは通知された側に任せるというものである。後者ではロックがかかっているときの「お行儀の良い」振る舞いはアプリケーションに任されている。
2. Windows のロック
本稿を書くにあたって、今一度マイクロソフトさんの以下の記事を拝見し、読み直してみたが、機能を指す名称として「〜lock」という表記は見当たるもの、「これは排他制御のために使うものである」というような記載は全く見当たらない。しかしながら、クライアントが何か作業をする間、邪魔をされないように、あるいは影響を与えないように抑止する動きはロックであると思う。Windows のロックの基本は Mandatory Lock である。
Client caching features: Oplock vs. Lease
歴史のある OS なので、ロックの種類も何種類かある。以下に簡単にまとめておく。
・Batch Oplock(SMB1/SMB2) 全ての Windowsで利用可能。
・Level II Oplock(SMB1/SMB2) 全ての Windowsで利用可能。
・Exclusive Oplock(SMB2.0以降)
Windows 2008 以降、Windows 7 以降で利用可能。
・Lease (SMB 2.1 以降)Windows 7, 8, 10, 2008R2, 2012以降で利用可能。
2.1 Batch Oplock
Batch Oplock は排他的なロックで、あるクライアントが継続的に実際にはファイルを閉じることなく、オープン、書き込み、読みだしの操作をおこなうためのロックである。排他的であるがゆえに複数のクライアントから操作を同時におこなうことはできない。
2.2 Level II Oplock
Level 2 Oplock は複数のクライアントか同時に読みだしをおこなえる種類のロックである。読みだしは可能であるが、書き込みは禁止される。このロックは複数のクライアントから設定できるので排他的なロックではない。
2.3 Exclusive Oplock
Exclusive Oplock は排他的なロックであり、読みだし、書き出し両方に使うことができる。
2.4 ロックの解除
他のクライアントがロックの要求をおこなったとき、ロックを保持しているクライアントは Oplock Break の通知を受け取る。クライアントは処理が住んだところで Oplock Break に対する ACK をサーバーに送り、これを受け取った時点でサーバーが先に処理を進めることができる。
2.5 Lease
Lease は SMB 2.1 から実装された機能で、「実際には Oplockに付け加えられた新しいタイプだが紛らわしいので別の名前をつけてある」とブログには書かれている。
利用できるロックの種類と、状態遷移については、 [MSDN-FSBO] Microsoft Corporation, “File System Behavior in the Microsoft Windows Environment”, June 2008 をご参照いただきたい。
3. NFSv3のロック
NFSv3 でロックをつかさどるのは lock manager あるいは lockd の名前で知られるプロセスだ。このプロセスははクライアントからの要求に応じてロックに仕組みを提供するが、ロックの仕組み自身はアドバイザリーロックだ。アドバイザリーロックが意味することは、ロックがかかっていることがわかったときにクライアントが「お行儀良く」振る舞うことを期待してロックが設計されていることを意味する。別のいい方をすれば、ロックを無視してアクセスするクライアントを止めることはできない。
NFSv3はステートレスなプロトコルなので、実際にはサーバー側とクライアント側のロックマネージャがロックの状態を持っている。サーバーなどがクラッシュした際には、ロックの条件を回復するためにグレースピリオド (grace period) と呼ばれる時間が設けられている。詳しいことをお知りになりたい方は 、サーバー側あるいはクライアント側がクラッシュした際の動きまで書かれている、NFS Illustrated がお勧めだ。
4. NFSv4 のロック
NFSv4 は NFSv3 と異なりステートフルなプロトコルである。従ってロックの状態自身がプロトコルに含まれてくることになる。
NFSv3 ではロックの仕組みは読み書きの仕組みとは別に用意されていたので、明示的にロックの指定、解除をおこなっていた。「ロックししているはず」という情報はサーバー側でもクライアント側でも持っており、statd を通じてその状態遷移を制御していた。
これに対し、NFSv4 ではロックはあくまでも「サーバー側の見解」に従って実現される。クライアントはファイルに対して読み書きしたときにロックがかかっていることを知ることになる。ロックがかかっていることを知っても プロトコル上は READ/WRITE を送ってファイルの操作が実施できてしまう NFSv3 と異なり、NFSv4 の規格ではコマンド自体で何も操作されるものはない。また、ロック自体に期限があり、これをリースという。ロックを保持しているクライアントはリースの期限が切れる前に OPEN/READ/WRITE などの操作の中で期間を延長 (renew) することによってロックを保持し続けることができる。
このあたり、NFSv4 のロックは SMB のロックに互換性を持たせるように寄せている(あるいはお互いに同じような仕組みをつかっている)ようにみえる。
5. NFS のロックと SMB のロックの互換
ここまで細かく見てきたが、NFSv3 と SMB のロックには互換性がない。一方は POSIX のアドバイザリーロックであり、SMB は基本的に強制的なロック (mondatory lock) をモデルとしてつかっているからだ。また、バイト単位でロックの範囲を指定することが NFSv3 では行えない。Windows 2003 の NFS サーバーは何もしないと強制的なロック (mondatory lock) をつかってしまっていたらしく、以下のような文書が出ている。
Microsoft KB: ファイルのアドバイザリ ロックを有効にする
参考文献
Windows のロックおよび振る舞いについての参考文献
Microsoft Open Specifications Support Team Blog – Client caching features: Oplock vs. Lease Client caching features: Oplock vs. Lease
Microsoft Technet: Windows Server 2012 R2: Which version of the SMB protocol (SMB 1.0, SMB 2.0, SMB 2.1, SMB 3.0 or SMB 3.02) are you using?
MSDN: ファイルのアドバイザリ ロックを有効にする
Windows のプロトコル自身の参考文献
Microsoft Protocol Archive: [MS-SMB]: Server Message Block (SMB) Protocol
Microsoft Protocol Archive: [MS-SMB2]: Server Message Block (SMB) Protocol Versions 2 and 3
Microsoft Protocol Archive: [MS-CIFS]: Common Internet File System (CIFS) Protocol
NFS のロックおよび振る舞いについての参考文献
書籍: NFS Illustrated, Chapter 10 “NFS Lock Manager Protocol,” by Brent Callaghan, ADDISON–WESLEY, ISBN: 9780321618924
RFC 1813 NFS Version 3 Protocol Specification
RFC 3530 Network File System (NFS) version 4 Protocol
RFC 5661 Network File System (NFS) Version 4 Minor Version 1 Protocol