【FreeNAS】RAIDZでDisk交換をする

# FreeNAS
[FreeNAS](http://www.freenas.org/)はNAS構築に特化したUNIXのディストリビューションです。FreeBSDベースで作られており、派生として、NAs4FreeやLinuxベースのOpen media vaultが存在しています。

# RAID-Z
RAID0,1,5...という区分の中ではRAID5に相当する。自宅のNASはHDDが3台のRAID-Zで運用されている。そのため、HDD1本が壊れても動作し続けるくらいの耐障害性がある。
今回このRAID-Zを構成しているHDDのうち1本がおかしいということで、入れ替え作業をメモメモ

# FreeNAS上での確認
最初はアラートに気づいていなかったけれど、2回目のアラートでHDDのトラブルを確認
FreeNAS上のUIからは下記のように見える。とりあえず警告が出てる。
まだエラーになっていないから大丈夫。きっとまだいける。
本当にダメになるとFreeNASが自動的にHDDを切り離すはず。

<img width="596" alt="スクリーンショット 2017-06-08 20.57.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/8190/cc94e819-81d9-2f21-bd53-9b11b0376bfd.png">

# zpool statusで確認
まだ切り離しがされていないこともあり、基本的にステータスは問題ないっぽい

```shell-session

[root@freenas] ~# zpool status
  pool: RaidZStorage
 state: ONLINE
  scan: scrub repaired 0 in 14h25m with 0 errors on Sun May  7 14:25:35 2017
config:

	NAME                                            STATE     READ WRITE CKSUM
	RaidZStorage                                    ONLINE       0     0     0
	  raidz1-0                                      ONLINE       0     0     0
	    gptid/86502484-7ef4-11e4-ad6c-38eaa7a93732  ONLINE       0     0     0
	    gptid/8738b5da-7ef4-11e4-ad6c-38eaa7a93732  ONLINE       0     0     0
	    gptid/880cafb4-7ef4-11e4-ad6c-38eaa7a93732  ONLINE       0     0     0
```



# smartctlで確認
今回対象となっているDiskは/dev/ada2mなので、ada2の情報をsmartctlで確認する。
197,198の最後の値がじゃないと、基本的に動いてはいるけど、いつ壊れてもおかしくないよって感じ。書き込みできない不良セクタってやつ。
```shell-session
smartctl -a /dev/ada2
~略~
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       120
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       120
~略~
```

ちなみに正常だと思われる/dev/ada0についてはこんな感じ。

```shell-session
smartctl -a /dev/ada2
~略~
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   200   200   000    Old_age   Offline      -       0
~略~
```

# 交換するHDDの確認
NASに使ってるHP microserver(N54L)はHDDランプがないので、どのDiskが交換対象かはパット見わからない。そこでsmartctlの結果をメモした上で交換対象のDiskを特定する。とりあえずこれっぽい。

```shell-session
=== START OF INFORMATION SECTION ===
Model Family:     Seagate Barracuda 7200.14 (AF)
Device Model:     ST2000DM001-1CH164
Serial Number:    Z1E4BQRA
LU WWN Device Id: 5 000c50 050aef61b
Firmware Version: CC44
User Capacity:    2,000,398,934,016 bytes [2.00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    7200 rpm
Form Factor:      3.5 inches
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ATA8-ACS T13/1699-D revision 4
SATA Version is:  SATA 3.0, 6.0 Gb/s (current: 3.0 Gb/s)
Local Time is:    Thu Jun  8 21:33:41 2017 JST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
```

念のために正常なDiskのシリアルも確認

```shell-session
Serial Number:    WD-WMC4N0F119Z5 (ada0)
Serial Number:    WD-WMC4N0F05M3S (ada1)
```

# パーティション情報の取得
念のためパーティション情報も取得しておく

```shell-session
[root@freenas] ~# gpart show ada2
=>        34  3907029101  ada2  GPT  (1.8T)
          34          94        - free -  (47K)
         128     4194304     1  freebsd-swap  (2.0G)
     4194432  3902834696     2  freebsd-zfs  (1.8T)
  3907029128           7        - free -  (3.5K)
```

# FreeNASのシャットダウン
各種クライアントからのマウントをやめた上で

```shell-session

[root@freenas] ~# shutdown -p now
Shutdown NOW!
shutdown: [pid 96234]
```

HDD交換後

# zool statusで確認
自動でRAIDの再構築は始まらないので、下記のような表示でDEGRADEDになっているはず。

```shell-session
[root@freenas] ~# zpool status
  pool: RaidZStorage
 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 0 in 14h25m with 0 errors on Sun May  7 14:25:35 2017
config:

	NAME                                            STATE     READ WRITE CKSUM
	RaidZStorage                                    DEGRADED     0     0     0
	  raidz1-0                                      DEGRADED     0     0     0
	    12153346589594475547                        UNAVAIL      0     0     0  was /dev/gptid/86502484-7ef4-11e4-ad6c-38eaa7a93732
	    gptid/8738b5da-7ef4-11e4-ad6c-38eaa7a93732  ONLINE       0     0     0
	    gptid/880cafb4-7ef4-11e4-ad6c-38eaa7a93732  ONLINE       0     0     0
```

# パーティションの作成
今回はDiskを3TBに変更しました。1TB無駄になるけど、将来的に3TB構成にするには徐々に入れ替えるしかない

```shell-session
[root@freenas] ~# gpart show ada2
gpart: No such geom: ada2.
[root@freenas] ~# gpart create -s gpt ada2
ada2 created
[root@freenas] ~# gpart show ada2
=>        34  5860533101  ada2  GPT  (2.7T)
          34  5860533101        - free -  (2.7T)
```

先程のパーティション情報をもとにパーティションを作成していく

```shell-session

[root@freenas] ~# gpart add -i 1 -t freebsd-swap -b 128 -s 4194304 ada2
ada2p1 added
[root@freenas] ~# gpart show ada2
=>        34  5860533101  ada2  GPT  (2.7T)
          34          94        - free -  (47K)
         128     4194304     1  freebsd-swap  (2.0G)
     4194432  5856338703        - free -  (2.7T)
```

```shell-session
[root@freenas] ~# gpart add -i 2 -t freebsd-zfs ada2
ada2p2 added
[root@freenas] ~# gpart show ada2
=>        34  5860533101  ada2  GPT  (2.7T)
          34          94        - free -  (47K)
         128     4194304     1  freebsd-swap  (2.0G)
     4194432  5856338696     2  freebsd-zfs  (2.7T)
  5860533128           7        - free -  (3.5K)
```

# ZFS(zpool)にDiskを組み込む

freebsd-zfs の rawuuid を確認する。

```shell-session
2. Name: ada2p2
   Mediasize: 2998445412352 (2.7T)
   Sectorsize: 512
   Stripesize: 4096
   Stripeoffset: 0
   Mode: r0w0e0
   rawuuid: bd86d5e8-4c4b-11e7-83b1-38eaa7a93732
   rawtype: 516e7cba-6ecf-11d6-8ff8-00022d09712b
   label: (null)
   length: 2998445412352
   offset: 2147549184
   type: freebsd-zfs
   index: 2
   end: 5860533127
   start: 4194432
```
zpool statsuでOFFLINEのDISK IDを確認する

```shell-session
[root@freenas] ~# zpool status
  pool: RaidZStorage
 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 0 in 14h25m with 0 errors on Sun May  7 14:25:35 2017
config:

	NAME                                            STATE     READ WRITE CKSUM
	RaidZStorage                                    DEGRADED     0     0     0
	  raidz1-0                                      DEGRADED     0     0     0
	    12153346589594475547   ←これ                 UNAVAIL      0     0     0  was /dev/gptid/86502484-7ef4-11e4-ad6c-38eaa7a93732
	    gptid/8738b5da-7ef4-11e4-ad6c-38eaa7a93732  ONLINE       0     0     0
	    gptid/880cafb4-7ef4-11e4-ad6c-38eaa7a93732  ONLINE       0     0     0
```

replaceする

```shell-session
[root@freenas] ~# zpool replace RaidZStorage 12153346589594475547 gptid/bd86d5e8-4c4b-11e7-83b1-38eaa7a93732
```

# 確認
replace後はRAIDの再構築が始まる。

```shell-session
[root@freenas] ~# zpool status
  pool: RaidZStorage
 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 Thu Jun  8 22:15:56 2017
        4.00G scanned out of 3.49T at 15.5M/s, 65h42m to go
        1.33G resilvered, 0.11% done
config:

	NAME                                              STATE     READ WRITE CKSUM
	RaidZStorage                                      DEGRADED     0     0     0
	  raidz1-0                                        DEGRADED     0     0     0
	    replacing-0                                   UNAVAIL      0     0     0
	      12153346589594475547                        UNAVAIL      0     0     0  was /dev/gptid/86502484-7ef4-11e4-ad6c-38eaa7a93732
	      gptid/bd86d5e8-4c4b-11e7-83b1-38eaa7a93732  ONLINE       0     0     0  (resilvering)
	    gptid/8738b5da-7ef4-11e4-ad6c-38eaa7a93732    ONLINE       0     0     0
	    gptid/880cafb4-7ef4-11e4-ad6c-38eaa7a93732    ONLINE       0     0     0
```

結構かかりそう...

# その後...
どれくらいかかるか不明でしたが、数時間後にはRAIDの再構築も終わって、3本のDiskがONLINE状態になりました。

```shell-session
[root@freenas] ~# zpool status
  pool: RaidZStorage
 state: ONLINE
  scan: resilvered 1.16T in 11h50m with 0 errors on Fri Jun  9 10:06:53 2017
config:

	NAME                                            STATE     READ WRITE CKSUM
	RaidZStorage                                    ONLINE       0     0     0
	  raidz1-0                                      ONLINE       0     0     0
	    gptid/bd86d5e8-4c4b-11e7-83b1-38eaa7a93732  ONLINE       0     0     0
	    gptid/8738b5da-7ef4-11e4-ad6c-38eaa7a93732  ONLINE       0     0     0
	    gptid/880cafb4-7ef4-11e4-ad6c-38eaa7a93732  ONLINE       0     0     0

errors: No known data errors
```

これでまたしばらく安心なNAS生活が送れそうです。