FreeBSDサーバーのディスクを壊れてないけど交換...と思ったら別のところが壊れた

こういうことです

A post shared by Kota UENISHI (@kuenishi) on

まとめると…

  • 2TBx4 の構成だったけど年末セールで安いゾってので 4TBx4 に換装するかーと思ってハードディスクを手配
  • 一枚ずつ zpool replace していく作戦
  • メーカーによって replace の性能が全然違う
  • そうこうしているうちに zroot に使っていたSSDがREAD_ERRORを吐きはじめてピンチ
  • そっちを対処
  • なんとか時間をかけて 4TB x4 にアップグレード


これまでの構成は

  • ada0 - SSD 128TB
  • ada1 - SG 3TB ada1 as 予備
  • ada2 - WD 2TB diskid/DISK-WD-WMC4M0F82E9F
  • ada3 - WD 2TB diskid/DISK-WD-WMC4M0E8R6PS
  • ada4 - TSB 2TB diskid/DISK-25RE667AS
  • ada5 - TSB 2TB diskid/DISK-25RE65JAS

で、

# zpool create data mirror ada2 ada3 mirror ada4 ada5 

という感じで作ってある(実際の名前は何か知らんけど再起動のときに変わった)。ところが、2017年の写真をアーカイブして保存して、いろいろやっていたら残り容量が330GBほどになってしまって、あと2年以内に一杯になることがわかった。

%> df -h | grep data
data                  918G    587G    332G    64%    /data
data/user             2.6T    2.3T    332G    88%    /data/user
%> zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
data   3.62T  3.19T   448G         -    30%    87%  1.00x  ONLINE  -
zroot   109G  18.8G  90.2G         -    19%    17%  1.00x  ONLINE  -

やはり空き容量は3〜4割程度に維持しておきたい。ちょうどいいことに、手元にうっかり買ってしまったSeaGateの4TB HDD2枚と、WDの4TB HDDが3枚あるので全部リプレースする。最終的には

# zpool create mirror ada2 (SG) ada3 (WD) mirror ada4 (SG) ada5 (WD)

といった感じにしたい。WDの4TB玉がひとつ余るが、それは予備の遊び場として ada1 あたりにつけておく。

初日 (1/8夜)

リプレース作業開始。まず箱を開けないで、試しに予め ada2 に刺さっている予備の 3TB 玉で gpt/system とかいう変な名前(こういう名前は zpool status で確認しておく)の2TB玉を交換。

%> sudo zpool replace data gpt/system ada1 

これの完了にだいたい1日くらいかかった。これで一日一発という交換ペースが確立。

二日目 (1/9夜)

前日のresilveringが完了していることを完了して、箱をあけて gpt/system とかいうふざけた名前(今はどこにもマウントされないはず)の ada2 を SeaGate の 4TB 玉に換装。マザーボードのどのSATAポートがどの玉に繋がっているのか、KKDで当てるのが醍醐味。無事に交換できたら、 まずは試しに

%> sudo zpool create tank ada2
%> ls /tank
%> sudo zpool destroy tank

などとやってちゃんと使えること ( /tank にマウントされていること ) を確認する。確認できたら壊す。壊したら

%> sudo zpool replace data diskid/DISK-WD-WMC4M0E8R6PSp1 ada2

で交換。 zpool status の結果は

  pool: data
 state: ONLINE
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 Tue Jan  9 22:29:28 2018
        28.8G scanned out of 3.19T at 168M/s, 5h29m to go
        14.2G resilvered, 0.88% done
config:

        NAME                                 STATE     READ WRITE CKSUM
        data                                 ONLINE       0     0     0
          mirror-0                           ONLINE       0     0     0
            diskid/DISK-25RE667ASp1          ONLINE       0     0     0
            diskid/DISK-25RE65JASp1          ONLINE       0     0     0
          mirror-1                           ONLINE       0     0     0
            ada1                             ONLINE       0     0     0
            replacing-1                      ONLINE       0     0     0
              diskid/DISK-WD-WMC4M0E8R6PSp1  ONLINE       0     0     0
              ada2                           ONLINE       0     0     0  (resilvering)

となり、ディスク交換が始まったことがわかる。

三日目朝 (1/10)

