mdconfig -o compress ???2006年04月13日 10時12分30秒

圧縮ファイルシステムが欲しいと思っていた。current の追従を始めたら、src と obj で各 1GB 近い量のディスク容量が必要になった。だんだんと、これらがディスクを圧迫してくるのである。geom uzip は読み込み専用なので使えない。

mdconfig に compress のオプションがあったのを思いだし、試してみることにした。


# dd if=/dev/zero of=current-obj.cmp.md seek=999 count=1 bs=1M
# mdconfig -a -t vnode -o compress  -f current-obj.cmp.md
md1
# newfs -U /dev/md1
# mount /dev/md1 /mnt/sys

ファイルを作って、mdconfig を -o compress を付けて試す。

# mdconfig -a -t vnode -f current-obj.md
md2
# cd /mnt/sys
# dump -f - -0 /dev/md2 | restore -r -f -
# df | grep md1
/dev/md1         988398   779732 129596    86%    /mnt/sys

current-obj を試してみる。デバイス上には元と同じぐらいの書き込みがあった。そこで、ファイルの大きさを比べてみる。

# umount /mnt/sys
# mdconfig -d -u 1
# ls -lsa current-obj.cmp.md
 798176 ... 1048576000 Apr 12 21:06 current-obj.cmp.md
# mount /dev/md2 /mnt/sys
dynabook-freebsd# df | grep md2
/dev/md2         988398   779700 129628    86%    /mnt/sys

mdconfig を detach して、ls で大きさを見ても、元とほとんど変わっていない。

mdconfig の -o compress は動かないということだろうか。 とりあえず、ソースを見てみる。which mdconfig で /sbin/mdconfig と出て来るので、src/sbin/mdconfig にあるということだ。


    case 't':
      if (cmdline != 1)
        usage();
      if (!strcmp(optarg, "malloc")) {
        mdio.md_type = MD_MALLOC;
        mdio.md_options = MD_AUTOUNIT | MD_COMPRESS;
      } else if (!strcmp(optarg, "preload")) {
        mdio.md_type = MD_PRELOAD;
        mdio.md_options = 0;
      } else if (!strcmp(optarg, "vnode")) {
        mdio.md_type = MD_VNODE;
        mdio.md_options = MD_CLUSTER | MD_AUTOUNIT | MD_COMPRESS;
      } else if (!strcmp(optarg, "swap")) {
        mdio.md_type = MD_SWAP;
        mdio.md_options = MD_CLUSTER | MD_AUTOUNIT | MD_COMPRESS;
      } else {
        usage();
      }
      cmdline=2;
      break;

とあるので、preload 以外は既に圧縮がかかっているということか。-o nocompress を後日試して、検証してみることにする。