PC-BSD ZFSファイルシステム

FreeBSD / PC-BSDでは, ZFSファイルシステムが使える。PC-BSDで ZFS を試してみた。

ディスクドライブのパーティション(物理区画) は、次のようになっている。gpart コマンド。

% gpart show da0
=>      34  41942973  da0  GPT  (20G)
        34      2048    1  bios-boot  (1.0M)
      2082         6       - free -  (3.0K)
      2088  40873984    2  freebsd-zfs  (19G)
  40876072   1048576    3  freebsd-swap  (512M)
  41924648     18359       - free -  (9.0M)

ZFSは、下層のZFSストレージプール (ZFSプール; zpool) の上に、ZFSファイルシステムを載せる。

Linux LVMでは, ファイルシステムが選べたりすることから, 下から Physical Volume (PV) - Volume Group (VG) - Logical Volume (LV) - ファイルシステム、と載せていくが、ZFSのほうがだいぶシンプル。

ZFSストレージプール

ZFSストレージプール (zpool) は、ブロックデバイスの集まりに名前を付けたもの。

物理ディスクを後から足して, ZFSプールを拡張できる。ディスクのミラーリングも, ZFSプールのレベルでおこなう。(上のレイヤーからは隠蔽される。)

Linux LVM での {Physical Volume (PV) + Volume Group (VG)} が ZFSプールに当たると考えればいい。

ZFSストレージプールを一覧する。zpool コマンド。

% zpool list
NAME   SIZE  ALLOC   FREE   FRAG  EXPANDSZ    CAP  DEDUP  HEALTH  ALTROOT
tank  19.4G  5.47G  13.9G    12%         -    28%  1.00x  ONLINE  -

"tank" という名前のZFSストレージプールがある。

ZFSストレージプールとディスク・パーティションとの関係を表示。

% zpool status tank
  pool: tank
 state: ONLINE
status: Some supported features are not enabled on the pool. The pool can
        still be used, but some features are unavailable.
action: Enable all features using 'zpool upgrade'. Once this is done,
        the pool may no longer be accessible by software that does not support
        the features. See zpool-features(7) for details.
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          da0p2     ONLINE       0     0     0

errors: No known data errors

tank が da0ディスクのパーティション2 (da0p2) だけから構成されていることが分かる。

ZFSファイルシステム

ZFSプールの上に載るのが ZFSファイルシステム。

Linux LVMでは、Logical Volume (LV) の上に, ext3/4, XFSなどファイルシステムが載る形だが、ZFS ファイルシステムは, Linux の (LV + ファイルシステム) といったイメージ。

ZFSファイルシステムを一覧表示してみる。

% zfs list
NAME                                                 USED  AVAIL  REFER  MOUNTPOINT
tank                                                5.47G  13.3G    25K  none
tank/ROOT                                           5.24G  13.3G    25K  none
tank/ROOT/beforeUpdate-2014-11-25_23-09-17             1K  13.3G  4.05G  /mnt
tank/ROOT/beforeUpdate-2014-11-25_23-33-40             1K  13.3G  4.23G  /mnt
tank/ROOT/beforeUpdate-2014-11-26_21-21-27             1K  13.3G  4.23G  /mnt
tank/ROOT/beforeUpdate-2014-12-14_22-03-56             1K  13.3G  4.33G  /mnt
tank/ROOT/beforeUpdate-2014-12-16_23-55-03             1K  13.3G  4.29G  /mnt
tank/ROOT/default                                   5.24G  13.3G  4.56G  /mnt
tank/tmp                                              76K  13.3G    76K  /tmp
tank/usr                                             199M  13.3G    25K  none
tank/usr/home                                       11.2M  13.3G    26K  /usr/home
tank/usr/home/hori                                  11.2M  13.3G  11.2M  /usr/home/hori
tank/usr/jails                                       187M  13.3G    26K  /usr/jails
tank/usr/jails/.warden-template-10.1-RELEASE-amd64   187M  13.3G   187M  /usr/jails/.warden-template-10.1-RELEASE-amd64
tank/usr/obj                                          25K  13.3G    25K  /usr/obj
tank/usr/pbi                                          25K  13.3G    25K  /usr/pbi
tank/usr/ports                                        25K  13.3G    25K  /usr/ports
tank/usr/src                                          25K  13.3G    25K  /usr/src
tank/var                                            23.7M  13.3G    25K  none
tank/var/audit                                        27K  13.3G    27K  /var/audit
tank/var/log                                          97K  13.3G    97K  /var/log
tank/var/tmp                                        23.6M  13.3G  23.6M  /var/tmp

NAME欄を見ると、ZFSプール - ZFSファイルシステムという2階層ではなく, ツリー状に深い階層が作れることが分かる。

mount point欄から、tank/usr/home ZFS が /usr/home にマウントされていて、当然、下位のZFSは対応する位置にマウントされている。

しかし、mount コマンドで見ると、tank/usr/home ZFS と tank/usr/home/hori ZFS が別々にマウントされていて、ひょっとすると別の (対応していない) 位置にマウントできるのかもしれない。(??)

tank/ROOT 以下を見ると, スナップショットが幾つかあるのが見える。

ZFSスナップショットは、Copy on Writeの仕組みを使っていて、違いがない限りディスクの内容はコピーされない。5.24G のファイルシステムにも関わらず、それぞれのスナップショットが 1Kずつしか消費していないのが分かる。

Linux LVMでも, スナップショットはLVのレベルでおこなうので、この点も似ている.

GUIで操作

上の内容を踏まえて, "PC-BSDディスクマネジャー" を見てみよう。

ディスクタブは、ディスクドライブとそのパーティションが見れる。物理ディスクに限らないので, "スライス"という別の用語になっている。

ZFSプールタブでは、ZFSストレージプールが見れる。tank 一つだけ。

ZFSファイルシステムタブは、ZFSファイルシステムが見れる。

ミラーリング

zpool add tank diskname zpool remove tank disk zpool detach tank disk