さてさて終わってるかな、と思ってサーバー覗きにいったらそもそもつながらない。再起動してもダメ。あわてて押入れからディスプレイ出してさしてみるも正常稼働していたので、インターネットつながらないしこりゃルーターがダメなんかなと思って再起動したらつながってホッとした。慌てている状況でも冷静に切り分けすることが重要です。そろそろフレッツのルーターも換え時っぽい…

さて replace の進捗はどうかなと思って見にいったら予想に反して全然進んでいない。zpoolでresilveringの様子をみても 15M/s くらいか出ていなくて、このままだと35時間くらいかかるとかいう。はて…( ゚д゚)ハッ!この新しいディスクはあのメーカーのやつだ!ということで確信めいた状態で smartctl する。smartctlの結果そのものは正直分からないし、ベンダーにとって意味があるんだろうけど、かかった時間が非常に示唆的でありまして…

%> for n in `seq 0 5`; do time sudo smartctl -a /dev/ada$n > ada$n.txt; done
sudo smartctl -a /dev/ada$n > ada$n.txt  0.02s user 0.02s system 87% cpu 0.047 total
sudo smartctl -a /dev/ada$n > ada$n.txt  0.03s user 0.02s system 23% cpu 0.192 total
sudo smartctl -a /dev/ada$n > ada$n.txt  0.03s user 0.01s system 0% cpu 5.412 total
sudo smartctl -a /dev/ada$n > ada$n.txt  0.03s user 0.01s system 40% cpu 0.090 total
sudo smartctl -a /dev/ada$n > ada$n.txt  0.03s user 0.01s system 3% cpu 1.269 total
sudo smartctl -a /dev/ada$n > ada$n.txt  0.02s user 0.02s system 3% cpu 1.277 total

というわけで、 ada2 の再交換決定。昨夜 iostat 流したらどうもスループットがでてなくて怪しいなと思っていたんだが、道理でダメなわけだ。とりあえず、 ada2 をreplaceから外す。

%> sudo zpool detach data ada2

これだけでmirror-1のreplaceのタスクがキャンセルされたらしく、無事に前の状態にもどってscrub (resilvering) が再開されたようだった。"zfs disk failure during replace" とかで検索しても何もみつからなくて不安だったけど、ドキュメントから類推したらバッチリだった。また筐をあけて玉を交換して、試してみる。

%> for n in `seq 0 5`; do time sudo smartctl -a /dev/ada$n > /dev/null ; done
sudo smartctl -a /dev/ada$n > /dev/null  0.03s user 0.01s system 91% cpu 0.042 total
sudo smartctl -a /dev/ada$n > /dev/null  0.03s user 0.01s system 12% cpu 0.344 total
sudo smartctl -a /dev/ada$n > /dev/null  0.04s user 0.00s system 14% cpu 0.332 total
sudo smartctl -a /dev/ada$n > /dev/null  0.03s user 0.01s system 26% cpu 0.163 total
sudo smartctl -a /dev/ada$n > /dev/null  0.04s user 0.00s system 3% cpu 1.393 total
sudo smartctl -a /dev/ada$n > /dev/null  0.02s user 0.02s system 2% cpu 1.509 total

これなら大丈夫でしょう、ということで再度同じものを replace する。

%> sudo zpool replace data diskid/DISK-WD-WMC4M0E8R6PSp1 ada2

流れているかウォッチ。

%> iostat  -n 6 1                                                            
       tty            ada0             ada1             ada2             ada3             ada4             ada5             cpu
 tin  tout  KB/t tps  MB/s   KB/t tps  MB/s   KB/t tps  MB/s   KB/t tps  MB/s   KB/t tps  MB/s   KB/t tps  MB/s  us ni sy in id
   1   290 17.14   4  0.06  111.99 171 18.72  120.54 590 69.49  118.04 442 50.95   7.82  28  0.21   7.91  28  0.21   0  0  3  0 97
   0   848  0.00   0  0.00  48.00  28  1.30  101.37 130 12.89  102.61 117 11.76  12.41  29  0.35  13.54  26  0.34   0  0  1  0 99
   0   513  0.00   0  0.00  123.09 101 12.12  122.53 339 40.60  122.81 239 28.61   4.00   2  0.01   4.00   1  0.00   0  0  1  0 99
   0   302  0.00   0  0.00  125.15  88 10.72  118.76 351 40.67  117.56 261 29.97   4.00   5  0.02   4.00   6  0.02   0  0  2  0 98
   0   300  0.00   0  0.00  125.43 145 17.76  122.88 433 51.97  122.43 286 34.20   4.00  12  0.05   4.00   9  0.04   0  0  2  0 98
   0   298  0.00   0  0.00  125.42 143 17.49  124.64 476 57.96  123.96 334 40.47   4.00   4  0.02   4.00   5  0.02   0  0  2  0 98
