まとめると…
- 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)
さてここからが本番。 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にどんだけデータ置けるんだよっていう話だわな。