2012-03-05 15 views
5

こんにちは私はカーネルプログラミングの初心者です。私はバックアップ機構を実装するためのwrapfsテンプレートに基づいた小さなカーネルモジュール を書いています。これは純粋に学習のための です。構造体inodeにデータを格納する

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

単純なアプローチでは、そのディレクトリにファイルが存在するかどうかを確認できます。しかし、 私はこれが重大なペナルティになる可能性があることを確認する毎回の呼び出しのためだと思います。

プライベートデータ属性を使用して、 特定のファイルの値を最初に書き込む呼び出しをチェックし、その値を保存することもできます。しかし、それは ディスクに格納されません。だからもう一度それを確認する必要があります。

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

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

+2

あなたのBLOBを書式設定することは、あなたの質問を_read_でも得るためには大いに役立ちます。 – sehe

答えて

0

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

IMOなどがありますが、これらのうちのいくつかは実行されており、ユーザーランドでこれらを実装する方が簡単です(libfuseとヒューズモジュールなどを使用)。各

  • 使用はPOSIXが拡張属性ディレクトリ(setfattrや友人に

    • だけ追加(隠された)メタデータファイル:その方法は、あなたがお城の王とあなたが感じるあらゆるどの方法であなたのメタデータを追加することができますすることはappriateですあなたが本当にして、カーネルこれらの事をやって主張した場合)
    • ヘック、あなたも取ることgoindされ、カーネルモードからのメタデータにアクセスするので、あなたはより多くの仕事を持っていますsqliteのデータベース

    を使用することができますより多くの努力(あなたはおそらくあなた自身のデータベースをエミュレートしたいと思いますメモリマップされたファイルを使用して、必要なユーザーランド(スタイル)の作業量を最小限に抑え、を比較的簡単にします。アトミック性と信頼性を得るには。 How Everybody Gets File IO Wrong: see also here

  • +0

    あなたの返事をありがとう。私はヒューズの使用を見てみましょう。しかし実際は私はwrapfsを使い始めました。私はunlinkの代わりにrenameを呼び出すunlinkコードを変更しました。私のニーズに合うように構造体のinode属性を操作するような何かがあれば、 – gaurav

    0


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

    +0

    @liya:なぜ私はmtimeを使用できませんでしたか?しかし、atimeを使用する際の問題は、ファイルが読み込まれると変更されるため、この方法で問題になることです。 – gaurav

    +0

    @ gaurav: 'noatime'マウントオプションでは、アクセス時に' atime'アップデートはありません。 –

    +0

    オハイオイ私は良いオプションを参照してください参照してくださいしかし、私はなぜatime作品とmtimeが表示されません。また、より低いFSのatimeも変わらないでしょうか? – gaurav

    関連する問題