^C
%> zpool status data
   pool: data
 state: ONLINE
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 Wed Jan 10 08:05:23 2018
        150G scanned out of 3.19T at 150M/s, 5h53m to go
        74.7G resilvered, 4.59% done
(snip)

よさそう。とりあえず件の玉は購入したドスパラに交換を要請した。

三日目夜

無事に replace は完了していた。

%> zpool status data
  pool: data
 state: ONLINE
  scan: resilvered 1.60T in 5h3m with 0 errors on Wed Jan 10 13:08:41 2018
config:

        NAME                         STATE     READ WRITE CKSUM
        data                         ONLINE       0     0     0
          mirror-0                   ONLINE       0     0     0
            diskid/DISK-25RE667ASp1  ONLINE       0     0     0
            diskid/DISK-25RE65JASp1  ONLINE       0     0     0
          mirror-1                   ONLINE       0     0     0
            ada1                     ONLINE       0     0     0
            ada2                     ONLINE       0     0     0

errors: No known data errors
%> zpool list              
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
data   4.53T  3.19T  1.34T         -    23%    70%  1.00x  ONLINE  -
zroot   109G  18.8G  90.2G         -    19%    17%  1.00x  ONLINE  -

サイズも4.5TBになって無事 autoexpand が働いていることがわかる。ZFS素晴らしい

ここで、いま宙ぶらりんになっている 2TB 玉を外して、 4TB 玉(SG)に入れ替える。

%> dmesg | grep ada3 
...
ada3 at ahcich3 bus 0 scbus3 target 0 lun 0
ada3: <ST4000DM004-2CV104 0001> ACS-3 ATA SATA 3.x device
ada3: Serial Number ZFN0FBG6
ada3: 600.000MB/s transfers (SATA 3.x, UDMA6, PIO 8192bytes)
ada3: Command Queueing enabled
ada3: 3815447MB (7814037168 512 byte sectors)
ada3: quirks=0x1<4K>
...
%> sudo zpool create tank ada3

で、 /tank が作成される。昨日のこともあるのでスループットをみながら、ちょっと小一時間ほどファイルを書いてみることにする。
1時間ほどcpを回して全然スループットが落ちなかったので replace 開始。

%> sudo zpool replace data ada1 ada3
%> zpool status data
  pool: data
 state: ONLINE
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 Wed Jan 10 21:59:14 2018
        498M scanned out of 3.19T at 33.2M/s, 27h56m to go
        234M resilvered, 0.01% done
config:

        NAME                         STATE     READ WRITE CKSUM
        data                         ONLINE       0     0     0
          mirror-0                   ONLINE       0     0     0
            diskid/DISK-25RE667ASp1  ONLINE       0     0     0
            diskid/DISK-25RE65JASp1  ONLINE       0     0     0
          mirror-1                   ONLINE       0     0     0
            replacing-0              ONLINE       0     0     0
              ada1                   ONLINE       0     0     0
              ada3                   ONLINE       0     0     0  (resilvering)
            ada2                     ONLINE       0     0     0

errors: No known data errors

無事始まった。ひと晩で終わるはず。

... 小一時間でスループット下がってしまった。

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 Wed Jan 10 21:59:14 2018
        95.7G scanned out of 3.19T at 36.5M/s, 24h42m to go
        48.1G resilvered, 2.93% done

これはハードウェアの故障じゃない感じがする。ぃゃそれともまさかのダブル故障?!
と思って、昨日諦めた方のディスクをLinuxマシンに差して500GBほど書いてみたんだけどおかしなこともない。
FreeBSD側も頑張ってもういちどreplace してみる。

