mdconfig -o compress cont.2006年04月22日 12時31分25秒

取り合えず、どうなっているのかソースを追ってみるとする。mdconfig を覗く。

  } else if (action == ATTACH) {
    if (cmdline < 2)
      usage();
    i = ioctl(fd, MDIOCATTACH, &mdio);
    if (i < 0)
      err(1, "ioctl(/dev/%s)", MDCTL_NAME);
    if (mdio.md_options & MD_AUTOUNIT)
      printf("%s%d\n", nflag ? "" : MD_NAME, mdio.md_unit);
  }

ioctl を呼んでいるのがわかる。なお、ソースは 6.1-RC1 である。

$ cd /usr/src/sys
$ find . -type f | xargs grep MDIOCATTACH
./dev/md/md.c:  case MDIOCATTACH:
./sys/mdioctl.h:#define MDIOCATTACH     _IOWR('m', 0, struct md_ioctl)  /* attach disk */

dev/md/md.c を見ると、

  switch (cmd) {
  case MDIOCATTACH:
    switch (mdio->md_type) {
    case MD_MALLOC:
    case MD_PRELOAD:
    case MD_VNODE:
    case MD_SWAP:
      break;
    default:
      return (EINVAL);
    }

とあり、その少し下に、

    switch (sc->type) {
    case MD_MALLOC:
      sc->start = mdstart_malloc;
      error = mdcreate_malloc(sc, mdio);
      break;
    case MD_PRELOAD:
      sc->start = mdstart_preload;
      error = mdcreate_preload(sc, mdio);
      break;
    case MD_VNODE:
      sc->start = mdstart_vnode;
      error = mdcreate_vnode(sc, mdio, td);
      break;
    case MD_SWAP:
      sc->start = mdstart_swap;
      error = mdcreate_swap(sc, mdio, td);
      break;
    }

とある。各種類毎に違った初期化をしている。

この先も眺めては見たものの把握しきれなかった。しかし、-ocompress を付けて mdconfig しても、/usr/src の大きさが 400MB に迫る。そこから推測できるのが、小さいファイルには圧縮が効かないか、-ocompress 自体が実装されていない、のどちらかになる。

どちらにせよ、今回の目的では使えないので、諦めることにした。