4

FUSE を使用して基本的なファイルシステムを実装し、予見可能なすべての POSIX 機能を実装しました [もちろん、まだプロファイリングしていません ;)]。現在、通常のファイル(st_mode & S_IFREG)でファイルシステムを実行できますが、開発の次のステップは、実際のブロック デバイスでホストすることです。コードをそのまま実行すると、デバイスst_sizeで呼び出しfstatた後、すぐに読み取りに失敗します。もちろん、問題がそこで止まるとは思っていません。

  • 通常のファイルではなく、ブロック デバイスで操作するには、どのような変更が必要ですか?
  • パフォーマンス、制限、特別な機能などに関して、特別に考慮する必要があることは何ですか?
  • ブロック スペシャル ファイルの取り扱いに関するチュートリアルやリファレンスはありますか? グーグルはほとんど役に立ちません。私は背景知識 (皮肉なことに私の暗い過去の MSDN から) とマンページにいくつかの乏しい情報しか持っていません。

Update0

  • 「通常のファイル」の意味を指摘しました。
  • デバイスのサイズを取得することに集中したくありません。パフォーマンスと使用に関する通常のファイルとデバイス ファイルの違いに関する一般的なガイドラインが必要です。
4

2 に答える 2

4

現在、通常のファイルでファイルシステムを実行できますが、開発の次のステップは、実際のブロック デバイスでホストすることです。

私はあなたが何を意味するのか完全には理解していません.「あなたは現在、ファイルシステムのデータを通常のマウントされたファイルシステムのプレーンファイルに保存していますが、データストレージに生のブロックデバイスを使用したいと考えています」.

もしそうなら、これを数回行った後、次のことをお勧めします。

  • ファイルシステムに「実際の」ブロックデバイスを使用しないでください。必ずパーティションを使用してください。そのようなファイルシステムがファイルシステムタイプである可能性があり、ファイルシステムがそれをチェックしてマウントできることを示すために使用できる、めったに使用されないパーティションタイプがいくつかあります。したがって、「/dev/sdb」のようなもので実行することは決してありませんが、データを /dev/sdb1 のようなものに保存し、それに何らかのパーティション タイプを割り当てます。これには、ファイルシステムを単一の物理ディスク上に別のディスクとして共存させることができるなど、明らかな利点があります。
  • ファイルシステムにキャッシングを実装している場合 (Linux がページ キャッシュで行うように)、O_DIRECT を使用してブロック デバイスへのすべての I/O を実行します。これには、すべての I/O を実行するためにページ アラインされたメモリを渡す必要があり、リクエストがセクタ/ブロック アラインされている必要がありますが、データがブロック デバイスからページ キャッシュに移動されるときに必要となるデータ コピーが削除されます。 、次にページキャッシュからユーザー空間の[ファイルシステム]リーダーに。

fstat が「失敗する」とはどういう意味ですか? これは、ブロック デバイスの長さを決定しようとしている fstat ですか? エラーが表示されますか? それは何ですか?

于 2010-12-21T02:43:48.470 に答える
2

ブロック デバイスはファイルと非常によく似た動作をします。dd などのツールは、特別な処理を行わなくてもブロック デバイスを操作できます。ただし、fstat は、それが参照する blockdev ではなく、特殊ファイル ノードに関する情報を返します。サイズを読み取るには、おそらく BLKGETSIZE64 ioctl を使用する必要があります。

ただし、未加工のデバイスでパーティションを使用する特別な理由はありません。blockdev は blockdev です。ワークロードが繰り返しアクセスを生成しないと仮定すると、O_DIRECT も適切です。ただし、ファイルシステムの永続性と原子性を確保するための実際のプロトコル (fsync、バリアなど) と混同しないでください。

于 2010-12-21T06:24:16.987 に答える