%> sudo zpool replace data ada1 ada3
%> zpool status data
 ...
          29.5G scanned out of 3.19T at 96.5M/s, 9h32m to go
 ...

帰宅、夕食後にチェックしたら無事replaceが終わっていた。OK。そのまま今度は ada1 を交換する。これで ada1 もWDの 4TB HDD になった。

四日目

…さて、と思ったが、どうも様子がおかしい。 pkg update などが度々コケるのである。どうもおかしいと思って dmesg してみると ada0 が今度はおかしい。当時のログをみてみると

Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): CAM status: ATA Status Error
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): ATA status: 41 (DRDY ERR), error: 40 (UNC )
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): RES: 41 40 e8 39 1b 40 01 00 00 08 00
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): Retrying command
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): READ_FPDMA_QUEUED. ACB: 60 08 e2 39 1b 40 01 00 00 00 00 00
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): CAM status: ATA Status Error
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): ATA status: 41 (DRDY ERR), error: 40 (UNC )
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): RES: 41 40 e8 39 1b 40 01 00 00 08 00
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): Retrying command
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): READ_FPDMA_QUEUED. ACB: 60 08 e2 39 1b 40 01 00 00 00 00 00
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): CAM status: ATA Status Error
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): ATA status: 41 (DRDY ERR), error: 40 (UNC )
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): RES: 41 40 e8 39 1b 40 01 00 00 08 00
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): Retrying command
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): READ_FPDMA_QUEUED. ACB: 60 08 e2 39 1b 40 01 00 00 00 00 00
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): CAM status: ATA Status Error
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): ATA status: 41 (DRDY ERR), error: 40 (UNC )
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): RES: 41 40 e8 39 1b 40 01 00 00 08 00
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): Retrying command
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): READ_FPDMA_QUEUED. ACB: 60 08 e2 39 1b 40 01 00 00 00 00 00
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): CAM status: ATA Status Error
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): ATA status: 41 (DRDY ERR), error: 40 (UNC )
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): RES: 41 40 e8 39 1b 40 01 00 00 08 00
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): Error 5, Retries exhausted

といった具合にファイルを読めていない。このままではそもそもOSが危ういと判断して急遽SSDを追加発注。全ての作業をストップさせる。それで、遊んでいる ada1 を急遽ブートディスクに仕立てて、いつでもブートできるようにしておく。

%> sudo gpart add -i 1 -t freebsd-boot -s 1024 ada1                                                                                                                       
ada1p1 added   
%> sudo gpart add -i 2 -t freebsd-swap -s 4194304 ada1
ada1p2 added
kuenishi@kushana:~
%> sudo gpart add -i 3 -t freebsd-zfs ada1
ada1p3 added

=>        40  7814037088  ada1  GPT  (3.6T)
          40        1024     1  freebsd-boot  (512K)
        1064     4194304     2  freebsd-swap  (2.0G)
     4195368  7809841752     3  freebsd-zfs  (3.6T)
  7814037120           8        - free -  (4.0K)
%> sudo zpool attach zroot  diskid/DISK-150315401930p3 ada1p3
Make sure to wait until resilver is done before rebooting.

If you boot from pool 'zroot', you may need to update
boot code on newly attached disk 'ada1p3'.

Assuming you use GPT partitioning and 'da0' is your new boot disk
you may use the following command:

        gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0

%> sudo gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
partcode written to ada1p1
bootcode written to ada1

これで本当に出来たのかどうか知らないが、とりあえず ada1 からブートできるようになったはずだ。いつ ada0 (最初から刺さっていたSSD)が壊れても問題ないはず。

day 5 (1/12)

SSDが届いて、妻に受け取ってもらった。土曜日に作業をする。

day 6 (1/13)

子供達を放置して鯖管作業です

A post shared by Kota UENISHI (@kuenishi) on

さてここからが本番。 resilvering が完了していることを確認して、電源を落としてSSDを交換する。それで起動すると

%> zpool status zroot
  pool: zroot
 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 Jan 13 10:51:50 2018
        5.30G scanned out of 18.8G at 1/s, (scan is slow, no estimated time)
        59.1M resilvered, 28.25% done
