はじめに
- 本ナレッジでは TrueNAS を使って構築されている NAS の HDD を交換する手順を解説する。
 - 交換手順は、すべての基本となる CLI コマンドを使うことを前提とする。
- 管理コンソールの UI を使ってお手軽に交換する手順もきっとあると思うが、ここは基本で。
 
 - 本文内に時々“FreeNAS”や“freenas”という記述が現れるが、これは、TrueNAS の前身の FreeNAS からシステムをアップグレードした際の名残が残っているものである。
 - 今回は ada2 (ATA Direct Access デバイス 2) を交換する例を示す。
 
TrueNAS のシステムを運用していく上での重要なポイント
① HDD の故障の検知
- ストレージ、特に HDD はいつかは壊れるものである。TrueNAS はソフトウェア RAID を構成しているので HDD が1台故障したくらいではビクともしないが、それでも複数台が同時に故障すると復旧できない可能性があるので、HDD の故障を検知したらすぐに交換した方がいい。
 
メールによるレポート
- TrueNAS からのレポートを E メールで受け取るように設定してある場合は、HDD が故障する予兆がメールで送られてくる。
 - 例えば以下のようなメールが送られてきたら、ここでレポートされている /dev/ada2 は危険な状態だと思った方がいい。
 
不良セクタ (読めないセクタ) の発見
TrueNAS @ truenas.koba.jp
New alerts:
* Device: /dev/ada2, 12 Currently unreadable (pending) sectors.
Current alerts:
* Device: /dev/ada2, 12 Currently unreadable (pending) sectors.
セルフテストの失敗
TrueNAS @ truenas.koba.jp
New alerts:
* Device: /dev/ada2, new Self-Test Log error at hour timestamp 28499.
Current alerts:
* Device: /dev/ada2, new Self-Test Log error at hour timestamp 28499.
S.M.A.R.T. 情報の確認
kernel ログの確認
- /var/log/messages や 
dmesg コマンドの実行結果に「ada数字」を含むログが大量に出力されている場合は、本体のマザーボードと HDD との接続不良、もしくは電源の容量不足が考えられる。 - キーワード:“Periph destroyed”、“WRITE_FPDMA_QUEUED”、“CAM status: Uncorrectable parity/CRC error”、“Retrying command”など。
 
zpool status の確認
zpool status を実行した結果に DEGRADED という単語が表示される場合は HDD の故障が検知されている。- S.M.A.R.T. 情報にエラーが出ているレベルでは 
zpool status に異常が報告されることはなく、何も問題なく普通に使えてしまう。ただ、特に何もしていないのにここで DEGRADED が報告される場合は、ハードウェアに致命的なエラーが発生している。 
OFFLINE の例
  pool: tank
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
    Sufficient replicas exist for the pool to continue functioning in a
    degraded state.
action: Online the device using 'zpool online' or replace the device with
    'zpool replace'.
  scan: scrub repaired 1012K in 0 days 07:41:57 with 0 errors on Sun Nov  1 07:42:00 2020
config:
    NAME                                            STATE     READ WRITE CKSUM
    tank                                            DEGRADED     0     0     0
      raidz1-0                                      ONLINE       0     0     0
        gptid/fb4719b4-7b72-11e8-b5ba-6045cba529aa  ONLINE       0     0     0
        gptid/9d5dcf29-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
        gptid/9e35641b-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
        gptid/9f1248e1-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
      raidz1-1                                      DEGRADED     0     0     0
        gptid/41101340-7b89-11e8-9aa5-6045cba529aa  ONLINE       0     0     0
        gptid/a142856a-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
        10902394484659602262                        OFFLINE      0     0     0  was /dev/gptid/a21d029e-23a0-11e8-8570-6045cba529aa
        gptid/a3056122-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
errors: No known data errors
- 上記の例では、“raidz1-1”の“/dev/gptid/a21d029e-23a0-11e8-8570-6045cba529aa”が自動的に OFFLINE になり、“ 10902394484659602262”という NAME がついている。
 
REMOVED の例
# zpool status
    :
  pool: tank
 state: DEGRADED
