5

ハードディスクにデータを書き込む前に何かしたい。私は解決策を知りません。カーネル ソース コードの編集を避けるために、フック関数をローダブル モジュールとして使用できる場所はありますか?

更新: LSM は API フックに適しています。しかし、メカニズムフックの読み取り/書き込みブロックのデータを提供する他のソリューションを見つけたいと思います。ファイルの更新後にすべてのファイルを再暗号化することを回避できます。

ファイルシステム(ext2、ext3、...)とバッファキャッシュの間で変更できるものがあると思います。

4

5 に答える 5

2

Linux セキュリティ モジュールを使用します。これらは、カーネル内のさまざまな内部オブジェクトへのアクセスを仲介するためのフックを提供する、ロード可能なカーネル モジュールです。要件に応じて、ファイルシステムまたは inode へのフックを使用できます。Greg Kroah Hartman のLSMに関する論文を読むことから始めることをお勧めします。次に、このリンクにアクセスできます。ここでは、LSM フックの使用方法の例とともに示されています。この例は、特定の USB が挿入された場合にのみシステムへのアクセスを仲介するものであり、LSM フックを開始する方法の良い参照ポイントです。

于 2013-04-03T08:32:39.197 に答える
2

なるほど、興味深い質問です。

残念ながら、ここでは LSM でさえ役に立ちません。address_space_operations可能な解決策として、テーブルとフックwritepage関数を使用することをお勧めします。たとえば、ext3_writeback_aopsを見てください。

1984 static const struct address_space_operations ext3_writeback_aops = {
1985         .readpage               = ext3_readpage,
1986         .readpages              = ext3_readpages,
1987         .writepage              = ext3_writeback_writepage,
1988         .write_begin            = ext3_write_begin,
1989         .write_end              = ext3_writeback_write_end,
1990         .bmap                   = ext3_bmap,
1991         .invalidatepage         = ext3_invalidatepage,
1992         .releasepage            = ext3_releasepage,
1993         .direct_IO              = ext3_direct_IO,
1994         .migratepage            = buffer_migrate_page,
1995         .is_partially_uptodate  = block_is_partially_uptodate,
1996         .error_remove_page      = generic_error_remove_page,
1997 };

したがって、ファイルシステムの場合、メモリ内でこの構造体を見つけて、ポインターをラッパーを指すようにext3置き換える必要があります。また、このテーブルは読み取り専用メモリ内にあり、正しく処理する必要があることに注意してください。writepageour_writepage

編集:

LSM を使用すると、inodeオープン操作にフックしてその場で交換することができinode->i_mapping->a_opsます。

于 2013-04-03T11:01:01.033 に答える
-3

これは不可能だと思います。ユーザー空間がファイル I/O を呼び出すと、ファイル システム実装または汎用実装が VFS から呼び出されます。必要なのは、この関数ポインタをモジュールを指すように変更することです。これにより、データが暗号化され、ファイル システム関数が呼び出されます。

私は大学でこのようなことをしましたが、それは古いカーネルであり、特定の構成フラグを設定する必要がありました。カーネルモジュールがスコープ外の関数ポインターをいじりたくないので、このフラグが消えたことを覚えている場合。

いずれにせよ、モジュールはこちらにあります: https://motzblog.wordpress.com/2007/10/27/linux-monitoring-module/

ただし、これは大学のプロジェクトであるため、コードの品質は Linux カーネル コードとは異なります。

于 2013-04-02T10:53:03.487 に答える