ファイルホール
ファイルデータ管理として、最初に一定のインデックスを確保し、それ以降に情報データを持たせると言うのは一般的なデータ管理手法で、シークすることで、実情報データを取得したりいたします。従って先頭のインデックス領域には実際のデータの設定されない領域が発生します。これがブロック範囲を超えて発生する場合、ファイルホールとなります。
下記はブロック番号を表示させるサンプルです。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番目のような実ブロックが割り当ててないエリアをファイルホールと言うのだそうです。







