GEOM UZIP: 読込専用圧縮デバイス2006年03月15日 10時51分35秒

UZIP は GEOM に実装された物の一つである。man geom_uzip すら無いのと GEOM の man からの参照も少ないので気が付くのに時間がかかった。

mkuzip でデバイスを圧縮したファイルを作れる。CD などを作るときに役に立つのだろうが、他にも使い道はある。

man mkuzip を参照のこと。しかし、バグがあるらしく、8697 クラスター以上の物が作れない。6.0-BETA3 でも必ず再現する。そこでクラスターサイズを -s で調整するしか無い。あとで、gdb で追ってみようと思う。... 追ってみたところ、どうも普通のファイルからしか mkuzip は作れないらしい。パイプやデバイスからではダメそうだ。mdconfig を使って、ファイルを作る必要がある。man には disk image とはあるがあるが、これが regular file のみとは。

-s でクラスターのブロックサイズを指定できる。圧縮後のブロックサイズが MAXPHYS 未満にならなければいけないようである。そうでないと、too large と言われ、作業が止まる。これは 512 の倍数でなければいけない。全く圧縮できないブロックがあると、zlib の情報が付くため、元のブロックより大きくなってしまうことがある。そのため、131072 では無理である。そこから、1024 引いた 130048 で、何度か試したが too large と言われたことは無い。

さて、これの mount であるが、このままでは出来ない。まず、geom_uzip を読み込む必要がある。これは /etc/loader.conf に geom_uzip_load="YES" と書けばよい。ルートファイルシステムを geom_uzip にするのでもない限りわざわざカーネルに組み込む必要は無い。

その後、mdconfig を使ってデバイスとしてアクセス出来るようにする。デバイス名に .uzip が付いたものが出来るので、それを普通の読み込み専用デバイスと同じようにする。


mkuzip -o /var/tmp/mnttmp.uzip ad0s2d.img
kldload geom_uzip
mdconfig -a vnode -oreadonly -f /var/tmp/mnttmp.img -u 3
mount -r /dev/md3.uzip /mnt/tmp