Linux NFSサーバーがユーザースペースアプリケーションではなくカーネルに実装されている理由を知りたいです。
私も知っていますユーザー空間NFSデーモン存在しますが、NFSサーバーサービスを提供する標準的な方法ではありません。
NFSサーバーをユーザースペースアプリケーションとして実行することは、カーネルの代わりにユーザースペースでデーモンを実行して追加のセキュリティを提供するので、これは好ましいアプローチだと思います。また、一般的なLinuxの原則に準拠しています。つまり、1つのことをうまくやってください(そしてデーモンはカーネルの仕事になるべきではありません)。
実際、カーネルで実行するときに私が考えることができる唯一の利点は、コンテキスト切り替えによるパフォーマンスの向上です(これが議論の余地がある理由です)。
それでは、これが実装されるべき文書化された理由はありますか?インターネットを検索しようとしましたが、何も見つかりませんでした。
多くの混乱があるようです。ファイルシステムのマウントについて尋ねるのではなく、提供について尋ねることです。ネットワークファイルシステムのサーバ側。非常に明確な違いがあります。ファイルシステムをローカルにマウントするには、カーネルがファイルシステムをサポートする必要があります(sambaやunfs3など)。
答え1
unfs3
私が知っている限り死んだ。ガネーシャまだ完全に成熟していませんが、現在最もアクティブなユーザースペースNFSサーバープロジェクトです。
Samba は異なるプロトコルを提供しますが、ユーザー空間で実行される成功したファイルサーバーの例です。
最近のパフォーマンス比較を見たことがありません。
その他の質問:
- 一般的なアプリケーションはパス名でファイルを検索しますが、
nfsd
ファイルハンドルとして見つけることができるはずです。これはトリッキーで、ファイルシステムのサポートが必要です(すべてのファイルシステムがそれをサポートできるわけではありません)。以前はユーザースペースでこれを行うことはできませんでしたが、最近カーネルにはシステムコールが追加されましたname_to_handle_at(2)
。open_by_handle_at(2)
- ファイルロック呼び出しをブロックするのが問題だったことを覚えているようです。現在のユーザースペースサーバーがこれをどのように処理するのかわかりません。 (ロックを待っているサーバースレッドを占有していますか、それともポーリングしていますか?)
- 最新のファイルシステムの意味(変更属性、委任、共有ロック)は、最初にカーネルで実装するのが簡単になる可能性があります(理論的にはほとんど実装されていません)。
- 権限、クォータなどを手動で確認するのではなく、uidを変更してこれを実行するために共通のカーネルvfsコードを使用しようとしています。 Linuxには、これを実行できるシステムコール(
setfsuid(2)
)があります。忘れられた理由のために、サーバーでこれを使用することが予想よりも複雑になることがわかりました。
通常、カーネルサーバーの利点は、vfsとエクスポートされたファイルシステムとの緊密な統合です。より多くのカーネルインタフェース(ファイルハンドルシステムコールなど)を提供することでこれを補完できますが、それは簡単ではありません。一方、最近人々がエクスポートしようとしているいくつかのファイルシステム(Glusterなど)は、実際には主にユーザースペースに存在します。 FUSE を使用してカーネル nfsd からエクスポートできますが、新機能には FUSE インターフェイスへの拡張が必要になり、パフォーマンスの問題が発生する可能性があります。
ショートバージョン:良い質問です!
答え2
Olaf Kirchは、もともとNFSサーバーのユーザースペースとカーネルベースのバージョンを開発しました。彼は2000年に書いた「Linux Network Management」という本でこう述べています。
私の考えでは、パフォーマンスを向上させるためにNFSサーバーをカーネルに移動した後に再び取り出す理由がないと思う人はいませんでした。
答え3
Starnamerが正しいです(私はベータテスターの一人です)。
悪いパフォーマンス(主にPCNFSクライアントの場合)を改善するためにカーネルに挿入され、問題が解決したら、誰も興味を持っていませんでした。
カーネルで NFS を使用するにはいくつかの欠陥があります。その中で最も重要なのは、同じファイルシステムを扱う他のものとうまく機能しないことです(重大な破損の危険性があります)。当時(1993-4)これが問題になる可能性があります。
私たちはより若く、もっと愚かです。