====== ZFS Tips ====== ZFSを使い始めて早6年、自分なりにノウハウもたまってきたので纏めてみる。尚、FreeBSD自宅鯖のゆる~い環境での実績であり、ミッションクリティカルな環境では必ずしも適合しないと思われるので、そこんとこ承知の上で夜露死苦! ===== あれこれ ===== ==== Root on ZFS環境ではシステム用とデータ用でプールを分ける ==== ブート領域も含めてZFS上にFreeBSD環境を作ることを、界隈ではRoot on ZFSと呼んだりする。この時、例え物理ストレージが1台だけだとしても、システムとデータでパーティションを分け、それぞれ別のプールにした方が良い。 なぜならば、システムが入っているプール、すなわちルートプールは以下の様な制限があるからだ。 * 単一またはミラー構成しかサポートしない * 複数のvdevを持てない * すなわちslogやL2ARCを持てない 要するに、運用状況に応じて後からどうにかできる、という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