ZFS で NAS 用に RAID1 (mirror) 構成を作る

参考にさせてもらったページ

ZFS の開発元 Sun Microsystems さんをまるっと吸収した ORACLE さんに資料があります
公式でなかなかのボリュームですが、ぶっちゃけオライリー1冊分の資料がタダで参照できるのはとても有難いことです

Oracle Solaris ZFS 管理ガイド

ZFS ストレージプールを作成および破棄する

ZFS ストレージプール内のデバイスを管理する

GPTヘッダのクリア


FreeBSD 12.1 release でNASを作ろう

今時オンプレでPC-NASを構築する物好きはアタシくらいでしょうが・・・(^^;

用意するモノ

FreeBSD 12.1 releaseの入ったPCサーバ
ただしシステムドライブはufsにしました
冗長性を考慮して2重化するなら rootpool も必要かもしれません(^^;
ストレージ用のハードディスクドライブ
NAS用と言うことで奮発しWestern DigitalのWD80EFAX (WD REDシリーズ8TBモデル) を3機搭載


ZFSでストレージプールを作成する

ストレージプールは複数のハードウェアにまたがって構成できるファイルシステムの仮想領域で
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


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

ZFSストレージプールのプロパティ情報表示

設定情報なんかも全部出てきてアレですけど 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

スナップショットとロールバックまで手が回りませんでしたが既に
結構なボリュームなので後日別コンテンツにまとめることになりそう(^^;

以上


RAJ商会 March.2020