config:

        NAME                               STATE     READ WRITE CKSUM
        zroot                              DEGRADED     2     0     0
          mirror-0                         DEGRADED     4     0     0
            5134801585683106761            UNAVAIL      0     0     0  was /dev/diskid/DISK-150315401930p3
            diskid/DISK-WD-WCC7K5CCC1X0p3  ONLINE       0     0     4  (resilvering)

となっており、diskid/DISK-150315401930p3 が取り除かれていることがわかる。かわりに ada0 には新しく 240GB のSSDが刺さっているので、これも同様にブートディスク用にセットアップする。

%> sudo gpart create -s GPT ada0                                                      
Password:
ada0 created
%> sudo gpart add -i 1 -t freebsd-boot -s 1024 ada0 
ada0p1 added
kuenishi@kushana:~
%> sudo gpart add -i 2 -t freebsd-swap -s 4194304 ada0 
ada0p2 added
kuenishi@kushana:~
%> sudo gpart add -i 3 -t freebsd-zfs ada0            
ada0p3 added

セットアップができたらさっそく zroot に追加する。起動できるように bootcode も書き込んでおく。

%> sudo zpool attach zroot diskid/DISK-WD-WCC7K5CCC1X0p3 ada0p3
Make sure to wait until resilver is done before rebooting.

If you boot from pool 'zroot', you may need to update
boot code on newly attached disk 'ada0p3'.

Assuming you use GPT partitioning and 'da0' is your new boot disk
you may use the following command:

        gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0

%> sudo gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0                    
partcode written to ada0p1
bootcode written to ada0

もうそもそも存在しないやつなので、古いやつを外そうとすると叱られる。こいつを外すのに結構苦戦した。

%> sudo zpool detach  zroot  5134801585683106761 
cannot detach 5134801585683106761: no valid replicas
kuenishi@kushana:~
%> sudo zpool detach  zroot /dev/diskid/DISK-150315401930p3
cannot detach /dev/diskid/DISK-150315401930p3: no valid replicas

zpool status で様子をみると

  pool: zroot
 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 Jan 13 10:59:30 2018
        8.28G scanned out of 18.8G at 49.9M/s, 0h3m to go
        8.46G resilvered, 44.15% done
config:

        NAME                               STATE     READ WRITE CKSUM
        zroot                              DEGRADED    34     0     0
          mirror-0                         DEGRADED    68     0     0
            5134801585683106761            UNAVAIL      0     0     0  was /dev/diskid/DISK-150315401930p3
            diskid/DISK-WD-WCC7K5CCC1X0p3  ONLINE       0     0    68  (resilvering)
            ada0p3                         ONLINE       0     0    16  (resilvering)

errors: 40 data errors, use '-v' for a list

となっていて、40ほど壊れたファイルがあるのでまず '-v' をつけて確認して、それを何とかしろといわれる。 -v して出て来るファイルはほとんどが pkg で入るやつで、基本的には無害なので全部 rm で消していく。ファイルを直接消すと引っかかって固まるので、ディレクトリごと消すか、上書きをする。

%> sudo echo "" > /path/to/broken/file

などとやっていくと、

  pool: zroot
 state: DEGRADED
status: One or more devices has experienced an error resulting in data
        corruption.  Applications may be affected.
action: Restore the file in question if possible.  Otherwise restore the
        entire pool from backup.
   see: http://illumos.org/msg/ZFS-8000-8A
  scan: scrub in progress since Sat Jan 13 12:48:39 2018
        3.98G scanned out of 15.3G at 41.2M/s, 0h4m to go
        0 repaired, 25.94% done
config:

        NAME                               STATE     READ WRITE CKSUM
        zroot                              DEGRADED     4     0     0
          mirror-0                         DEGRADED     8     0     0
            5134801585683106761            UNAVAIL      0     0     0  was /dev/diskid/DISK-150315401930p3
            diskid/DISK-WD-WCC7K5CCC1X0p3  ONLINE       0     0     8
            ada0p3                         ONLINE       0     0     8

errors: Permanent errors have been detected in the following files:

        zroot/ROOT/default:<0xb6c01>
        zroot/ROOT/default:<0x6309>
        zroot/ROOT/default:<0x14263>

