cloopfs: cloopfs format ― 2006年05月09日 09時17分31秒
ちなみに、cloopfs は Linux で開発された、loopback デバイスの拡張らしい。loopback では普通のファイルをデバイスとして扱うが、cloopfs では圧縮されたファイルを扱う。
そうなるとコードを覗いた方が早くなる。ports には sysutils/cloop-utils にある。compressed_loop.h を見る。この部分だけは usr.bin/mkuzip/mkuzip.c よりもコメントがある分若干見やすい。
mkuzip は FreeBSD 6.0/6.1 を、cloop は 2.01 を基に見ていく。
#define CLOOP_HEADROOM 128
/* The cloop header usually looks like this: */
/* #!/bin/sh */
/* #V2.00 Format */
/* ...padding up to CLOOP_HEADROOM... */
/* block_size (32bit number, network order) */
/* num_blocks (32bit number, network order) */
struct cloop_head
{
char preamble[CLOOP_HEADROOM];
u_int32_t block_size;
u_int32_t num_blocks;
};
/* data_index (num_blocks 64bit pointers, network order)... */
/* compressed data (gzip block compressed format)... */
ヘッダに何があるか解ったが、その後に何があるかはこれだけではわからない。この先は mkuzip.c を読み進める。ここから先は mkuzip.c の方が、よっぽどまともに書かれている。
少し、読み進めば判るが、以下のようなところがある。
toc = safe_malloc((hdr.nblocks + 1) * sizeof(*toc));
...
/* Prepare header that we will write later when we have index ready. */
iov[0].iov_base = (char *)&hdr;
iov[0].iov_len = sizeof(hdr);
iov[1].iov_base = (char *)toc;
iov[1].iov_len = (hdr.nblocks + 1) * sizeof(*toc);
offset = iov[0].iov_len + iov[1].iov_len;
/* Reserve space for header */
lseek(fdw, offset, SEEK_SET);
iov は struct iovec 型。この型は writev() を使うときに利用する。toc は (uint64_t *) 型として定義されている。toc は (hdr.nblocks + 1)、つまりブロックの大きさ分だけ割り当てられている。その直後に lseek() があるので、cloop ヘッダの後には各ブロックの開始点を指すポインタがブロック数だけ並ぶことになる。
次回は、mkuzip と create_compcressed_fs の実装を見ていく。
最近のコメント