1

ext2fs で新しい通常ファイルを作成する方法については、 Understanding the Linux Kernel, 3rd Editionを読んでいます。
(書籍は複数の場所でオンラインで入手できます。合法性については不明です。関連する章のみの最新版はO'reilly のサイトにありますが、すべての関連データが含まれているわけではありません)

私が見たところ、Linux カーネルは新しい i ノードを作成し、それに必要なブロックを割り当てる必要があります。

このでは、次の手順の概要が説明されています。

  • Creating inodes(p.758)
  • Allocating a Data Block(p.764)

私が理解していないのは、カーネルがいつ新しい i ノードのデータ ブロックを割り当てるかということです。

Creating inodes手順の終わり近く (パラグラフ 14) に、次のように表示されます。

ext2_preread_inode()inode を含むブロックをディスクから読み取り、そのブロックをページ キャッシュに入れるように呼び出します。このタイプの先読みが行われるのは、最近作成された i ノードがすぐに書き戻される可能性が高いためです。

したがって、その直前に、inode のブロックを割り当てる論理的な場所のように思えます。ただし、ext2 アーキテクトが割り当てを別のタイミングで行うことにした可能性があります。

新しく作成された ext2 i ノードにいつストレージが割り当てられるか知っている人はいますか?

4

2 に答える 2

0

本で私はこれを見つけました:

  1. ディスク i ノードを割り当てます。対応するビットを i ノード ビットマップに設定し、ビットマップを含むバッファをダーティとしてマークします。さらに、ファイルシステムが MS_SYNCHRONOUS フラグを指定してマウントされている場合 (第 12 章のセクション「汎用ファイルシステムのマウント」を参照)、関数は sync_dirty_buffer( ) を呼び出して I/O 書き込み操作を開始し、操作が終了するまで待機します。

つまり、ディスク i ノードを割り当てることは、メモリに保持された i ノード ビットマップに BIT を設定し、このビットマップ バッファをダーティとしてマークすることを意味します。これは、すぐにこのビットマップがストレージに書き戻されることを意味します。

ext2_preread_inode() について、コードは次のとおりです。

static void ext2_preread_inode(struct inode *inode)
166 {
167         unsigned long block_group;
168         unsigned long offset;
169         unsigned long block;
170         struct ext2_group_desc * gdp;
171         struct backing_dev_info *bdi;
172 
173         bdi = inode->i_mapping->backing_dev_info;
174         if (bdi_read_congested(bdi))
175                 return;
176         if (bdi_write_congested(bdi))
177                 return;
178 
179         block_group = (inode->i_ino - 1) / EXT2_INODES_PER_GROUP(inode->i_sb);
180         gdp = ext2_get_group_desc(inode->i_sb, block_group, NULL);
181         if (gdp == NULL)
182                 return;
183 
184         /*
185          * Figure out the offset within the block group inode table
186          */
187         offset = ((inode->i_ino - 1) % EXT2_INODES_PER_GROUP(inode->i_sb)) *
188                                 EXT2_INODE_SIZE(inode->i_sb);
189         block = le32_to_cpu(gdp->bg_inode_table) +
190                                 (offset >> EXT2_BLOCK_SIZE_BITS(inode->i_sb));
191         sb_breadahead(inode->i_sb, block);
192 }

私はカーネル マスターではありませんが、この関数は、現在の i ノード インデックスを保持する i ノード ビットマップの一部のブロックを先読みしているようです。これは、コメントで述べたように、パフォーマンスの向上という観点から行われます。

したがって、私の理解では、彼らが INODE BLOCK について話すとき、特定の inode ビットが設定されているときのビットマップのブロックを意味するということです。このブロックはいつ割り当てられますか? mkfs.ext2 を実行すると。

たぶん私は質問をキャッチできなかったので、少し追加があります: この i ノードにリンクされたファイルのブロックの割り当てについて質問している場合、答えは次のとおりです。

ext2_get_block() 関数は ...、ext2_alloc_block( ) 関数を呼び出して、Ext2 パーティション内の空きブロックを実際に検索します。

答えは ext2_create -> ... -> ext2_alloc_ block

于 2014-10-15T19:37:56.870 に答える
0

IIRC、最新のコンパイラでは、答えは「ディスクキャッシュからファイルをフラッシュするとき」です。それはかなり遅いように見えるかもしれませんが、ext2 は断片化を回避しようとしていることを覚えておいてください。ファイル全体がディスク キャッシュに格納されるまでブロックの割り当てを遅らせることができれば、そのサイズが正確にわかり、1 つの連続したブロックを割り当てることができます。

于 2014-10-15T19:40:50.093 に答える