という風に減っていく。 resilvering が終わってしまっている場合はファイルを消してもういちど "zpool scrub zroot" だ。ちなみにこのとき用事されている
ZFS-8000-8A のURLを見に行くと「プールを再作成する他生き残る道はない」みたいなことが書かれているが、ファイルを諦めるなり自分で作り直せるはずなので特に気にしなくてよい。システムがダメな場合はSSDが壊れた時点でOSが起動しないはずだから。 "zpool status zroot" して

%> sudo zpool status -v zroot   
Password:
  pool: zroot
 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 0h3m with 0 errors on Sat Jan 13 12:52:35 2018
config:

        NAME                               STATE     READ WRITE CKSUM
        zroot                              DEGRADED     4     0     0
          mirror-0                         DEGRADED     8     0     0
            5134801585683106761            UNAVAIL      0     0     0  was /dev/diskid/DISK-150315401930p3
            diskid/DISK-WD-WCC7K5CCC1X0p3  ONLINE       0     0     8
            ada0p3                         ONLINE       0     0     8

errors: No known data errors

となるまでこれを繰り返す。ここまできたらやっともとのSSDを消すことができる。

%> sudo zpool detach zroot /dev/diskid/DISK-150315401930p3
%> sudo zpool status  zroot
  pool: zroot
 state: ONLINE
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 0 in 0h3m with 0 errors on Sat Jan 13 12:52:35 2018
config:

        NAME                               STATE     READ WRITE CKSUM
        zroot                              ONLINE       4     0     0
          mirror-0                         ONLINE       8     0     0
            diskid/DISK-WD-WCC7K5CCC1X0p3  ONLINE       0     0     8
            ada0p3                         ONLINE       0     0     8

errors: No known data errors

ここまできたら、一時的に使ったHDDも不要なので detach して、新しく追加したSSDだけで起動できるように bootcode をかきなおす。

%> sudo gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0                    
partcode written to ada0p1
bootcode written to ada0

%> sudo zpool detach zroot diskid/DISK-WD-WCC7K5CCC1X0p3          
%> zpool status zroot

  pool: zroot
 state: ONLINE
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 0 in 0h3m with 0 errors on Sat Jan 13 12:52:35 2018
config:

        NAME        STATE     READ WRITE CKSUM
        zroot       ONLINE       4     0     0
          ada0p3    ONLINE       0     0     8

errors: No known data errors

ここで一旦再起動してみて、ちゃんと上がってくることを確認する。いちばんハラハラした瞬間だ。ディスプレイなしで再起動したら上がってこないんだけど、なぜかディスプレイをつなぐと必ず上がってくるという事件に遭遇した。原因は分からないが、上がってきたからよしとするか…。

さてもとのHDD交換作業に戻る。 ada1 にブート用のパーティションを作っているので、まずはそれを作り直す。

%> sudo gpart delete -i 3 ada1
ada1p3 deleted
kuenishi@kushana:~
%> sudo gpart delete -i 2 ada1
ada1p2 deleted
kuenishi@kushana:~
%> sudo gpart delete -i 1 ada1
ada1p1 deleted
kuenishi@kushana:~
%> sudo gpart show ada1       
=>        40  7814037088  ada1  GPT  (3.6T)
          40  7814037088        - free -  (3.6T)

kuenishi@kushana:~
%> sudo gpart add -i 1 
kuenishi@kushana:~
%> sudo gpart add -i 1 -t freebsd-zfs ada1                       
ada1p1 added
kuenishi@kushana:~
%> sudo gpart show ada1                   
=>        40  7814037088  ada1  GPT  (3.6T)
          40  7814037080     1  freebsd-zfs  (3.6T)
  7814037120           8        - free -  (4.0K)

で、これを mirror-0 の 2TB 玉と交換する

%> sudo zpool replace data diskid/DISK-25RE667ASp1 ada1p1


夕食やらなんやらを済ませてジムから帰ってきたら ada1 が無事に入っていた。

%> zpool status data

  pool: data
 state: ONLINE
  scan: resilvered 1.41T in 4h9m with 0 errors on Sat Jan 13 17:13:33 2018
config:

        NAME                         STATE     READ WRITE CKSUM
        data                         ONLINE       0     0     0
          mirror-0                   ONLINE       0     0     0
            ada1p1                   ONLINE       0     0     0
            diskid/DISK-25RE65JASp1  ONLINE       0     0     0
          mirror-1                   ONLINE       0     0     0
            ada3                     ONLINE       0     0     0
            ada2                     ONLINE       0     0     0

