5

こんにちは、私はカーネルプログラミングの初心者です。バックアップ メカニズムを実装するための wrapfs テンプレートに基づく小さなカーネル モジュールを作成しています。これは純粋に学習ベースです。

書き込み呼び出しが行われると、wrapfs が別のディレクトリにそのファイルのコピーを透過的に作成し、そのファイルに対して書き込みが実行されるように、wrapfs を拡張しています。しかし、書き込み呼び出しごとにコピーを作成したくありません。

素朴なアプローチは、そのディレクトリにファイルが存在するかどうかを確認することです。しかし、これをチェックするたびに、これは深刻なペナルティになる可能性があると思います。

また、最初の書き込み呼び出しを確認してから、private_data 属性を使用してその特定のファイルの値を保存することもできます。しかし、それはディスクに保存されません。そのため、もう一度確認する必要があります。

修正時間を活用することも考えていました。修正時間を節約できました。古い変更時刻がその時刻より前の場合、コピーのみが作成されます。それ以外の場合は何もしません。これに inode.i_mtime を使用しようとしましたが、書き込みが呼び出される前でも変更された時刻でした。アプリケーションもその時刻を変更できます。

そのため、バックアップが作成されたかどうかを示す値をディスク上の i ノードに保存することを考えていました。それは可能ですか?他の提案やアプローチは大歓迎です。

4

2 に答える 2

0

あなたは基本的に、コピーオンライト仮想ファイルシステムレイヤーを実行したいと言っています。

IMO、これらのいくつかは実行されており、これらをユーザーランドに実装する方が簡単です(libfuseとfuseモジュールを使用するなど)。そうすれば、城の王様になり、適切と思われる方法でメタデータを追加できます。

  • (隠し)メタデータファイルを各ディレクトリに追加するだけです
  • 拡張 POSIX 属性を使用する (setfattr とその仲間)
  • 一体、sqliteデータベースを使用することさえできます

これらのことをカーネル内で行うことを本当に主張する場合、カーネルモードからメタデータにアクセスするにはより多くの労力がかかるため、より多くの作業が必要になります (おそらく、メモリマップを使用して独自のデータベースをエミュレートする必要があります)。必要な「ユーザーランド(スタイル)」作業の量を最小限に抑え、アトミック性と信頼性を適切に取得するのが比較的簡単になるようにファイルを作成します1


1もがファイル IO を間違って取得する方法について: こちらも参照してください

于 2012-03-05T14:06:01.837 に答える
0

atimeの代わりに使用できますmtime。その場合S_NOATIME、inode にフラグを設定すると更新されなくなります (touch_atime()の関数を参照inode.c)。noatime必要なのは、ファイルシステムをオプションでマウントすることだけです。

于 2012-03-05T20:26:46.783 に答える