FreeNAS の RAID-Z2 ディスク交換手順まとめ

自宅ではファイルサーバとして FreeNAS を使った NAS を運用しています。組み立ててから後2ヶ月ほどで2年が経過するので、そろそろディスクがおかしくなりはじめるかもしれない。予防交換したほうがよいのだろうか 🤔

復旧の手順について、実際に壊れてからゆっくり調べるわけにはいかないと思うので、事前に検証して手順をまとめておこうと思います。実際にハードウェアを用意するのは難しいため、今回は実際に運用している RAID-Z2 の構成を VM 上に再現して手順を確認してみます。

FreeNAS の場合、Web UI を使う方法と、コマンドを叩く方法の二通りの復旧手順があります。今回はその両方を確認してみました。

はじめに

個人的にまとめたメモになりますので、下記の内容を実際に試す際は自己責任でお願いします。データ消失などに関しては一切の責任を負いかねます。

検証環境の準備

インストール手順などの詳細は今回は割愛します。RAID-Z2 でディスク6本を束ね、適当なファイルをいくつか入れておきました。

  • VirtualBox v5.1.6
  • FreeNAS 9.10.1-U2
    • 8GB VDI (system 用)
    • 1GB VDI x 6 (RAID-Z2)

わざとディスクに異常を発生させる

/dev/ada1 に対して dd/dev/urandom を書き込み、DEGRADED な状態をわざと作ってみました。今回はこの状態から作業をスタートします。

[root@freenas] ~# sysctl kern.geom.debugflags=0x10
kern.geom.debugflags: 16 -> 16
[root@freenas] ~# dd if=/dev/urandom of=/dev/ada1 bs=512 count=5000000
5000000+0 records in
5000000+0 records out
2560000000 bytes transferred in 436.151336 secs (5869522 bytes/sec)
[root@freenas] ~# zpool scrub volume0
[root@freenas] ~# zpool status volume0
  pool: volume0
 state: DEGRADED
status: One or more devices has experienced an unrecoverable error.  An
	attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
	using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://illumos.org/msg/ZFS-8000-9P
  scan: scrub repaired 4.84M in 0h0m with 0 errors on Wed Nov  2 19:51:02 2016
config:

	NAME                                            STATE     READ WRITE CKSUM
	volume0                                         DEGRADED     0     0     0
	  raidz2-0                                      DEGRADED     0     0     0
	    gptid/eeab940f-a0e8-11e6-8b31-080027b67ce3  DEGRADED     0     0   399  too many errors
	    gptid/5eada448-a03f-11e6-a379-080027b67ce3  ONLINE       0     0     0
	    gptid/5ee0f067-a03f-11e6-a379-080027b67ce3  ONLINE       0     0     0
	    gptid/5f07875d-a03f-11e6-a379-080027b67ce3  ONLINE       0     0     0
	    gptid/5f2e33a8-a03f-11e6-a379-080027b67ce3  ONLINE       0     0     0
	    gptid/5f51c7e4-a03f-11e6-a379-080027b67ce3  ONLINE       0     0     0

errors: No known data errors

[復旧方法1] Web UI を使う場合

まずは FreeNAS の Web UI 上から復旧させる手順を確認してみます。

1. 交換対象のディスクの確認

ストレージ → ボリュームを表示 でボリュームの一覧を表示し、復旧対象のボリュームを選んで ボリュームのステータス を押す。

ボリュームを構成するディスクの一覧が出るので DEGRADED になってるやつを探す。

ボリュームを選択し ディスクを編集 ボタンを押すと、ディスクのシリアル番号を確認することができます。この番号をメモっておきます。

2. ディスクの交換

FreeNAS をシャットダウンし、新しい HDD と取り替えます。先の手順でメモったシリアル番号で、交換対象の HDD がどれかを確認すると間違いがないと思います。

今回は VM なので対象のディスクイメージを削除し、同じサイズのディスクイメージを新規作成しました。

ディスク入れ替えが終わったら FreeNAS を起動します。

3. 新しいディスクへの交換

FreeNAS を立ち上げ、再び ボリュームのステータス を表示すると、交換対象のディスクの状態が UNAVAIL になってるかと思います。 対象のディスクを選択し Replace ボタンを押すと、交換先の新しいディスクを選択するメニューが現れので、新しいディスクを選択し ディスク交換 ボタンを押す。

ボリュームのステータスが Resilver となり、全てのディスクが ONLINE になれば作業完了です。

[復旧方法2] コマンドを使う場合

続いてコマンドによる復旧手順を確認してみます。Web UI のシェル機能や、直接サーバに SSH ログインして復旧させる場合ですね。

1. 交換対象のディスクの確認

zpool status で交換対象ディスクを確認します。各ディスクは UUID で表記されているため、この情報を元にディスクのシリアル番号を調べていきます。

[root@freenas] ~# zpool status volume0
  pool: volume0
 state: DEGRADED
status: One or more devices has experienced an unrecoverable error.  An
        attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
        using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://illumos.org/msg/ZFS-8000-9P
  scan: scrub repaired 4.86M in 0h0m with 0 errors on Wed Nov  2 21:51:02 2016
