ユーザースペースではなくカーネルにLinux NFSサーバーが実装されているのはなぜですか?


33

Linux NFSサーバーがユーザースペースアプリケーションではなくカーネルに実装されているのはなぜだろうと思っていましたか?

ユーザースペースNFSデーモンが存在することは知っていますが、NFSサーバーサービスを提供する標準的な方法ではありません。

NFSサーバーをユーザースペースアプリケーションとして実行することは、カーネルではなくユーザースペースでデーモンを実行することでセキュリティを強化できるため、好ましいアプローチだと思います。また、1つのことを行い、それをうまく実行するというLinuxの一般的な原則にも適合します(そして、デーモンはカーネルの仕事であってはなりません)。
実際、カーネルで実行することで考えることができる唯一の利点は、コンテキストの切り替えによるパフォーマンスの向上です(そして、それは議論の余地のある理由です)。

それで、それがそのままの形で実装されている理由は文書化されていますか?私はグーグルで試しましたが、何も見つかりませんでした。


多くの混乱があるようです。ファイルシステムのマウントについては質問せず、ネットワークファイルシステムのサーバー側の提供について質問しています。非常に明確な違いがあります。ファイルシステムをローカルにマウントするには、カーネル内のファイルシステムをサポートする必要があります(sambaまたはunfs3など)。


NFSはファイルシステムです。ユーザー空間ファイルシステムドライバーはFUSEを使用する必要がありますが、これは一般にパフォーマンスが低下します。
ヨルダン

@jordanmいいえ、そうではありません。実際、FUSE経由でネットワークファイルシステム(NFS、CIFS / samba、codaなど)を実行することはできません。FUSEは、ファイルシステムをローカルマシンにマウントするためのものであり、ファイルシステムを提供するためのものではありません。
パトリック

あなたは正しい、私の声明はクライアントにのみ適用されます。
ヨルダン

残念ながら、@ jordanmもそうではありません。FUSEなしでファイルシステムをマウントできます。とにかく、FUSEは比較的新しいテクノロジーであり、ネットワークファイルシステムのクライアント側はFUSEが登場するずっと前から存在していました:-)。FUSEは、カーネルによって提供されていないファイルシステムをサポートする方法を提供します(誤解を解消することを望んでいるだけでありません:-P)
パトリック

2
@StarNamerあなたはまだクライアントについて話している。私はサーバーについて話している。unfs3カーネルのサポートなしで(NFSサーバーである)実行できます。
パトリック

回答:


25

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
読者は、ブルースがLinux NFSサーバーのメンテナーであることに注意する必要があります。したがって、彼はおそらく彼が話していることを知っています。:)
ダンプリッツ14年

@derfian FYI- unfs3生きていてGithubに移行している」という効果について、ここでコメントしたいかもしれません。
ms-ati

@derfian、またはStackOverflowのユーザ(ので、私は上記のコメントunix.stackexchange.com/users/23034/derfian)、unfs3のメンテナで、最近はそれが、例えば、死んでいなかったと発表、このGithubのコメント
MS-atiの

NFSメンテナーによって書かれた場合、この答えはかなりあいまいです。
トーステンブロンガー

18

Olaf Kirchは当初、NFSサーバーのユーザー空間とカーネルベースのバージョンの両方を開発しました。2000年の本「Linux Network Administration」で彼は次のように述べています。

2.2.0カーネルは、Olaf Kirchが開発し、HJ Lu、G。Allan Morris、およびTrond Myklebustがさらに開発した実験的なカーネルベースのNFSサーバーをサポートしています。カーネルベースのNFSサポートにより、サーバーのパフォーマンスが大幅に向上します。

NFSサーバーがパフォーマンスを向上させるためにカーネルに移動した後は、誰も再びそれを削除する理由はないと思います。


8

Starnamerは正しいです(私はベータテスターの1人でした)。

カーネルにそれを入れることは、(主にPCNFSクライアントに対する)ひどいパフォーマンスを改善する試みであり、一度その問題が解決されると、誰もそれをも​​う一度見ませんでした。

カーネルにNFSを使用することには多くの欠陥がありますが、特に、同じファイルシステムに触れる他のものとうまく機能しない(深刻な厄介な破損リスクがある)ことですが、当時(1993-4)それが問題になることがわかっていない。

私たちは若くて愚かだった、などなど。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.