cloopfs: cloopfs format2006年05月09日 09時17分31秒

mkuzip と geom uzip を見ていたら、これは cloop を実装したものだとあったので、少し探してみた。Google で検索してみたところ、cloop で探すと bootable-CD の使い方ぐらいしか出てこない。その構造を細かく説明したものが、全く無いのである。

ちなみに、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 の実装を見ていく。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2006/05/09/358486/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。