TrueNAS CORE (旧PC-BSD): ZFSファイルシステム

TrueNAS CORE 12 (旧PC-BSD) での、ストレージ設定について。

TrueNAS CORE は、システムドライヴ以外に、最低1台のディスクドライヴが必要。物理ドライヴをグルーピングした ZFS Storage Pool を作り、これをマウントする。

Web UIの画面で, Storage -> [Pools] を開くと、No pools になる (システムドライヴは表示されない)。

[ADD] ボタンを押すと、次の画面に。Create new pool を選ぶ。[CREATE POOL] ボタンで次へ。

Poolに加えられていないのが左側の Available Disks。pool に加えるのが右側。中央の[→]をクリックして、Data VDevs に加える。左上の Name にプール名を入力。[CREATE] ボタンで作成。

完了。すごく簡単。

デフォルトファイルシステムの構造

中身について少し見ておこう。

物理区画

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

# gpart show da0
=>      40  41942960  da0  GPT  (20G)
        40      1024    1  freebsd-boot  (512K)
      1064  41910272    2  freebsd-zfs  (20G)
  41911336     31664       - free -  (15M)

# gpart show da1
=>      40  41942960  da1  GPT  (20G)
        40        88       - free -  (44K)
       128   4194304    1  freebsd-swap  (2.0G)
   4194432  37748568    2  freebsd-zfs  (18G)

ZFSストレージプール

ZFSでは、物理区画を束ねてZFSストレージプール (ZFSプール; zpool) を作る。ストレージプールの上に、ZFSファイルシステムを載せる。

Linux LVMでは, ファイルシステムが選べたりすることから, 下から 1) Physical Volume (PV) - 2) Volume Group (VG) - 3) Logical Volume (LV) - 4) ファイルシステム、と載せていく。LV とファイルシステムは分離している。ZFS では, ZFSストレージプールが LVM Volume Group に相当し、ZFSファイルシステムは LVM LV とファイルシステムが合わさったもの、と考える。

ストレージプールが操作の中心になる。物理ディスクを後から足して, ストレージプールを拡張できる。ディスクのミラーリングも ZFSプールのレベルでおこなう。

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

# zpool list
NAME        SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
boot-pool  19.5G  1.06G  18.4G        -         -     0%     5%  1.00x    ONLINE  -
mypool     17.5G  7.42M  17.5G        -         -     0%     0%  1.00x    ONLINE  /mnt

先ほど作った "mypool" ZFSストレージプールは, /mnt にマウントされている。

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

# zpool status mypool
  pool: mypool
 state: ONLINE
config:

        NAME                                          STATE     READ WRITE CKSUM
        mypool                                        ONLINE       0     0     0
          gptid/a1c40b82-3af8-11eb-97e0-000c29a3e797  ONLINE       0     0     0

errors: No known data errors    

GPT id で表示されているが、mypool ストレージプールは, da1ドライヴのパーティション2 (/dev/da1p2) だけから構成されている。

ZFSファイルシステム

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

Linux LVMでは、Logical Volume (LV) の上に ext3/4, XFSなどファイルシステムが載る形だが、ZFS ではファイルシステムが LVM LV を兼ねる.

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

Linux LVMでは, スナップショットはLVのレベルでおこなうので、ファイルシステムがスナップショットをサポートする形に比べて, 直感的ではない。

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

# zfs list
NAME                                                      USED  AVAIL     REFER MOUNTPOINT
boot-pool                                                1.06G  17.8G       24K none
boot-pool/ROOT                                           1.06G  17.8G       24K none
boot-pool/ROOT/Initial-Install                              1K  17.8G     1.06G legacy
boot-pool/ROOT/default                                   1.06G  17.8G     1.06G legacy
mypool                                                   7.25M  16.9G       96K /mnt/mypool
mypool/.system                                           6.47M  16.9G      104K
mypool/.system/configs-17a88b624aa64e01b68939563b5fcb8c    96K  16.9G       96K legacy
mypool/.system/cores                                      584K  1023M      584K legacy
mypool/.system/rrd-17a88b624aa64e01b68939563b5fcb8c      4.98M  16.9G     4.98M legacy
mypool/.system/samba4                                     316K  16.9G      316K legacy
mypool/.system/services                                    96K  16.9G       96K legacy
mypool/.system/syslog-17a88b624aa64e01b68939563b5fcb8c    228K  16.9G      228K legacy
mypool/.system/webui                                       96K  16.9G       96K legacy

Mountpoint が legacy と書かれているものは、mount コマンドで見ると、実際にはどこかにマウントされている。

NAME欄を見ると、ZFSプール / ZFSファイルシステムという2階層ではなく, 3階層目としてサブヴォリュームが取れる。このサブヴォリュームをマウントする。

.system に設定ファイルなどが格納されている。

GUIで操作

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

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

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

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

ミラーリング

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