ext4 ファイルシステム上の小さなディレクトリが 2024 ブロックを占めていますか?

ext4 ファイルシステム上の小さなディレクトリが 2024 ブロックを占めていますか?

仕事用のコンピューターに ext4 ファイル システムがあり、1 MB を超えるスペースを占有しているディレクトリを見つけました。ディレクトリには 7 つのエントリがあります。ディレクトリには 20 を超えるエントリが含まれていたことはありませんでした。

一体何が起こっているのでしょうか? ディレクトリでは今のところ何も問題は起きていません。心配すべきでしょうか?

私の知る限り、ボリュームに ACL やエクステントを設定していません。ボリュームを作成したとき、デフォルトのブロック サイズ 4096 を使用しました。

=[3 dc@work ~/documents/work/foo ]= $ ls -lat -r
[...]
drwxr-xr-x  2 dchurch users    4096 Dec 23 11:53 _old/
drwxr-xr-x  5 dchurch users    4096 Dec 30 17:43 ./
drwxr-xr-x  3 dchurch users 1032192 Jan  2 08:51 account_import/
drwxr-xr-x 14 dchurch users    4096 Jan  2 08:54 ../
=[3 dc@work ~/documents/work/foo ]= $ ls -la account_import/
total 5500
drwxr-xr-x 3 dchurch users 1032192 Jan  2 08:51 ./
drwxr-xr-x 5 dchurch users    4096 Dec 30 17:43 ../
drwxr-xr-x 2 dchurch users    4096 Jan  2 08:54 _first/
-rw-r--r-- 1 dchurch users  804852 Dec 17 15:37 ca.csv
-rw-r--r-- 1 dchurch users    3495 Dec 17 16:14 slurp.php
-rw-r--r-- 1 dchurch users    3707 Dec 17 16:13 slurp.php~
-rw-r--r-- 1 dchurch users 3769577 Dec 17 15:37 us.csv
=[3 dc@work ~/documents/work/foo ]= $ stat account_import
  File: 'account_import'
  Size: 1032192         Blocks: 2024       IO Block: 4096   directory
Device: 804h/2052d      Inode: 4458105     Links: 3
Access: (0755/drwxr-xr-x)  Uid: ( 1000/ dc)   Gid: (  100/   users)
Access: 2015-01-05 04:40:11.629350078 -0600
Modify: 2015-01-02 08:51:06.024793685 -0600
Change: 2015-01-02 08:51:06.024793685 -0600
 Birth: -

答え1

4096Bはディレクトリの初期サイズであり、1セクタに相当します。ただし、保存されるデータの量(メタデータ(ファイル名を含む)が大きくなると、ディレクトリのサイズも大きくなりますが、ディスクの断片化の問題を軽減するために、サイズが再び小さくなることは決してありません。

 $ mkdir testdir
 $ cd testdir
 $ ls -lhd .
   drwxrwxr-x 2 me me 4.0K Jan  5 18:06 .
 $ for ((i=0; i<1000; i++)); do touch this_is_a_long_file_name_$i; done 
 $ ls -lhd .
   drwxrwxr-x 2 me me 64K Jan  5 18:08 .
 $ rm this*
 $ ls -lhd .
   drwxrwxr-x 2 me me 64K Jan  5 18:09 .

編集: これは reiserfs の同じ実験です:

 $ mkdir testdir
 $ cd testdir
 $ ls -lhd .
   drwxr-xr-x 2 me me 48 gen  5 18:54 .
 $  for ((i=0; i<1000; i++)); do touch this_is_a_really_long_file_name_$i; done
 $ !ls
   ls -lhd .
   drwxr-xr-x 2 me me 55K gen  5 18:55 .
 $ rm this*
 $ !ls
   ls -lhd .
   drwxr-xr-x 2 me me 48 gen  5 18:55 .

これは xfs の場合です:

 $ mkdir testdir
 $ cd testdir
 $ ls -lhd .
   drwxr-xr-x 2 me me 6 gen  5 19:00 .
 $ for ((i=0; i<1000; i++)); do touch this_is_a_really_long_file_name_$i; done
 $ ls -lhd .
   drwxr-xr-x 2 me me 48K gen  5 19:01 .
 $ rm this*
 $ !ls
   ls -lhd .
   drwxr-xr-x 2 me me 6 gen  5 19:01 .

どちらもライザーフまた、xfs* は、多数のファイルを削除するとディレクトリ サイズが元の値に戻るため、ディスクの断片化をそれほど気にしません。

関連情報