まとめると…
- 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
で、
という感じで作ってある(実際の名前は何か知らんけど再起動のときに変わった)。ところが、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枚あるので全部リプレースする。最終的には
といった感じにしたい。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)
さてここからが本番。 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にどんだけデータ置けるんだよっていう話だわな。