errors: No known data errors

で、こんどは電源を落として、まだ筐体に残っている diskid/DISK-25RE667ASp1 を別の4TB 玉に交換する。

%> sudo gpart show ada4                   
=>        40  7814037088  ada4  GPT  (3.6T)
          40  7814037080     1  freebsd-zfs  (3.6T)
  7814037120           8        - free -  (4.0K)

パーティションつくったのでリプレース

%> sudo zpool replace data diskid/DISK-25RE65JASp1 ada4p1
%> zpool status data                                     
  pool: data
 state: ONLINE
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 Jan 13 17:57:08 2018
        22.2M scanned out of 2.86T at 2.47M/s, 337h21m to go
        11.7M resilvered, 0.00% done
config:

        NAME                           STATE     READ WRITE CKSUM
        data                           ONLINE       0     0     0
          mirror-0                     ONLINE       0     0     0
            ada1p1                     ONLINE       0     0     0
            replacing-1                ONLINE       0     0     0
              diskid/DISK-25RE65JASp1  ONLINE       0     0     0
              ada4p1                   ONLINE       0     0     0  (resilvering)
          mirror-1                     ONLINE       0     0     0
            ada3                       ONLINE       0     0     0
            ada2                       ONLINE       0     0     0

夕方には完了していたので、 diskid/DISK-25RE65JASp1 を最後の一玉と交換。

%> zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
data   7.25T  2.86T  4.39T         -    12%    39%  1.00x  ONLINE  -
zroot   221G  15.3G   206G         -     9%     6%  1.00x  ONLINE  -

さてここで気づいたのだが、なんと ada2 と ada3 はGPTを作らずにそのまま attach してしまっていた。このままでは gpart で一切いじれなくなって、 "No such geom." みたいなエラーが事あるごとに出てくるので、それを是正するためにまた作業をする。また、 mirror-0とmirror-1 はどちらのペアも別ベンダーのディスクにするようにこれから作業していく。まず差し替えた ada5 を ada3 と交換する方向で。

%> dmesg | grep ada5
ada5 at ahcich5 bus 0 scbus5 target 0 lun 0
ada5: <ST4000DM004-2CV104 0001> ACS-3 ATA SATA 3.x device
ada5: Serial Number ZFN0FKPR
ada5: 600.000MB/s transfers (SATA 3.x, UDMA6, PIO 8192bytes)
ada5: Command Queueing enabled
ada5: 3815447MB (7814037168 512 byte sectors)
ada5: quirks=0x1<4K>
%> sudo gpart create -s GPT ada5
gpart: geom 'ada5': Operation not permitted

パーティション作ろうと思ったらとりつくしまもない。

%> ls /dev/diskid
DISK-WD-WCC7K5ZPD3D3    DISK-WD-WCC7K5ZPD3D3p1  DISK-ZFN0FBG6           DISK-ZFN0FKPR           DISK-ZFN0FKPRp1

デバイスがあったのでこっちを使う。

%> sudo gpart create -s GPT diskid/DISK-ZFN0FBG6       
diskid/DISK-ZFN0FBG6 created
%> sudo gpart add -i 1 -t freebsd-zfs diskid/DISK-ZFN0FBG6
diskid/DISK-ZFN0FBG6p1 added
%> gpart show diskid/DISK-ZFN0FBG6                        
=>        40  7814037088  diskid/DISK-ZFN0FBG6  GPT  (3.6T)
          40  7814037080                     1  freebsd-zfs  (3.6T)
  7814037120           8                        - free -  (4.0K)
%> sudo zpool replace data ada1p1 diskid/DISK-ZFN0FBG6p1
%> sudo zpool replace data ada3 diskid/DISK-ZFN0FKPRp1 ##こんな操作もやったはず…
%> zpool status data                         
  pool: data
 state: ONLINE
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 Jan 13 22:29:17 2018
        2.45G scanned out of 2.86T at 18.1M/s, 46h1m to go
        2.45G resilvered, 0.08% done