status: One or more devices has been removed by the administrator.
    Sufficient replicas exist for the pool to continue functioning in a
    degraded state.
action: Online the device using zpool online' or replace the device with
    'zpool replace'.
  scan: resilvered 8.24M in 00:00:03 with 0 errors on Mon Nov  9 02:10:28 2020
config:
    NAME                                            STATE     READ WRITE CKSUM
    tank                                            DEGRADED     0     0     0
      raidz1-0                                      ONLINE       0     0     0
        gptid/fb4719b4-7b72-11e8-b5ba-6045cba529aa  ONLINE       0     0     0
        gptid/9d5dcf29-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
        gptid/9e35641b-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
        gptid/9f1248e1-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
      raidz1-1                                      DEGRADED     0     0     0
        gptid/41101340-7b89-11e8-9aa5-6045cba529aa  ONLINE       0     0     0
        gptid/a142856a-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
        gptid/e6523a43-2151-11eb-b673-6045cba529aa  ONLINE       0     0     0
        gptid/a3056122-23a0-11e8-8570-6045cba529aa  REMOVED      0     0     0
errors: No known data errors
- 上記の例では、ハードウェアレベルの kernel ログが大量に報告されていた“raidz1-1”の“gptid/a3056122-23a0-11e8-8570-6045cba529aa”が、ついに REMOVED にされている。
 
② 現状を確認する
- HDD の故障を検知して ada2 が何かおかしいと判明したら、すぐに現状を確認する。
 
zpool status の結果を見る
# zpool status
    :
  pool: tank
 state: ONLINE
  scan: resilvered 1.54T in 05:25:18 with 0 errors on Tue Nov 24 09:06:10 2020
config:
    NAME                                            STATE     READ WRITE CKSUM
    tank                                            ONLINE       0     0     0
      raidz1-0                                      ONLINE       0     0     0
        gptid/fb4719b4-7b72-11e8-b5ba-6045cba529aa  ONLINE       0     0     0
        gptid/9d5dcf29-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
        gptid/9e35641b-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
        gptid/9f1248e1-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
      raidz1-1                                      ONLINE       0     0     0
        gptid/41101340-7b89-11e8-9aa5-6045cba529aa  ONLINE       0     0     0
        gptid/a142856a-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
        gptid/e6523a43-2151-11eb-b673-6045cba529aa  ONLINE       0     0     0
        gptid/9d8b4877-2d3c-11eb-9995-6045cba529aa  ONLINE       0     0     0
errors: No known data errors
- 今回は、
zpool status 的には特に何も問題は報告されていない。 
GPT ディスクラベルを確認する
- HDD を交換する場合、最終的には 
zpool コマンドを使って HDD のリプレースを指示するのだが、TrueNAS の zpool コマンドは GPT (GUID パーティションテーブル) を使ってストレージを判別しているので、問題の ada2 の GPT ディスクラベルを確認する必要がある。 
# gpart list
     :
Geom name: ada2
modified: false
state: OK
fwheads: 16
fwsectors: 63
last: 5860533127
first: 40
entries: 128
scheme: GPT
Providers:
1. Name: ada2p1
   Mediasize: 2147483648 (2.0G)
   Sectorsize: 512
   Stripesize: 4096
   Stripeoffset: 0
   Mode: r1w1e1
   efimedia: HD(1,GPT,9e1ebf5f-23a0-11e8-8570-6045cba529aa,0x80,0x400000)
   rawuuid: 9e1ebf5f-23a0-11e8-8570-6045cba529aa
   rawtype: 516e7cb5-6ecf-11d6-8ff8-00022d09712b
   label: (null)
   length: 2147483648
   offset: 65536
   type: freebsd-swap
   index: 1
   end: 4194431
   start: 128
2. Name: ada2p2
   Mediasize: 2998445408256 (2.7T)
   Sectorsize: 512
   Stripesize: 4096
   Stripeoffset: 0
   Mode: r1w1e2
   efimedia: HD(2,GPT,9e35641b-23a0-11e8-8570-6045cba529aa,0x400080,0x15d10a300)
   rawuuid: 9e35641b-23a0-11e8-8570-6045cba529aa
   rawtype: 516e7cba-6ecf-11d6-8ff8-00022d09712b
   label: (null)
   length: 2998445408256
   offset: 2147549184
   type: freebsd-zfs
   index: 2
   end: 5860533119
   start: 4194432
