無料Wikiサービス | デモページ
検索

アクセス数
最近のコメント
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
はじめ - ノース
はじめ - ノース
はじめ - 楽打連動ユーザー
はじめ - 楽打連動ユーザー
Adsense
広告情報が設定されていません。

ファイルホール


ファイルデータ管理として、最初に一定のインデックスを確保し、それ以降に情報データを持たせると言うのは一般的なデータ管理手法で、シークすることで、実情報データを取得したりいたします。従って先頭のインデックス領域には実際のデータの設定されない領域が発生します。これがブロック範囲を超えて発生する場合、ファイルホールとなります。

下記はブロック番号を表示させるサンプルです。get_nr_blocksはファイルシステムでのブロック数を返します。fstatでのbuf.st_blocksは512バイト単位の物理ブロック数を返すので、ファイルシステムでのブロックサイズで除算することで、ファイルシステム下でのブロック数を算出します。disp_blocksで物理ブロック番号をioctlで取得しています。なお物理ブロック番号が0の時、nr++としているのファイルホールを想定してのことです。
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <linux/fs.h>

int get_blocks(int fd, int nr)
{
   ioctl (fd, FIBMAP, &nr);
   return nr;
}

int get_nr_blocks (int fd)
{
   struct stat buf;

   fstat (fd, &buf);
   return buf.st_blocks*512/buf.st_blksize;
}

void    disp_blocks(int fd, int nr)
{
   int i, phys_block;
   for (i = 0; i < nr; i++) {
       phys_block = get_blocks(fd, i);
       printf("%d,%d\n", i, phys_block);
       if (!phys_block) {
           nr++;
       }
   }
}

int main (int argc, char *argv[])
{
   int fd, nr;

   fd = open (argv[1], O_RDONLY);
   nr = get_nr_blocks (fd);
   disp_blocks(fd, nr);
}
通常のファイル書き込み操作では、最初の物理レコード409727にNULLが書き込まれ、次の物理レコード475458にaが書き込まれています。
[root@localhost test]# dd if=/dev/zero of=data bs=4096 count=1
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.000704559 s, 5.8 MB/s
[root@localhost test]# ./getblock data
0,409727
[root@localhost test]# echo a >> data
[root@localhost test]# ./getblock data
0,409727
1,475458
先頭をシークした後1バイト書き込むと、ファイルサイズは4098ですが、最初の物理レコードはアロケートされてなく、次の物理レコードにaが書き込まれるようです。
[root@localhost test]# echo a > a
[root@localhost test]# dd if=a of=./data bs=4096 seek=1
0+1 records in
0+1 records out
2 bytes (2 B) copied, 0.000760991 s, 2.6 kB/s
[root@localhost test]# ls -l data
-rw-r--r-- 1 root root 4098 2010-03-10 17:39 data
[root@localhost test]# ./getblock data
0,0
1,409727
データベースファイルのようにシークでファイル操作をする場合、動的にファイルブロックを割り当てることで、HDの容量の有効活用をはかっています。そして0番目のような実ブロックが割り当ててないエリアをファイルホールと言うのだそうです。


最終更新 2010/03/15 00:42:31 - north
(2010/03/15 00:42:31 作成)