ファイルホール
ファイルデータ管理として、最初に一定のインデックスを確保し、それ以降に情報データを持たせると言うのは一般的なデータ管理手法で、シークすることで、実情報データを取得したりいたします。従って先頭のインデックス領域には実際のデータの設定されない領域が発生します。これがブロック範囲を超えて発生する場合、ファイルホールとなります。
下記はブロック番号を表示させるサンプルです。get_nr_blocksはファイルシステムでのブロック数を返します。fstatでのbuf.st_blocksは512バイト単位の物理ブロック数を返すので、ファイルシステムでのブロックサイズで除算することで、ファイルシステム下でのブロック数を算出します。disp_blocksで物理ブロック番号をioctlで取得しています。なお物理ブロック番号が0の時、nr++としているのファイルホールを想定してのことです。
下記はブロック番号を表示させるサンプルです。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番目のような実ブロックが割り当ててないエリアをファイルホールと言うのだそうです。