ZFS on NetBSD


ZFSは簡単に言えば高機能なファイルシステムです。ZFSはストレージのsnapshot/rollbackを簡単に実行できます。重要なデータのバックアップはもちろん、仮想マシンのディスクイメージに対してZFSの機能を活用することで、仮想マシン上でなにかしらのデータが壊れてもすぐに復元できます。

NetBSDではZFSがBase Systemにインストールされています。ここではUSB経由で外付けされたひとつのSSDをひとつのpoolとしてZFSを利用する手順を述べます。なお、NetBSD 8.1では古いZFSが使われており、新しいバージョンのZFSを使うにはNetBSD 8.99.37以降を使う必要があります[clarestudio.org][wiki.netbsd.org]。

パーツ名メーカ型番
HDD/SSDケースAOTECHAOK-25CASE-U3C
SSDcrucialCT250MX500SSD1/JP
Disk for ZFS

接続したときのdmesg(8)出力は次のとおりです。

[    49.848242] umass0 at uhub0 port 2 configuration 1 interface 0
[    49.848242] umass0: AOTECH (0x152d) AOTECH (0x578), rev 3.00/7.01, addr 1
[    49.848242] umass0: using SCSI over Bulk-Only
[    49.848242] scsibus0 at umass0: 2 targets, 1 lun per target
[    49.858249] sd0 at scsibus0 target 0 lun 0: <AOTECH, , 0701> disk fixed
[    49.868255] sd0: fabricating a geometry
[    49.868255] sd0: 232 GB, 238475 cyl, 64 head, 32 sec, 512 bytes/sect x 488397168 sectors
[    49.888268] sd0: fabricating a geometry

NetBSDバージョンの確認

前述のとおりNetBSD 8.99.37以降から新しいバージョンのZFSを使えます。まずはuname -rを実行しバージョンを確認してください。8.99.37以前であればNetBSDのビルドと更新が必要です。2019年7月9日時点でcurrent版を使いたくないのであれば、古いZFSで我慢するか8.2や9.0のリリースを待つことになります。

本稿ではバージョン8.99.50で動作確認しました。

カーネルモジュールをロードする

ZFSを使うには、事前にzfsモジュールをロードする必要があります。modload(8)にzfs.kmodを渡してください。

modload /stand/amd64/8.99.50/modules/zfs/zfs.kmod

このモジュールをロードすると、dmesg(8)からWARNING: ZFS on NetBSD is under developmentといった文字列を確認できます。またmodstat(8)を実行してロードされたカーネルモジュールを確認することもできます。

    NAME                    CLASS    SOURCE   FLAG  REFS    SIZE REQUIRES
    ...
    zfs                     vfs      filesys  -        0       - solaris
    ...

ZFS poolを作成する

モジュールをロードできたら、ディスクを接続していよいよZFSを使います。ここでは接続したディスク全体(/dev/sd0)をひとつのZFSストレージプールと見立てます。プールを作るにはzpool(8)をroot権限で実行します。zpoolという名前のプールを作成します。

zpool create zpool /dev/sd0

このコマンドを実行すると、ルートディレクトリ(/)にzpoolディレクトリが自動的に作られ、プールがマウントされます。mount(8)からマウントされているファイルシステムの一覧を見てみましょう。

mount
/dev/wd0a on / type ffs (local)
kernfs on /kern type kernfs (local)
ptyfs on /dev/pts type ptyfs (local)
procfs on /proc type procfs (local)
tmpfs on /var/shm type tmpfs (local)
zpool on /zpool type zfs (local)

ZFSファイルシステムを作成する

次にzfs(8)でこのプールにファイルシステムを作成します。たとえばshareというファイルシステムを作ります。

zfs create zpool/share

zfs listからシステムのZFSファイルシステムの一覧を取得できます。

zfs list
NAME          USED  AVAIL  REFER  MOUNTPOINT
zpool         103K   228G    22K  /zpool
zpool/share    21K   228G    21K  /zpool/share

作成したファイルシステムは自動的にマウントされるため、作成後はすぐにマウントポイント/zpool/shareを参照できます。

ここではshareという名前でファイルシステムを作りましたが、用途に応じて任意の名前のファイルシステムを作成してください。ZFSではファイルシステム単位でスナップショット/ロールバックができます。そのような操作の対象となることを想定した粒度でファイルシステムを作るといいでしょう。

マウント・アンマウント

zfs umount -aをすると、システムでマウントされているZFSファイルシステムがすべてアンマウントされます。一方zfs mount -aはシステムから見えているプールのファイルシステムをすべてマウントします。

zpool upgradeとzfs upgradeの出力

参考までにzpool upgradezfs upgradeの出力結果を載せておきます。前述のとおり、NetBSDのバージョンは8.99.50です。

zpool upgrade
This system supports ZFS pool feature flags.

All pools are formatted using feature flags.

Every feature flags pool has all supported features enabled.
zfs upgrade
This system is currently running ZFS filesystem version 5.

All filesystems are formatted with the current version.

歴史

2009年8月7日、ZFSはAdam HamsikによってNetBSD-currentへ移植されました[hamsik2009]。2018年5月28日、Chuck Silversによって新しいバージョンのdtraceとZFSが取り込まれました[chs2018]。

参考文献

ZFS
https://www.clarestudio.org/netbsd/zfs.html
2019/07/07 閲覧
Finish ZFS
https://wiki.netbsd.org/projects/project/zfs/
2019/07/07 閲覧
[HEADS UP] zfs import
https://mail-index.netbsd.org/current-users/2009/08/07/msg010283.html
2019/07/21 閲覧
src/external/cddl/osnet/lib/libzfs/Makefile - view - 1.9
http://cvsweb.netbsd.org/bsdweb.cgi/src/external/cddl/osnet/lib/libzfs/Makefile?rev=1.9&content-type=text/x-cvsweb-markup&only_with_tag=MAIN
2019/07/21 閲覧