config:

        NAME                                            STATE     READ WRITE CKSUM
        volume0                                         DEGRADED     0     0     0
          raidz2-0                                      DEGRADED     0     0     0
            gptid/fdecebfc-a0f3-11e6-acde-080027b67ce3  DEGRADED     0     0   421  too many errors
            gptid/5eada448-a03f-11e6-a379-080027b67ce3  ONLINE       0     0     0
            gptid/5ee0f067-a03f-11e6-a379-080027b67ce3  ONLINE       0     0     0
            gptid/5f07875d-a03f-11e6-a379-080027b67ce3  ONLINE       0     0     0
            gptid/5f2e33a8-a03f-11e6-a379-080027b67ce3  ONLINE       0     0     0
            gptid/5f51c7e4-a03f-11e6-a379-080027b67ce3  ONLINE       0     0     0

errors: No known data errors

UUID を元に、デバイスの名前 (geom name) を調べていきます。gpart list で全ディスクの情報を一覧で表示することができるため、対象のディスクの UUID を grep で引っ掛けています。 2. Name: ada1p2 とのことなので /dev/ada1 のシリアル番号がわかれば良さそうです。

[root@freenas] ~# gpart list | grep fdecebfc-a0f3-11e6-acde-080027b67ce3 -B 10
   type: freebsd-swap
   index: 1
   end: 4194431
   start: 128
2. Name: ada1p2
   Mediasize: 2147397632 (2.0G)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 2147549184
   Mode: r1w1e2
   rawuuid: fdecebfc-a0f3-11e6-acde-080027b67ce3

camcontrol identify コマンドにデバイス名を渡すことでシリアル番号が判明します。

[root@freenas] ~# camcontrol identify ada1 | grep "serial number"
serial number         VB1695b2ea-a4995c2d

2. ディスクの交換

Web UI で交換する場合と同様です。(シャットダウン → HDD 入れ替え → FreeNAS を起動)

3. 新しいディスクへの交換

zpool status でボリュームのステータスを確認します。交換対象のディスクの状態が UNAVAIL になってるかと思います。

[root@freenas] ~# zpool status volume0
  pool: volume0
 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: scrub repaired 4.86M in 0h0m with 0 errors on Wed Nov  2 21:51:02 2016
config:

        NAME                                            STATE     READ WRITE CKSUM
        volume0                                         DEGRADED     0     0     0
          raidz2-0                                      DEGRADED     0     0     0
            9844065638001414655                         UNAVAIL      0     0     0  was /dev/gptid/fdecebfc-a0f3-11e6-acde-080027b67ce3
            gptid/5eada448-a03f-11e6-a379-080027b67ce3  ONLINE       0     0     0
            gptid/5ee0f067-a03f-11e6-a379-080027b67ce3  ONLINE       0     0     0
            gptid/5f07875d-a03f-11e6-a379-080027b67ce3  ONLINE       0     0     0
            gptid/5f2e33a8-a03f-11e6-a379-080027b67ce3  ONLINE       0     0     0
            gptid/5f51c7e4-a03f-11e6-a379-080027b67ce3  ONLINE       0     0     0

errors: No known data errors

zpool replace コマンドに、交換対象と新ディスクのデバイス名を渡します。status の結果が resilvered となり、全てのディスクが ONLINE になれば作業完了です。

[root@freenas] ~# zpool replace volume0 /dev/gptid/fdecebfc-a0f3-11e6-acde-080027b67ce3 ada1
[root@freenas] ~# zpool status volume0
  pool: volume0
 state: ONLINE
  scan: resilvered 4.97M in 0h0m with 0 errors on Wed Nov  2 23:36:03 2016
config:

        NAME                                            STATE     READ WRITE CKSUM
        volume0                                         ONLINE       0     0     0
          raidz2-0                                      ONLINE       0     0     0
            ada1                                        ONLINE       0     0     0
            gptid/5eada448-a03f-11e6-a379-080027b67ce3  ONLINE       0     0     0
            gptid/5ee0f067-a03f-11e6-a379-080027b67ce3  ONLINE       0     0     0
            gptid/5f07875d-a03f-11e6-a379-080027b67ce3  ONLINE       0     0     0
            gptid/5f2e33a8-a03f-11e6-a379-080027b67ce3  ONLINE       0     0     0
            gptid/5f51c7e4-a03f-11e6-a379-080027b67ce3  ONLINE       0     0     0

errors: No known data errors

まとめ

FreeNAS で構築した RAID-Z2 のディスク交換手順を確認しました。Web UI 使う場合もコマンド打つ場合も、復旧手順の大まかな流れはさほど変わらないようでした。HDD のシリアル番号と PC ケースの何番目に装着したかの対応表を NAS を組み立てたタイミングで作っておくと交換間違えを防ぐことができそうです。

今回は、対象ディスクを確認後すぐにディスク入れ替え作業に進みましたが、可能であれば対象ディスクを一度 OFFLINE にし、新ディスクを ONLINE にした後にボリュームへの組み込み作業を行ったほうが安全かもしれません。

また、再起動後に古い HDD の情報が残っている場合がある、という話も見かけたので、その場合は Detach 操作が必要になるかと思います。

今回はボリュームのサイズも中に入っているデータのサイズも小さかったためか、新ディスクへの入れ替え後すぐに復旧しました。しかし、実際の復旧作業では入れ替え後の rebuild に結構な時間がかかるのではないかと思います。


comments powered by Disqus