ZFS の開発元 Sun Microsystems さんをまるっと吸収した ORACLE さんに資料があります
公式でなかなかのボリュームですが、ぶっちゃけオライリー1冊分の資料がタダで参照できるのはとても有難いことです
今時オンプレでPC-NASを構築する物好きはアタシくらいでしょうが・・・(^^;
用意するモノ
FreeBSD 12.1 releaseの入ったPCサーバ
ただしシステムドライブはufsにしました
冗長性を考慮して2重化するなら rootpool も必要かもしれません(^^;
ストレージ用のハードディスクドライブ
NAS用と言うことで奮発しWestern DigitalのWD80EFAX (WD REDシリーズ8TBモデル) を3機搭載
ストレージプールは複数のハードウェアにまたがって構成できるファイルシステムの仮想領域で
ZFS ではコマンド一つで各種 raid およびストライピング構成が実現できます
# zpool create -f datapool mirror ada1 ada2 spare ada3
上記1コマンドで2台mirror+1台のホットスペア構成を作成
あるいはzpool createでmirrorプールを作成後にzpool addでホットスペアを追加することも出来ます
作成した領域の確認はzpool status datapoolで出来ます
datapoolの部分は任意ですが予約済みの書き出しなどは禁止されています
ZFS コンポーネントに名前を付けるときの規則
他例だとtankとかを使っています
# zpool status datapool pool: datapool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM datapool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 ada1 ONLINE 0 0 0 ada2 ONLINE 0 0 0 spares ada3 AVAIL errors: No known data errors
んん?dmesgしたら何かおかしいぞ?
# dmesg | grep ada ... GEOM: ada1: the primary GPT table is corrupt or invalid. GEOM: ada1: using the secondary instead -- recovery strongly advised. GEOM: ada2: the primary GPT table is corrupt or invalid. GEOM: ada2: using the secondary instead -- recovery strongly advised. GEOM: ada3: the primary GPT table is corrupt or invalid. GEOM: ada3: using the secondary instead -- recovery strongly advised. ...
インストールの際に作ったGPTヘッダが残ったままでZFSプールを作成してました
色々と調べるとGPTヘッダを消去すれば良いという事が判明
# gpart show => 40 ****03008 ada0 GPT (***G) 40 1024 1 freebsd-boot (512K) **64 ****37312 2 freebsd-ufs (***G) ****38376 ****608 3 freebsd-swap (4.0G) ****26984 ****64 - free - (135M) => 40 15628053088 ada1 GPT (7.3T) [CORRUPT] 40 15628053088 - free - (7.3T) => 40 15628053088 ada2 GPT (7.3T) [CORRUPT] 40 15628053088 - free - (7.3T) => 40 15628053088 ada3 GPT (7.3T) [CORRUPT] 40 15628053088 - free - (7.3T) => 40 15628053088 diskid/DISK-VAJ***** GPT (7.3T) [CORRUPT] 40 15628053088 - free - (7.3T) => 40 15628053088 diskid/DISK-VAJ***** GPT (7.3T) [CORRUPT] 40 15628053088 - free - (7.3T) => 40 15628053088 diskid/DISK-VAJ***** GPT (7.3T) [CORRUPT] 40 15628053088 - free - (7.3T)
とまあこんな感じでした(^^;
zpoolはバックアップ取るような実データが何もないのでdatapoolから外しgpart destroyにてGPTヘッダを消去することにしました
参考先はddでフォーマットかけています(^^;;
# zpool export datapool # gpart destroy ada1 ada1 destroyed # gpart destroy ada2 ada2 destroyed # gpart destroy ada3 ada3 destroyed
その後再度領域を確保・ scrub (mirror構成の整合性確認と修復)・再確認をします
scrub については下記に詳細記述があります
ZFS データの明示的なスクラブ
# zpool create -f datapool mirror ada1 ada2 spare ada3 # zpool scrub datapool # zpool status datapool pool: datapool state: ONLINE scan: scrub repaired 0 in 0 days 00:00:00 with 0 errors on Wed Mar 4 10:57:55 2020 config: NAME STATE READ WRITE CKSUM datapool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 ada1 ONLINE 0 0 0 ada2 ONLINE 0 0 0 spares ada3 AVAIL errors: No known data errors # gpart show => 40 ****03008 ada0 GPT (447G) 40 1024 1 freebsd-boot (512K) 1064 ****37312 2 freebsd-ufs (443G) ****38376 ****608 3 freebsd-swap (4.0G) ****26984 ****64 - free - (135M)
ストレージプールの下では mkdir でもフォルダを作成することが出来ますが
zfs create コマンドで作成するとちょっとしたメリットがあることを発見w
比較のために mkdir で test フォルダを, zfs create で 01storage フォルダをそれぞれ作成し
ls, zfs list, zpool list コマンド実行の挙動を下記しておく
# mkdir /datapool/test # zfs create datapool/01storage # ll total 5 drwxr-xr-x 2 root wheel 2 3月 5 10:57 01storage/ drwxr-xr-x 2 root wheel 512 3月 5 10:57 test/ # zfs list NAME USED AVAIL REFER MOUNTPOINT datapool 620K 7.02T 88K /datapool datapool/01storage 88K 7.02T 88K /datapool/01storage # zpool list NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT datapool 7.25T 800K 7.25T - - 0% 0% 1.00x ONLINE -
自分の運用を鑑み, 下記4つのファイルシステムを quota=off, compression=off で作成する
# zfs create datapool/01storage # zfs create datapool/02storage # zfs create datapool/backup_f # zfs create datapool/backup_s # zfs list NAME USED AVAIL REFER MOUNTPOINT datapool 896K 7.02T 88K /datapool datapool/01storage 88K 7.02T 88K /datapool/01storage datapool/02storage 88K 7.02T 88K /datapool/02storage datapool/backup_f 88K 7.02T 88K /datapool/backup_f datapool/backup_s 88K 7.02T 88K /datapool/backup_s
ここまでで /datapool へ作成されたストレージプールがマウントされて
その下にファイルシステムが作成されました
(2020.3.25追記)そのまま実データを入れたら zfs list でも Allocated が増えない・・・(滝汗
色々と調査をしたらデータセットの mountpoint 先はmkdirで実 path を作らないとダメみたいでした(^^;
なので
# mkdir /01storage # mkdir /02storage # mkdir /backup_f # mkdir /backup_s # zfs set mountpoint=/01storage datapool/01storage # zfs set mountpoint=/02storage datapool/02storage # zfs set mountpoint=/backup_f datapool/backup_f # zfs set mountpoint=/backup_s datapool/backup_s
(2020.4.16追記)再起動したらデータセットが df から消えた・・・(滝汗
/etc/rc.conf へ zfs_enable="YES" を書き忘れておりました
# sysrc zfs_enable="YES"
か
# vi /etc/rc.conf zfs_enable="YES" #追記する
で解決です
===追記ここまで===
zfsコマンドやスナップショットなどまだまだ色々読まなきゃならないですが
次章でメンテナンス用の管理コマンドを拾っておきますw
上にも頻繁に出ますが zpool status コマンドは欠かせないです
# zpool status datapool pool: datapool state: ONLINE scan: scrub repaired 0 in 0 days 00:00:00 with 0 errors on Wed Mar 4 17:11:50 2020 config: NAME STATE READ WRITE CKSUM datapool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 ada1 ONLINE 0 0 0 ada2 ONLINE 0 0 0 spares ada3 AVAIL errors: No known data errors
ストレージプール指定は省略することも出来ます
# zpool status pool: datapool state: ONLINE scan: scrub repaired 0 in 0 days 00:00:00 with 0 errors on Wed Mar 4 17:11:50 2020 config: NAME STATE READ WRITE CKSUM datapool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 ada1 ONLINE 0 0 0 ada2 ONLINE 0 0 0 spares ada3 AVAIL errors: No known data errors
設定情報なんかも全部出てきてアレですけど zpool get all コマンドを入れれば空き容量や使用状況も分かりますw
ちなみに zfs get all とすると恐ろしいくらい冗長性が高くなりますが設定内容のみとなりますw
欲しいのは size, capacity, free と allocated 位ですかね
この辺は periodic daily に吐かせたいw・・・と思ったら zpool list と zfs list コマンドがありました(^^;;;
# zpool get all datapool NAME PROPERTY VALUE SOURCE datapool size 7.25T - datapool capacity 0% - datapool altroot - default datapool health ONLINE - datapool guid ******38013****94486 default datapool version - default datapool bootfs - default datapool delegation on default datapool autoreplace off default datapool cachefile - default datapool failmode wait default datapool listsnapshots off default datapool autoexpand off default datapool dedupditto 0 default datapool dedupratio 1.00x - datapool free 7.25T - datapool allocated 580K - datapool readonly off - datapool comment - default datapool expandsize - - datapool freeing 0 default datapool fragmentation 0% - datapool leaked 0 default datapool bootsize - default datapool checkpoint - - ....
# zpool list NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT datapool 7.25T 580K 7.25T - - 0% 0% 1.00x ONLINE - # zfs list NAME USED AVAIL REFER MOUNTPOINT datapool 896K 7.02T 88K /datapool datapool/01storage 88K 7.02T 88K /datapool/01storage datapool/02storage 88K 7.02T 88K /datapool/02storage datapool/backup_f 88K 7.02T 88K /datapool/backup_f datapool/backup_s 88K 7.02T 88K /datapool/backup_s
ada1 ada2 のミラー構成の内 ada1 で障害が発生したと想定して対策作業をする一連の流れを下記から抜粋
ストレージプール内のホットスペアをアクティブにする/非アクティブにする
その1 zpool replace コマンドを使用して、ディスク ada1 をホットスペア ada3 と置き換え
# zpool replace datapool ada1 ada3
その2 ada1のパージ
# zpool detach datapool ada1
その3 NGのdiskを置き換えた後にストレージプールに再登録
# zpool replace datapool ada1
その4 zpool detach コマンドを使用して、ada3 をホットスペアへ戻す
# zpool detach datapool ada3
スナップショットとロールバックまで手が回りませんでしたが既に
結構なボリュームなので後日別コンテンツにまとめることになりそう(^^;
以上