config:

        NAME                               STATE     READ WRITE CKSUM
        data                               ONLINE       0     0     0
          mirror-0                         ONLINE       0     0     0
            replacing-0                    ONLINE       0     0     0
              ada1p1                       ONLINE       0     0     0
              diskid/DISK-ZFN0FBG6p1       ONLINE       0     0     0  (resilvering)
            diskid/DISK-WD-WCC7K5ZPD3D3p1  ONLINE       0     0     0
          mirror-1                         ONLINE       0     0     0
            ada2                           ONLINE       0     0     0
            diskid/DISK-ZFN0FKPRp1         ONLINE       0     0     0  (resilvering)

errors: No known data errors

day 7 (1/14)

じーっと見てるだけでほとんど何もなかった。

day 8 朝 (1/15)

ふたつの resilvering が夜に終わったので、 ada2 を更にリプレースする。

%> sudo zpool replace data ada2 ada1p1
%> zpool status data                  
  pool: data
 state: ONLINE
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 Mon Jan 15 08:42:30 2018
        11.2G scanned out of 2.86T at 197M/s, 4h12m to go
        9.19M resilvered, 0.00% done
config:

        NAME                               STATE     READ WRITE CKSUM
        data                               ONLINE       0     0     0
          mirror-0                         ONLINE       0     0     0
            diskid/DISK-ZFN0FBG6p1         ONLINE       0     0     0
            diskid/DISK-WD-WCC7K5ZPD3D3p1  ONLINE       0     0     0
          mirror-1                         ONLINE       0     0     0
            replacing-0                    ONLINE       0     0     0
              ada2                         ONLINE       0     0     0
              ada1p1                       ONLINE       0     0     0  (resilvering)
            diskid/DISK-ZFN0FKPRp1         ONLINE       0     0     0

errors: No known data errors

day 8 夜 (1/15)

完了してた。

%> zpool status data           
  pool: data
 state: ONLINE
  scan: resilvered 1.45T in 3h50m with 0 errors on Mon Jan 15 12:32:58 2018
config:

        NAME                               STATE     READ WRITE CKSUM
        data                               ONLINE       0     0     0
          mirror-0                         ONLINE       0     0     0
            diskid/DISK-ZFN0FBG6p1         ONLINE       0     0     0
            diskid/DISK-WD-WCC7K5ZPD3D3p1  ONLINE       0     0     0
          mirror-1                         ONLINE       0     0     0
            ada1p1                         ONLINE       0     0     0
            diskid/DISK-ZFN0FKPRp1         ONLINE       0     0     0

errors: No known data errors

なっがい道のりでした。予備のディスクも遊べるようにとっておく。

%> sudo gpart create -s GPT ada2
(中略)
%> sudo zpool create attic ada2p1

できあがり。

%> zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
attic                256K  3.51T    88K  /attic
data                2.86T  4.16T   593G  /data
data/user           2.28T  4.16T  2.28T  /data/user
zroot               15.3G   199G    96K  none
zroot/ROOT          13.1G   199G    96K  none
(snip)
%> zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
attic  3.62T   304K  3.62T         -     0%     0%  1.00x  ONLINE  -
data   7.25T  2.86T  4.39T         -    12%    39%  1.00x  ONLINE  -
zroot   221G  15.3G   206G         -     9%     6%  1.00x  ONLINE  -

番外編 壊れたっぽいHDD

ドスパラに連絡したところ、FreeBSD上で見えた状況だけで交換はしてもらえそう。
しかし問い合わせに書いてしまったので、別のLinux箱に挿してもういちど✔してみる。

翌日丁寧な回答が来て、とりあえず送付して調査してもらえそうな感じだった。非常によい対応でした。
Linuxに挿したらふつうに使えたので、 replace のときだけちょっと遅いらしくそのまま使うことにした。なので壊れてはいなかった。なので、修理は依頼しないことにした。

壊れたのは2年ちょい使ったSSDの方だった。

まとめ

  • ブートディスクになっていた 120GB SSDをOSの再インストールなしに240 GB SSDにリプレースした
  • 2TB x4 + 3TB のHDD構成を 4TB x5 にバックアップサーバーもプール再作成もなしで交換した(ダウンタイムはまあそれなりにあった)
  • ZFSは本当にすごい

まあしかしこんなにHDD買ってストレージサーバー回してたら、いったいGCSにどんだけデータ置けるんだよっていう話だわな。