Consumers:
1. Name: ada2
   Mediasize: 3000592982016 (2.7T)
   Sectorsize: 512
   Stripesize: 4096
   Stripeoffset: 0
   Mode: r2w2e5
- ada2 の“type: freebsd-zfs”の“ rawuuid”が今回知りたい GPT ディスクラベルになる。ここでは“2. Name: ada2p2”の“rawuuid: 9e35641b-23a0-11e8-8570-6045cba529aa”、すなわち 
zpool status の出力結果の“raidz1-0”の“gptid/9e35641b-23a0-11e8-8570-6045cba529aa”が ada2 の GPT ディスクラベルだということになる。 
S.M.A.R.T. のエラーを確認する
# smartctl -a /dev/ada2
     :
=== START OF INFORMATION SECTION ===
Model Family:     Western Digital Blue
Device Model:     WDC WD30EZRZ-22Z5HB0
Serial Number:    WD-WCC4N7AZUD05
     :
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       13
198 Offline_Uncorrectable   0x0030   200   200   000    Old_age   Offline      -       0
     :
- この例では、0 でなければならない 197 の値が 13 になっている。
 
GPT パーティションを確認する
③ 故障している HDD をオフラインにする
④ TrueNAS をシャットダウンする
# shutdown -p now
⑤ 故障した HDD を新しい HDD に換装する
- 新しい HDD を別の OS で使用したことがある場合はパーティション情報が書き込まれてしまっていたりするので、TrueNAS  でうまく扱えない可能性がある。新品ではない HDD と交換する場合は、全セクタのデータの消去を実行しておくことを推奨する。
 - HDD を換装したら TrueNAS を起動する。
 
⑥ 新しいディスクに GPT パーティションを作成する
GPT パーティション情報の確認
GPT パーティションの作成
- 交換後の ada2 の GPT バーティションを確認する。GPT パーティションを作成していないので、まだ何もないはず。
# gpart show ada2
gpart: No such geom: ada2.
 - 交換した新しい HDD に GPT パーティションを作成する。
# gpart create -s gpt ada2
ada2 created
# gpart add -i 1 -t freebsd-swap -b 128 -s 4194304 ada2
ada2p1 added
# gpart add -i 2 -t freebsd-zfs -b 4194432 -s 5856338688 ada2
ada2p2 added
# gpart show ada2
=>        40  5860533088  ada6  GPT  (2.7T)
        40          88        - free -  (44K)
       128     4194304     1  freebsd-swap  (2.0G)
   4194432  5856338688     2  freebsd-zfs  (2.7T)
5860533120           8        - free -  (4.0K)
 -i オプションに指定する値はパーティション番号、 -t オプションに指定する値はパーティションのタイプ、 -b オプションに指定する値はパーティションの開始セクタ、-s オプションに指定する値は確保したいセクタ数になる。これらの値は事前に調査した GPT パーティション情報をそのまま使う。
HDD の容量を増やしたい場合
- 今回は同一の容量である 3TB HDD に交換したが、このタイミングで 3TB から 4TB HDD に切り替えたい場合は、“freebsd-zfs”のタイプの GPT パーティションを作る時に 
gpart add -i 2 -t freebsd-zfs ada2 と指定する。そうすると、残りの空き容量の全てが“freebsd-zfs”になる。 - 今回は 8台の HDD で RAID を構成しているので、8台全ての HDD が 3TB から 4TB に交換されないと NAS の容量は拡張されない。
 
⑦ 新しい HDD へのリプレース
交換した HDD の GPT ディスクラベルの確認
- まずは交換した ada2 の“freebsd-zfs”の“rawuuid”を確認する。
 
# gpart list
     :
