すべてのファイルシステムが一時的であると仮定すると、ls、touch、catなどのツールはどのように対話しますか?私の考えでは、 'ls'はbtrfsの詳細を知りませんが、とにかくディレクトリエントリを読みます。プロセスがファイルに書き込むとき、特定のファイルシステムのブロックアロケータに関する詳細を知らないが、それに関係なくファイルは正常に記録される。
プロセスでネイティブファイルシステムの実装を隠す一種のカーネルAPIはありますか?学術目的のためにカスタム単純ファイルシステムを設計し、それを機能させるためのプログラム(mkfs、fsckなど)を書くことはそれほど複雑ではありませんが、カーネルファイルシステムの実装を他のプロセスで使用するようにどのように指示しますか?
編集:
私はユーザー空間のシステムコールについて理解していますが、私が本当に興味を持っているのは、後でカーネル空間で起こることです。
ベストアンサー1
open
すべての POSIX システムでアプリケーションとカーネル間のインタフェースは、、、read
などwrite
の複数の関数呼び出しです。たとえば、close
アプリケーションはcat
これらの関数を呼び出します。これらの関数が背後でどのように実装されるかは重要ではありません。
Unixシステムでは、これらの機能は実際にはシステムコール: アプリケーション呼び出しコア。カーネル内部の一般的なアーキテクチャは次のとおりです。仮想FSファイルシステムの形式とは無関係の操作(たとえば、正しいファイルシステムの検索、権限、ロックなど)を処理する階層。ファイルが存在するファイルシステムが決定されると、VFS層はジョブを正しいファイルシステム固有のドライバに渡します。
次のツールを使用して、アプリケーションとカーネル間のインターフェースを観察できます。ストレスLinuxまたは他のUnixプラットフォーム(trace
、、、truss
...)の同等の製品。はい(開始および最終クリーンアップのためのトレース部分を省略cat
):
$ strace cat foo
…
open("foo", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=6, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
mmap(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8b9ea14000
read(3, "hello\n", 131072) = 6
write(1, "hello\n", 6hello
) = 6
read(3, "", 131072) = 0
munmap(0x7f8b9ea14000, 139264) = 0
close(3) = 0
…
ファイルとでcat
呼び出しを表示できますopen
。また、パフォーマンスを最適化するためにのみ呼び出されると思います。read
close
fstat
fadvise64
VFSとファイルシステムドライバ間のインターフェイスは簡単に監視できません。
プログラムはファイルを扱わずに記憶域を扱うので、カーネルのファイルシステムインタフェースを好むがmkfs
通過しません。fsck
彼らは訪問するブロックデバイスファイルシステムを直接含めます。
新しいファイルシステムのサポートを追加するには、そのドライバを作成する必要があります。この問題を解決する方法は2つあります。
- カーネルで実行されるドライバを作成できます。これは最高のパフォーマンスを提供し、きめ細かいアクセス制御などの特定の機能を実装する唯一の方法です。ただし、デバッグも難しくなります(ドライバにバグがある場合は再起動が必要になる場合があります。運が良ければ、エラー追跡を確認し、データが保存されるまで再起動を遅らせることがあります。)仮想マシンでこれを行います。 )実装する必要があるインターフェースについては、Unixバリアントカーネルに関するドキュメントを見てください。
- または、次のものを使用できます。ヒューズ、すべての要求をカーネルの外部に戻すファイルシステムドライバであるため、各ファイルシステムドライバはプロセスとして実装されます。ファイルシステムに問題がある場合は、ファイルシステムドライバプロセスを終了しても、残りのオペレーティングシステムは存在し続けることがあります。 FUSEファイルシステムを作成する方法については、次を参照してください。はい次のチュートリアルを読んでください。スミットシン。