ZFSでRAID10プールの作成と後からRAID1メンバーを追加する方法

ZFSでRAID 1+0のプールを作るには、zpool createでmirror vdevを並べてやればよい。

zpool create プール名 \
  mirror  RAID1ペア1のデバイス1  RAID1ペア1のデバイス2 \
  mirror  RAID1ペア2のデバイス1  RAID1ペア2のデバイス2

上記コマンドではストレージ2台から成るミラーを2セットでRAID10としている。ミラーのメンバ数(各mirror行に指定するデバイス数)や、ストライピング数(mirrorの行数)は任意に変えられる。

大雑把に言うと、zpool createは引数のデバイスでストライプ構成のプールを作成するコマンドである。従って、与デバイスとしてHDD/SSDを直接指定すればRAID0プールとなるし、mirror vdevを渡せばRAID10となる。RAID-ZやRAID-Z2も同様。

既存のRAID 1+0プールにRAID1セットを追加するには、zpool addで以下のようにする。

  • zpool add プール名 mirror RAID1ペアのデバイス1 RAID1ペアのデバイス2

冒頭のプールで本コマンドを実行したとすると、ストレージ2台から成るミラーが3セットのRAID10プールに変わることとなる。

  • NAS4Free 11.0.0.4
  • 4TB HDD × 6本
    • 2本1組のRAID1を3ユニット束ねてRAID10とする

↓こんな感じで4TBのHDDが6本ある。

# camcontrol devlist
<WDC WD40EFRX-68N32N0 82.00A82>    at scbus0 target 0 lun 0 (ada0,pass0)
<WDC WD40EFRX-68N32N0 82.00A82>    at scbus1 target 0 lun 0 (ada1,pass1)
<WDC WD40EFRX-68N32N0 82.00A82>    at scbus2 target 0 lun 0 (ada2,pass2)
<WDC WD40EFRX-68N32N0 82.00A82>    at scbus4 target 0 lun 0 (ada4,pass3)
<WDC WD40EFRX-68N32N0 82.00A82>    at scbus5 target 0 lun 0 (ada5,pass4)
<WDC WD40EFRX-68N32N0 82.00A82>    at scbus6 target 0 lun 0 (ada6,pass5)

デバイス番号(adaX)が飛んでるのは、下図のようなSATAエンクロージャの上下にHDDを各3本挿し、上下のペアでミラーとしたため。

+---+---+---+---+
|   |   |   |   |
| 0 | 1 | 2 | 3 |
|   |   |   |   |
+---+---+---+---+
|   |   |   |   |
| 4 | 5 | 6 | 7 |
|   |   |   |   |
+---+---+---+---+

GPTで初期化する。

# gpart create -s gpt ada0
# gpart create -s gpt ada1
# gpart create -s gpt ada2
# gpart create -s gpt ada4
# gpart create -s gpt ada5
# gpart create -s gpt ada6

ZFS用にパーティションを切る。ディスク全体を使ってもいいのだが(実際ZFSではそのような使い方が推奨されている)、微妙な容量差で同一公称容量のHDDと交換出来ないと詰むため、敢えてパーティションを切って使っている。

# gpart add -a 4k -s 7800000000 -t freebsd-zfs ada0
# gpart add -a 4k -s 7800000000 -t freebsd-zfs ada1
# gpart add -a 4k -s 7800000000 -t freebsd-zfs ada2
# gpart add -a 4k -s 7800000000 -t freebsd-zfs ada4
# gpart add -a 4k -s 7800000000 -t freebsd-zfs ada5
# gpart add -a 4k -s 7800000000 -t freebsd-zfs ada6
# gpart show 
=>        40  7814037088  ada0  GPT  (3.6T)
          40  7800000000     1  freebsd-zfs  (3.6T)
  7800000040    14037088        - free -  (6.7G)

=>        40  7814037088  ada1  GPT  (3.6T)
          40  7800000000     1  freebsd-zfs  (3.6T)
  7800000040    14037088        - free -  (6.7G)

=>        40  7814037088  ada2  GPT  (3.6T)
          40  7800000000     1  freebsd-zfs  (3.6T)
  7800000040    14037088        - free -  (6.7G)

=>        40  7814037088  ada4  GPT  (3.6T)
          40  7800000000     1  freebsd-zfs  (3.6T)
  7800000040    14037088        - free -  (6.7G)

=>        40  7814037088  ada5  GPT  (3.6T)
          40  7800000000     1  freebsd-zfs  (3.6T)
  7800000040    14037088        - free -  (6.7G)

=>        40  7814037088  ada6  GPT  (3.6T)
          40  7800000000     1  freebsd-zfs  (3.6T)
  7800000040    14037088        - free -  (6.7G)

RAID10ボリュームを作成する。後の実験のために2ペア4台しか指定していないが、実際には初めから全てのHDDを使ったほうがいいだろう。

# zpool create zdata mirror ada0p1 ada4p1 mirror ada1p1 ada5p1
# zpool status
  pool: zdata
 state: ONLINE
  scan: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	zdata       ONLINE       0     0     0
	  mirror-0  ONLINE       0     0     0
	    ada0p1  ONLINE       0     0     0
	    ada4p1  ONLINE       0     0     0
	  mirror-1  ONLINE       0     0     0
	    ada1p1  ONLINE       0     0     0
	    ada5p1  ONLINE       0     0     0

errors: No known data errors

RAID1のペアを追加してみる。

# zpool add zdata mirror ada2p1 ada6p1
# zpool status
  pool: zdata
 state: ONLINE
  scan: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	zdata       ONLINE       0     0     0
	  mirror-0  ONLINE       0     0     0
	    ada0p1  ONLINE       0     0     0
	    ada4p1  ONLINE       0     0     0
	  mirror-1  ONLINE       0     0     0
	    ada1p1  ONLINE       0     0     0
	    ada5p1  ONLINE       0     0     0
	  mirror-2  ONLINE       0     0     0
	    ada2p1  ONLINE       0     0     0
	    ada6p1  ONLINE       0     0     0

errors: No known data errors

念のためashiftを確認。シフト量はvdevごとに存在することに注意。

# zdb -C zdata | grep ashift
                ashift: 12
                ashift: 12
                ashift: 12
  • zfs/zfs_create_raid10_pool.txt
  • 最終更新: 2022-01-11 20:08
  • by Decomo