2. Name: ada2p2
   Mediasize: 2998445408256 (2.7T)
   Sectorsize: 512
   Stripesize: 4096
   Stripeoffset: 0
   Mode: r0w0e0
   efimedia: HD(2,GPT,bd29763e-3181-11eb-9359-6045cba529aa,0x400080,0x15d10a300)
   rawuuid: bd29763e-3181-11eb-9359-6045cba529aa
   rawtype: 516e7cba-6ecf-11d6-8ff8-00022d09712b
   label: (null)
   length: 2998445408256
   offset: 2147549184
   type: freebsd-zfs
   index: 2
   end: 5860533119
   start: 4194432
     :
- 以上の出力から、新しい ada2 の GPT ディスクラベルは“bd29763e-3181-11eb-9359-6045cba529aa”であることがわかる。
 
zpool status の確認
zpool status を確認する。ステータスが DEGRADED となっていることがわかる。- ちなみに、本システムは HDD 8台の raidz1 の2系統 mirror 構成なので、個々の mirror のストレージがそれぞれ1台ずつ、すなわち1×2=2台が同時に死んでもファイルシステムは DEGRADED 状態のまま普通に利用できる。
 - 試したことはないが、mirror の片側の HDD 4台が全滅し、もう片方の mirror の HDD が更に1台故障しても、この NAS は問題なく動き続けるかもしれない。
 
# zpool status
  pool: freenas-boot
 state: ONLINE
  scan: scrub repaired 0B in 00:17:34 with 0 errors on Tue Nov 24 04:02:34 2020
config:
    NAME          STATE     READ WRITE CKSUM
    freenas-boot  ONLINE       0     0     0
      da0p2       ONLINE       0     0     0
errors: No known data errors
  pool: tank
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
    Sufficient replicas exist for the pool to continue functioning in a
    degraded state.
action: Online the device using 'zpool online' or replace the device with
    'zpool replace'.
  scan: resilvered 1.54T in 05:25:18 with 0 errors on Tue Nov 24 09:06:10 2020
config:
    NAME                                            STATE     READ WRITE CKSUM
    tank                                            DEGRADED     0     0     0
      raidz1-0                                      DEGRADED     0     0     0
        gptid/fb4719b4-7b72-11e8-b5ba-6045cba529aa  ONLINE       0     0     0
        gptid/9d5dcf29-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
        gptid/9e35641b-23a0-11e8-8570-6045cba529aa  OFFLINE      0     0     0
        gptid/9f1248e1-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
      raidz1-1                                      ONLINE       0     0     0
        gptid/41101340-7b89-11e8-9aa5-6045cba529aa  ONLINE       0     0     0
        gptid/a142856a-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
        gptid/e6523a43-2151-11eb-b673-6045cba529aa  ONLINE       0     0     0
        gptid/9d8b4877-2d3c-11eb-9995-6045cba529aa  ONLINE       0     0     0
errors: No known data errors
“was /dev/gptid/GPTディスクラベル”と表示されている場合は…
# zpool status
  pool: freenas-boot
 state: ONLINE
  scan: scrub repaired 0 in 0 days 00:22:04 with 0 errors on Tue Nov  3 04:07:04 2020
config:
    NAME        STATE     READ WRITE CKSUM
    freenas-boot  ONLINE       0     0     0
      da0p2     ONLINE       0     0     0
errors: No known data errors
  pool: tank
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
    Sufficient replicas exist for the pool to continue functioning in a
    degraded state.
action: Online the device using 'zpool online' or replace the device with
    'zpool replace'.
  scan: scrub repaired 1012K in 0 days 07:41:57 with 0 errors on Sun Nov  1 07:42:00 2020
config:
    NAME                                            STATE     READ WRITE CKSUM
    tank                                            DEGRADED     0     0     0
      raidz1-0                                      ONLINE       0     0     0
        gptid/fb4719b4-7b72-11e8-b5ba-6045cba529aa  ONLINE       0     0     0
        gptid/9d5dcf29-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
        gptid/9e35641b-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
        gptid/9f1248e1-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
      raidz1-1                                      DEGRADED     0     0     0
        gptid/41101340-7b89-11e8-9aa5-6045cba529aa  ONLINE       0     0     0
        gptid/a142856a-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
        10902394484659602262                        OFFLINE      0     0     0  was /dev/gptid/a21d029e-23a0-11e8-8570-6045cba529aa
        gptid/a3056122-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
