FreeBSD 7.0 へようこそ

第5回 ストレージ新時代-GEOM journaling,ZFS on FreeBSD

この記事を読むのに必要な時間:およそ 9 分

1. zfsファイルシステムを作成する

まず,rc.confにZFS有効の設定を書き込み再起動する。設定を有効にすることで,システム起動時に自動的にzfsファイルシステムをマウントしてくれる。

# echo 'zfs_enable="YES"' >> /etc/rc.conf 
# reboot

次に,仮想ディスクである「プール」を作成する。

# zpool create tank ad4s3f

これで,tankという名前のプールができた。状態を「list」で知ることができる。

# zpool list
NAME            SIZE  USED   AVAIL  CAP   HEALTH   ALTROOT 
tank           69.5G  111K   69.5G  0%    ONLINE   -

zfsコマンドを用い,tankという名前のプールに対してファイルシステムを作成する。

# zfs create tank/home3

作ったファイルシステムはdfコマンドで確認することができる。

# mount
/dev/ad4s2a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad4s2g on /home (ufs, local, soft-updates)
/dev/ad4s3e on /home2 (ufs, local, soft-updates)
/dev/ad4s2e on /tmp (ufs, local, soft-updates)
/dev/ad4s2f on /usr (ufs, local, soft-updates)
/dev/ad4s2d on /var (ufs, local, soft-updates)
tank on /tank (zfs, local)
tank/home3 on /tank/home3 (zfs, local)

/tank/home3というディレクトリが新しくできた。作ったディレクトリの使い方は普通のUFS2とかわらない。

気になるスピードであるが,例によって,⁠ports.tgz」の展開にかかる時間を測定してみたところ,UFS2+gjournalと同等の速度であった。このスピードはかなり魅力的である。

表3 ZFSとgjournalでのports.tgz展開時間比較:単位は秒

ファイルシステム オプション 新規展開 上書展開 削除
zfs - 27.15 51.705 50.48
UFS2 gjournal 40.53 52.09 25.23

2. 圧縮機能付きファイルシステムを作製する

zfsは,ファイルを圧縮して保存するcompression機能を持っている。利用の仕方は簡単で,単にcompressionオプションを指定するだけである。

# zfs set compression=on tank/home3

圧縮アルゴリズムは(マニュアルページ曰く)zfs向けに最適化されたlzjbアルゴリズムである。おなじみのgzipアルゴリズムもcompression=gzipないしcompression=gzip-数字(数字は1から9まででgzipの圧縮率を示す)で利用することができる。

ファイル圧縮はzfs setを行った後のファイル操作から有効になる。たとえば圧縮無しでportsを展開すると299Mバイトのディスク領域を消費するが,圧縮有りでは177Mバイトしか消費しない。その分ファイル展開や上書き展開の速度が犠牲になる。1~2割増といったところである。

表4 compression無しと有りでのports.tgz展開時間比較:単位は秒

ファイルシステム オプション 新規展開 上書展開 削除
zfs - 27.15 51.705 50.48
zfs compression 30.41 63.78 20.82

3. スナップショットを利用する

zfsにはまた,現在のファイルシステムをそっくりそのまま取っておくsnapshot機能があり,snapshotを指定してファイルシステムを後戻りさせることも簡単に利用できる(蛇足ながら,UFS2でも実はスナップショットを撮ることはできる)。tank/home3のスナップショットを,⁠tank/home3@today」という名前のスナップショットに取り,ディレクトリ(先ほど展開の実験に使った「ports」ディレクトリがちょうど残っているので)を削除した後,削除する前の状態に戻してrollbackみることにしよう。

スナップショットを撮る

# zfs snapshot tank/home3@today
# zfs list
NAME               USED  AVAIL  REFER  MOUNTPOINT
tank               207M  68.2G    19K  /tank
tank/home3         207M  68.2G   207M  /tank/home3
tank/home3@today      0      -   207M  -

ファイルシステムを改変する

# cd /tank/home3
# ls
ports           ports.tgz
# rm -rf ports
# zfs list
NAME               USED  AVAIL  REFER  MOUNTPOINT
tank               211M  68.2G    19K  /tank
tank/home3         207M  68.2G  92.2M  /tank/home3
tank/home3@today   115M      -   207M  -
# ls
ports.tgz

元に戻す(操作に先立ち,tank/home3ディレクトリから抜ける必要がある)

# cd / 
# zfs rollback tank/home3@today
# ls tank/home3/
ports           ports.tgz

4. ZFSを使うのをやめる

gjournalのときと同じく,zfsのプールを消去するとデータが消えて戻ってこないので,必要に応じてバックアップを行っておく。

# zfs destroy -R tank

で依存性も含めて「tank」プール以下のすべてのデータセットが消去される。続いて

# zpool destroy tank

でプールを開放すれば元通りである。

# zfs list
no datasets available

今後zfsを使わないのであれば,/etc/rc.confに追加したzfs_enable="YES"の行も削除しておくとよいだろう。

5. ZFSの制限

以上便利なZFSであるが,実行のためにはかなりカーネルのメモリを必要とする。メモリを512Mバイトしか積んでいないマシンで起動したところ,以下のような警告が出てきた。

Mar 14 17:58:30 pen4 kernel: ZFS WARNING: Recommended minimum kmem_size is 256MB; expect unstable behavior. 
Mar 14 17:58:30 pen4 kernel: Consider tuning vm.kmem_size or vm.kmem_size_min

また,ports.tgzを連続して展開していたところ,一度メモリ不足でパニックになりシステムが死んでしまった。常に再現するわけではないが,若干の開発余地が残っていると考えられる。

km_malloc(131072): kmem_map too small: 294715392 total allocated 
cpuid = 1

著者プロフィール

三田吉郎(みたよしお)

東京大学 大学院工学系研究科 電気工学専攻 准教授。講義「電気磁気学」「わかる電子回路」やマイクロマシン研究の傍ら,FreeBSDの普及,開発に尽力する。FreeBSD ports committer。2008年3月現在,新研究分野開拓のためフランス国立情報学研究所(INRIA)に招聘教授として出張中。共著書に「FreeBSD徹底入門」(翔泳社),「FreeBSD Expert」など。