目次

ZFS Tips

ZFSを使い始めて早6年、自分なりにノウハウもたまってきたので纏めてみる。尚、FreeBSD自宅鯖のゆる~い環境での実績であり、ミッションクリティカルな環境では必ずしも適合しないと思われるので、そこんとこ承知の上で夜露死苦!

あれこれ

Root on ZFS環境ではシステム用とデータ用でプールを分ける

ブート領域も含めてZFS上にFreeBSD環境を作ることを、界隈ではRoot on ZFSと呼んだりする。この時、例え物理ストレージが1台だけだとしても、システムとデータでパーティションを分け、それぞれ別のプールにした方が良い。

なぜならば、システムが入っているプール、すなわちルートプールは以下の様な制限があるからだ。

要するに、運用状況に応じて後からどうにかできる、というZFSのメリットを享受できないのだ。

コマンド例集

マウントポイントを指定してプールをインポートする

zpool import -R /path/to/mountroot poolname

zpool.cacheの場所を指定してプールをインポートする

zpool import -o cachefile=/path/to/writable/zpool.cache poolname

-Rと合わせてRoot on ZFSなFreeBSDに便利

プールの名前を変更する

一旦エクスポートして新名称を与えてインポートする手順を踏む。

zpool export ztank
zpool import ztank ztank_new_name

Unicode正規化方式を指定してFSを作成

zfs create -o nomalization=type fsname

任意のzpool.cacheでzdb

zdb -U /path/to/zpool.cache

1デバイスのプールにミラー用のデバイスを追加する

zpool attach POOLNAME ada1p1 ada2p1

ada1p1が既存のデバイスで、ada2p1が追加するミラー用のデバイス。

addと紛らわしいので注意。

ミラー用のデバイスを取り外す

zpool detach ZTANK UUID または zpool detach ZTANK デバイス

# zpool status zhome2 
  pool: zhome2
 state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
        the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://illumos.org/msg/ZFS-8000-2Q
  scan: resilvered 572G in 1h50m with 0 errors on Mon Aug  1 00:18:18 2016
config:

        NAME                      STATE     READ WRITE CKSUM
        zhome2                    DEGRADED     0     0     0
          mirror-0                DEGRADED     0     0     0
            15064995861805685088  UNAVAIL      0     0     0  was /dev/ada0p1
            ada1p1                ONLINE       0     0     0 
            ada2p1                ONLINE       0     0     0
            ada3p1                ONLINE       0     0     0

# zpool detach zhome2 15064995861805685088
# zpool detach zhome2 ada1p1
# zpool status zhome2 
  pool: zhome2
 state: ONLINE
  scan: none requested
config:

        NAME                      STATE     READ WRITE CKSUM
        zhome2                    DEGRADED     0     0     0
          mirror-0                DEGRADED     0     0     0
            ada2p1                ONLINE       0     0     0
            ada3p1                ONLINE       0     0     0

UNAVAILなデバイスを置き換える

zpool replace ZTANK UNAVAILデバイスのUUID 新しいデバイスのID

# zpool status
  pool: zdata
 state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
	the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://illumos.org/msg/ZFS-8000-2Q
  scan: resilvered 589G in 1h0m with 0 errors on Sun Apr 29 00:02:27 2018
config:

	NAME                      STATE     READ WRITE CKSUM
	zdata                     DEGRADED     0     0     0
	  raidz2-0                DEGRADED     0     0     0
	    ada0p1                ONLINE       0     0     0
	    ada1p1                ONLINE       0     0     0
	    13314283577528650983  UNAVAIL      0     0     0  was /dev/ada2p1
	    1814680760048993662   UNAVAIL      0     0     0  was /dev/ada3p1
	logs
	  ada4p5                  ONLINE       0     0     0
	cache
	  ada4p4                  ONLINE       0     0     0

errors: No known data errors

# zpool replace zdata 13314283577528650983 ada2p1
# zpool replace zdata 1814680760048993662 ada3p1
# zpool status
  pool: zdata
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
	continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Sun Apr 29 09:24:43 2018
        26.5G scanned out of 1.19T at 343M/s, 0h59m to go
        12.8G resilvered, 2.18% done
config:

	NAME                        STATE     READ WRITE CKSUM
	zdata                       DEGRADED     0     0     0
	  raidz2-0                  DEGRADED     0     0     0
	    ada0p1                  ONLINE       0     0     0
	    ada1p1                  ONLINE       0     0     0
	    replacing-2             UNAVAIL      0     0     0
	      13314283577528650983  UNAVAIL      0     0     0  was /dev/ada2p1/old
	      ada2p1                ONLINE       0     0     0  (resilvering)
	    replacing-3             UNAVAIL      0     0     0
	      1814680760048993662   UNAVAIL      0     0     0  was /dev/ada3p1/old
	      ada3p1                ONLINE       0     0     0  (resilvering)
	logs
	  ada4p5                    ONLINE       0     0     0
	cache
	  ada4p4                    ONLINE       0     0     0

errors: No known data errors

ZILを外す

zpool remove POOOLNAME ada0p0

ミラーにしてる時は順次デバイスをdetachし、最後の1つをremoveする。

zpool detach POOLNAME ada0p0
zpool detach POOLNAME ada1p0
...
zpool remove POOLNAME adaXp0

gpartコマンド例集

ZFSと一緒に使う事が多いので、gpartコマンド例も一緒にまとめておく。

GPTでパーティションテーブルを初期化

gpart create -s gpt adaX

パーティションテーブルを削除

gpart destroy adaX

この時、パーティションテーブルが空じゃないとgpart: Device busyと怒られる。大抵パーティションテーブルには何かしら書かれてる事多いので、殆どの場合でこのメッセージを見る事になる。その時は-Fオプションで強制的に削除する。

パーティションの追加

gpart add -a 4k -s SIZE -t freebsd-zfs adaX