errors: No known data errors
⑧ リプレースの進行状況の確認
# zpool status
  pool: freenas-boot
 state: ONLINE
  scan: scrub repaired 0B in 00:17:34 with 0 errors on Tue Nov 24 04:02:34 2020
config:
    NAME          STATE     READ WRITE CKSUM
    freenas-boot  ONLINE       0     0     0
      da0p2       ONLINE       0     0     0
errors: No known data errors
  pool: tank
 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 Sat Nov 28 23:08:37 2020
    3.97T scanned at 22.7G/s, 1.92T issued at 11.0G/s, 13.7T total
    394M resilvered, 13.96% done, 00:18:23 to go
config:
    NAME                                              STATE     READ WRITE CKSUM
    tank                                              DEGRADED     0     0     0
      raidz1-0                                        DEGRADED     0     0     0
        gptid/fb4719b4-7b72-11e8-b5ba-6045cba529aa    ONLINE       0     0     0
        gptid/9d5dcf29-23a0-11e8-8570-6045cba529aa    ONLINE       0     0     0
        replacing-2                                   DEGRADED     0     0     0
          gptid/9e35641b-23a0-11e8-8570-6045cba529aa  OFFLINE      0     0     0
          gptid/bd29763e-3181-11eb-9359-6045cba529aa  ONLINE       0     0     0  (resilvering)
        gptid/9f1248e1-23a0-11e8-8570-6045cba529aa    ONLINE       0     0     0
      raidz1-1                                        ONLINE       0     0     0
        gptid/41101340-7b89-11e8-9aa5-6045cba529aa    ONLINE       0     0     0
        gptid/a142856a-23a0-11e8-8570-6045cba529aa    ONLINE       0     0     0
        gptid/e6523a43-2151-11eb-b673-6045cba529aa    ONLINE       0     0     0
        gptid/9d8b4877-2d3c-11eb-9995-6045cba529aa    ONLINE       0     0     0
errors: No known data errors
- 現在 13.96% done で、完了までに 00:18:23 to go と表示されている。
⇒ 実際は、5時間21分27秒かかった。 - ちなみに、リプレース中もファイルシステムは普通に利用できる。
 
⑨ リプレース完了の確認
zpool status を実行する。DEGRADED の表示がなければ、リプレースは完了している。
# zpool status
  pool: freenas-boot
 state: ONLINE
  scan: scrub repaired 0B in 00:17:34 with 0 errors on Tue Nov 24 04:02:34 2020
config:
    NAME          STATE     READ WRITE CKSUM
    freenas-boot  ONLINE       0     0     0
      da0p2       ONLINE       0     0     0
errors: No known data errors
  pool: tank
 state: ONLINE
  scan: resilvered 1.83T in 06:12:50 with 0 errors on Sun Nov 29 05:21:27 2020
config:
    NAME                                            STATE     READ WRITE CKSUM
    tank                                            ONLINE       0     0     0
      raidz1-0                                      ONLINE       0     0     0
        gptid/fb4719b4-7b72-11e8-b5ba-6045cba529aa  ONLINE       0     0     0
        gptid/9d5dcf29-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
        gptid/bd29763e-3181-11eb-9359-6045cba529aa  ONLINE       0     0     0
        gptid/9f1248e1-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
      raidz1-1                                      ONLINE       0     0     0
        gptid/41101340-7b89-11e8-9aa5-6045cba529aa  ONLINE       0     0     0
        gptid/a142856a-23a0-11e8-8570-6045cba529aa  ONLINE       0     0     0
        gptid/e6523a43-2151-11eb-b673-6045cba529aa  ONLINE       0     0     0
        gptid/9d8b4877-2d3c-11eb-9995-6045cba529aa  ONLINE       0     0     0
errors: No known data errors
# zpool list
NAME           SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
freenas-boot  28.8G  18.8G  9.94G        -         -    24%    65%  1.00x    ONLINE  -
tank          21.8T  13.7T  8.02T        -         -     2%    63%  1.00x    ONLINE  /mnt