ZFSを使い始めて早6年、自分なりにノウハウもたまってきたので纏めてみる。尚、FreeBSD自宅鯖のゆる~い環境での実績であり、ミッションクリティカルな環境では必ずしも適合しないと思われるので、そこんとこ承知の上で夜露死苦!
ブート領域も含めてZFS上にFreeBSD環境を作ることを、界隈ではRoot on ZFSと呼んだりする。この時、例え物理ストレージが1台だけだとしても、システムとデータでパーティションを分け、それぞれ別のプールにした方が良い。
なぜならば、システムが入っているプール、すなわちルートプールは以下の様な制限があるからだ。
要するに、運用状況に応じて後からどうにかできる、というZFSのメリットを享受できないのだ。
zpool import -R /path/to/mountroot poolname
zpool import -o cachefile=/path/to/writable/zpool.cache poolname
-Rと合わせてRoot on ZFSなFreeBSDに便利
一旦エクスポートして新名称を与えてインポートする手順を踏む。
zpool export ztank zpool import ztank ztank_new_name
zfs create -o nomalization=type fsname
zdb -U /path/to/zpool.cache
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
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
zpool remove POOOLNAME ada0p0
ミラーにしてる時は順次デバイスをdetachし、最後の1つをremoveする。
zpool detach POOLNAME ada0p0 zpool detach POOLNAME ada1p0 ... zpool remove POOLNAME adaXp0
ZFSと一緒に使う事が多いので、gpartコマンド例も一緒にまとめておく。
gpart create -s gpt adaX
gpart destroy adaX
この時、パーティションテーブルが空じゃないとgpart: Device busy
と怒られる。大抵パーティションテーブルには何かしら書かれてる事多いので、殆どの場合でこのメッセージを見る事になる。その時は-F
オプションで強制的に削除する。
gpart add -a 4k -s SIZE -t freebsd-zfs adaX