Linuxでファイルシステムドライバードライバーを実装するにはどうすればよいですか?[閉まっている]


14

私が新しいファイルシステムを発明したと仮定して、今それのためにファイルシステムドライバーを作成したいと思います。

このファイルシステムドライバーをどのように実装しますか?これはカーネルモジュールを使用して行われますか?

また、ファイルシステムドライバーはどのようにしてハードディスクにアクセスできますか?ファイルシステムドライバーにハードディスクにアクセスするためのコードが含まれているべきですか、またはLinuxにはすべてのファイルシステムドライバーが使用するハードディスクにアクセスするためのデバイスドライバーが含まれていますか?

回答:


24

はい、Linuxのファイルシステムはカーネルモジュールとして実装できます。ただし、FUSE(USErspaceのファイルシステム)インターフェイスもあり、通常のユーザー空間プロセスをファイルシステムドライバーとして機能させることができます。新しいファイルシステムのプロトタイプを作成している場合、最初にFUSEインターフェイスを使用して実装すると、テストと開発が容易になります。ファイルシステムの内部をFUSE形式で解決したら、パフォーマンスが最適化されたカーネルモジュールバージョンの実装を開始できます。

カーネル空間内にファイルシステムを実装するための基本情報を次に示します。それはかなり古い(1996年から!)が、少なくともあなたがやらなければならないことの種類についての基本的な考えを与えるはずだ。

FUSEルートへの移動を選択した場合、これはFUSEインターフェイスのユーザースペース側のリファレンス実装であるlibfuseです。

カーネルモジュールとしてのファイルシステムドライバー

基本的に、ファイルシステムドライバーモジュールの初期化関数は、register_filesystem()関数を呼び出すだけで、ファイルシステムを識別する最初のステップとして使用されるファイルシステムドライバーの関数を識別する関数ポインターを含む構造体をパラメーターとして与えるだけで済みます。タイプして取り付けます。その段階ではこれ以上何も起こりません。

ファイルシステムがマウントされ、ドライバーに一致するファイルシステムタイプが指定されているか、ファイルシステムタイプの自動検出が実行されている場合、カーネルの仮想ファイルシステム(略してVFS)レイヤーがその関数を呼び出します。基本的には「標準のLinuxブロックデバイスのカーネルレベルの表現へのポインターです。それを見て、処理できるものかどうかを確認し、それで何ができるかを教えてください。」

その時点で、ドライバーは、ファイルシステムに適切なドライバーであることを確認するために必要なものをすべて読み取り、その特定のファイルシステムでドライバーが実行できる追加機能へのポインターを含む構造を返します。または、ファイルシステムドライバーがディスク上のデータを認識しない場合、適切なエラー結果を返すことが想定されており、VFSはユーザースペースにエラーを報告するか、またはファイルシステムタイプの自動検出が実行されている場合、別のファイルシステムを要求しますしようとするドライバー。

カーネル内の他のドライバーは標準ブロックデバイスインターフェイスを提供するため、ファイルシステムドライバーはハードウェアサポートを実装する必要はありません。基本的に、ファイルシステムドライバーは、デバイスポインターを指定した標準のカーネルレベルの関数を使用して、ディスクブロックを読み書きできます。

VFSレイヤーは、ファイルシステムドライバーが多くの標準機能をVFSレイヤーで利用できるようにすることを期待しています。これらのいくつかは、VFSレイヤーがファイルシステムで何か意味のあることを行うために必須であり、他はオプションであり、そのようなオプション関数へのポインターの代わりにNULLを返すことができます。


1
これは、ブロックデバイスレイヤーが構築するファイルシステムレイヤーに提供する機能についても少し説明する必要があると述べているように、質問に完全に答えるにはかなり良い答えです。
カスペルド

「これは標準ブロックデバイスへのポインタです」というビットを使ってそれをほのめかしましたが、良い点です。私はそれを拡張しました。
telcoM

この答え、具体的には何が何の順序で起こるのかという記述は神聖なものです。「Linuxがどのように機能するか」すべてについて、そのような説明がある本やWebサイトを読むことができますか?
アダムバーンズ

Linux Kernel InternalsまたはLinux Device Drivers、3rd Editionに興味があるかもしれません。そしてもちろん、実際のソースコードを読むオプションがあります。
telcoM

5

はい、カーネルドライバーはファイルシステムを管理できます。

モックアップ、ファイルシステムのプロトタイプの最良の解決策は、FUSEを使用することです。そして、それをカーネルドライバーに変換することを考えた後。

ウィキペディア=> https://en.wikipedia.org/wiki/Filesystem_in_Userspace

ソース=> https://github.com/libfuse/libfuse

チュートリアル=> https://developer.ibm.com/articles/l-fuse/


0

はい、これは通常、カーネルモジュールとしてロードするか、カーネルにコンパイルできるカーネルドライバーを使用して行われます。

ここで、同様のファイルシステムドライバーとその動作を確認できます

これらのドライバーは、おそらく内部カーネル関数を使用して、バイトのブロックとしてストレージデバイスにアクセスしますが、ブロックデバイスを使用して、 ブロックデバイスおよびキャラクターデバイスフォルダー内のブロックデバイスをます。


0

fuseを使用して、ユーザーランドのファイルシステムを作成したり、カーネルモジュールを作成したりできます。言語を選択できるため、fuseを使用する方が簡単で、カーネル(したがってシステム全体)がクラッシュすることはありません。

カーネルモジュールはより高速になりますが、最適化の最初のルールは次のとおりです。動作するコードをテストするまで実行しないでください。2つ目はそのようなものです。遅すぎるという証拠が得られるまで実行しないでください。3番目:高速化/小型化する証拠がない限り、保持しないでください。

はい、カーネルには既にハードウェア用のドライバーがありますので、それらを再実装しないでください。


FUSEにはパフォーマンス以外に大きな欠点があります。ルートファイルシステムに使用するのは困難です。(おそらくinitrdでも可能ですが、FUSEバイナリはRAMディスクから実行されるため、ブート後に解放できませんでした。)
Peter Cordes

1
@PeterCordes 解放できませんでしたが、リンクを解除できないわけではありません。まだ参照がある場合は、initramfsを終了し、基礎となるバイナリを削除したかどうかに関係なく、メモリに保持されます。
フォレスト

@forest:そうです。したがってpivot_root、initramfsにはビジーなiノードがまだあるため、initrdをアンマウントできません。
ピーター

/initinitramfsから開始された通常は、/initpivot_rootの後に実行され、制御を実際のルートFSに移し/initます。しかし、ルートFSへのアクセスがカーネルに応答するFUSEプロセスに依存している場合、FUSEバイナリはそれ自体をexecveに置き換えることができませんでした。最初にページキャッシュをプライミングすることで、おそらく信頼できるとは言えません。
ピーター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.