更换 FreeNAS 中损坏的硬盘

在 2015 年的时候,使用 FreeNAS 配置了一台 NAS 服务器,用于家庭网络内储存数据方便共享。

因为贫穷,所以选择了蓝盘作为数据存储盘,没办法,就是这么屌丝。

那个时候的蓝盘其实就是早期的绿盘,理论上是不适用于 NAS 这种网络存储的,因为它磁头归位时间为 8 秒,长期开机使用很快就会坏掉。

但是伟大的网友们发现了 WDIDLE3 这个工具,可以把磁头归位时间调整为 300 秒(也就是 5 分钟),于是乎就有了下面的故事。

排查问题

某年某月的某一天,NAS 开机用了十几分钟还不能正常提供服务,开关机速度都很慢。

于是乎登录终端,检查一下 FreeNAS 的状态,发现其中一块硬盘挂了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$ zpool status
pool: freenas-boot
state: ONLINE
scan: scrub repaired 0 in 0h9m with 0 errors on Wed Mar 22 03:54:02 2017
config:

NAME STATE READ WRITE CKSUM
freenas-boot ONLINE 0 0 0
gptid/003f3068-e99c-11e4-9c07-0cc47a0742be ONLINE 0 0 0

errors: No known data errors

pool: nas
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: resilvered 1.55M in 0h16m with 0 errors on Fri Jul 3 16:47:13 2020
config:

NAME STATE READ WRITE CKSUM
nas DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
gptid/8bc84eb2-a099-11e5-8fd4-0cc47a0742be ONLINE 0 0 0
gptid/4f6e78a5-a166-11e5-bb78-0cc47a0742be ONLINE 0 0 0
gptid/4c4a9c43-a00e-11e5-bf62-0cc47a0742be ONLINE 0 0 0
gptid/103acf85-a043-11e5-b6db-0cc47a0742be ONLINE 0 0 0
209564843571883103 UNAVAIL 0 0 0 was /dev/gptid/391e53c2-a06f-11e5-8ff9-0cc47a0742be
gptid/18324016-a19e-11e5-82be-0cc47a0742be ONLINE 0 0 0

errors: No known data errors

按状态说明来看是设备无法打开,但好在冗余备份的磁盘数量足够,所以阵列正运行在「降级」状态。

接下来我们看一下已失效(UNAVAIL)的硬盘对应的是哪一个设备符号:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ glabel status
Name Status Components
gptid/4c33da40-a00e-11e5-bf62-0cc47a0742be N/A ada0p1
gptid/4c4a9c43-a00e-11e5-bf62-0cc47a0742be N/A ada0p2
gptid/102588a3-a043-11e5-b6db-0cc47a0742be N/A ada1p1
gptid/103acf85-a043-11e5-b6db-0cc47a0742be N/A ada1p2
gptid/390a21f0-a099-11e5-8fd4-0cc47a0742be N/A ada2p1
gptid/391e53c2-a099-11e5-8fd4-0cc47a0742be N/A ada2p2
gptid/4f56fc6c-a166-11e5-bb78-0cc47a0742be N/A ada3p1
gptid/4f6e78a5-a166-11e5-bb78-0cc47a0742be N/A ada3p2
gptid/181aee26-a19e-11e5-82be-0cc47a0742be N/A ada4p1
gptid/18324016-a19e-11e5-82be-0cc47a0742be N/A ada4p2
gptid/00370b53-e99c-11e4-9c07-0cc47a0742be N/A da0p1
gptid/003f3068-e99c-11e4-9c07-0cc47a0742be N/A da0p2

可以看到对应的磁盘分区为 ada2p2 也就是磁盘 ada2,我们可以查看一下 S.M.A.R.T. 信息,看看有没有什么有价值的信息:

1
$ sudo smartctl -a /dev/ada2

通过检查发现该磁盘的 Seek_Error_Rate 异常的高,而其它磁盘都是 0 错误,基本上可以判定是硬件损坏,软件修复是不可能了。

本想着随便检查检查磁盘就修复了,没想到……

不说了,心疼钱包一秒钟,买硬盘去了…… (╥╯^╰╥)

更换故障硬盘

新硬盘到货,更换之前先确认是哪一块硬盘有问题,通过下面的命令获得硬盘序列号,以方便后续更换:

1
2
$ sudo smartctl -a /dev/ada2 | grep Serial
Serial Number: WD-WCC4E6CV0445

阵列磁盘离线

在换硬盘之前还有一个动作要做,就是把有问题的硬盘做离线(OFFLINE)操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$ sudo zpool offline nas /dev/gptid/391e53c2-a06f-11e5-8ff9-0cc47a0742be
$ zpool status
pool: freenas-boot
state: ONLINE
scan: scrub repaired 0 in 0h9m with 0 errors on Wed Mar 22 03:54:02 2017
config:

NAME STATE READ WRITE CKSUM
freenas-boot ONLINE 0 0 0
gptid/003f3068-e99c-11e4-9c07-0cc47a0742be ONLINE 0 0 0

errors: No known data errors

pool: nas
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.55M in 0h16m with 0 errors on Fri Jul 3 16:47:13 2020
config:

NAME STATE READ WRITE CKSUM
nas DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
gptid/8bc84eb2-a099-11e5-8fd4-0cc47a0742be ONLINE 0 0 0
gptid/4f6e78a5-a166-11e5-bb78-0cc47a0742be ONLINE 0 0 0
gptid/4c4a9c43-a00e-11e5-bf62-0cc47a0742be ONLINE 0 0 0
gptid/103acf85-a043-11e5-b6db-0cc47a0742be ONLINE 0 0 0
209564843571883103 OFFLINE 0 0 0 was /dev/gptid/391e53c2-a06f-11e5-8ff9-0cc47a0742be
gptid/18324016-a19e-11e5-82be-0cc47a0742be ONLINE 0 0 0

errors: No known data errors

更换硬盘

就是这个倒霉货!

不过想想质保只有 2 年的硬盘,使用了 4 年半快 5 年,也算是可以了,毕竟不是服务器硬盘不是。

剩下的工作就跟平常组装电脑一样,拆开机箱,找到坏了的旧硬盘,卸下来,装上新硬盘,接好各种电源线、数据线,完工。

唯一有点烦的就是,线太多,硬盘太多,要拆一个硬盘出来,得拆好几个硬盘。

这个经验教训教育我们,如果可以买快拆,免工具,推拉盒式的硬盘架,还是买吧,不要省钱。

毕竟花钱买个开心,图个方便和省心,相信我……不要跟自己过不去,能花钱解决的问题都不是问题!

问题是:没钱…… 😭

重建磁盘阵列

因为我用的是 FreeNAS 10 Corral 这个倒霉的,官方已经完全不支持的,充话费送的货。

所以网上找到的所有基于 Web UI 界面操作的方式都不可用,只能自己摸索,最后发现要在 FreeNAS 的 Console(控制台)中操作,进行替换。

虽然网上也有说通过 Shell 登录来替换磁盘的,但是替换了以后的磁盘并没有使用 GPTID 的方式标识,这样将来硬盘换位置什么的,很容易导致阵列的失效或者数据丢失。

而在 Console 中操作则没有这种问题,最终也是用 GPTID 方式来标识阵列中的磁盘的。

首先看看磁盘情况(以下操作在 FreeNAS 终端下操作完成):

1
volume nas show_disks

确认我们新的硬盘已经就位,被系统正确识别,且设备号为 ada2,开始重建阵列:

1
volume nas replace gptid/391e53c2-a06f-11e5-8ff9-0cc47a0742be ada2

重新回到 FreeNAS 的命令行 Shell,查看阵列状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
$ zpool status
pool: freenas-boot
state: ONLINE
scan: scrub repaired 0 in 0h9m with 0 errors on Wed Mar 22 03:54:02 2017
config:

NAME STATE READ WRITE CKSUM
freenas-boot ONLINE 0 0 0
gptid/003f3068-e99c-11e4-9c07-0cc47a0742be ONLINE 0 0 0

errors: No known data errors

pool: nas
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 Jul 4 15:50:05 2020
245M scanned out of 12.7T at 5.21M/s, 708h49m to go
37.8M resilvered, 0.00% done
config:

NAME STATE READ WRITE CKSUM
nas DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
gptid/8bc84eb2-a099-11e5-8fd4-0cc47a0742be ONLINE 0 0 9 (resilvering)
gptid/4f6e78a5-a166-11e5-bb78-0cc47a0742be ONLINE 0 0 0
gptid/4c4a9c43-a00e-11e5-bf62-0cc47a0742be ONLINE 0 0 0
gptid/103acf85-a043-11e5-b6db-0cc47a0742be ONLINE 0 0 0
replacing-4 OFFLINE 0 0 0
209564843571883103 OFFLINE 0 0 0 was /dev/gptid/391e53c2-a06f-11e5-8ff9-0cc47a0742be
gptid/f83914be-bdca-11ea-9f22-0cc47a0742be ONLINE 0 0 0 (resilvering)
gptid/18324016-a19e-11e5-82be-0cc47a0742be ONLINE 0 0 0

errors: No known data errors

可以看见阵列已经在重建了,耐心等待吧,要 10 几个小时呢,我们直接快进到完成。

祸不单行

经过漫长的等待之后,终于迎来了激动人心的时刻,磁盘阵列重建好啦!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$ zpool status -v
pool: freenas-boot
state: ONLINE
scan: scrub repaired 0 in 0h9m with 0 errors on Wed Mar 22 03:54:02 2017
config:

NAME STATE READ WRITE CKSUM
freenas-boot ONLINE 0 0 0
gptid/003f3068-e99c-11e4-9c07-0cc47a0742be ONLINE 0 0 0

errors: No known data errors

pool: nas
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: resilvered 2.11T in 15h24m with 0 errors on Sun Jul 5 07:14:22 2020
config:

NAME STATE READ WRITE CKSUM
nas ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
gptid/8bc84eb2-a099-11e5-8fd4-0cc47a0742be ONLINE 0 0 1.04K
gptid/4f6e78a5-a166-11e5-bb78-0cc47a0742be ONLINE 0 0 0
gptid/4c4a9c43-a00e-11e5-bf62-0cc47a0742be ONLINE 0 0 0
gptid/103acf85-a043-11e5-b6db-0cc47a0742be ONLINE 0 0 0
gptid/f83914be-bdca-11ea-9f22-0cc47a0742be ONLINE 0 0 0
gptid/18324016-a19e-11e5-82be-0cc47a0742be ONLINE 0 0 0

errors: No known data errors
tommy@nas:~ %

可以看见阵列的状态已经变成了在线(ONLINE),表示阵列已经可以正常使用了。

但是,等一下,设备发生了无法恢复的错误是什么鬼?!

其中一块老硬盘后面的 CKSUM 不为 0,又是什么情况?!

查阅资料后发现,CKSUM 表示读取设备的过程中出现了数据的损坏。

很好,福无双至祸不单行,屋漏又逢连夜雨,这是不是说,我又双叒叕要买硬盘了呢?!

欲哭无泪……

再来一次

反正就是,上网下单买硬盘,等快递,重复以上所有步骤,再来一次。

最后的结果如下,总算是修好了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ zpool status -v
pool: freenas-boot
state: ONLINE
scan: scrub repaired 0 in 0h24m with 0 errors on Sun Jul 5 08:34:22 2020
config:

NAME STATE READ WRITE CKSUM
freenas-boot ONLINE 0 0 0
gptid/003f3068-e99c-11e4-9c07-0cc47a0742be ONLINE 0 0 0

errors: No known data errors

pool: nas
state: ONLINE
scan: resilvered 2.14T in 15h14m with 0 errors on Mon Jul 6 11:46:18 2020
config:

NAME STATE READ WRITE CKSUM
nas ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
gptid/7ae1958f-bebb-11ea-9789-0cc47a0742be ONLINE 0 0 0
gptid/4f6e78a5-a166-11e5-bb78-0cc47a0742be ONLINE 0 0 0
gptid/4c4a9c43-a00e-11e5-bf62-0cc47a0742be ONLINE 0 0 0
gptid/103acf85-a043-11e5-b6db-0cc47a0742be ONLINE 0 0 0
gptid/f83914be-bdca-11ea-9f22-0cc47a0742be ONLINE 0 0 0
gptid/18324016-a19e-11e5-82be-0cc47a0742be ONLINE 0 0 0

errors: No known data errors

总结

如果大家要做磁盘阵列的话,请务必用 2 块或以上的校验盘,RAID 5 已死!

虽然从概率的角度来看,同时坏 2 块硬盘的可能性极小,但是在实际使用过程中,意外就是这么发生的。

想想也是,硬盘都是一起买的,生产批次一般也都一样,坏的时间可能也差不多。

所以不要心存侥幸,一定要使用 2 块以上的校验盘,珍惜生命远离 RAID5,更不要说 RAID 0 了。

我使用的是 RAID-Z2 类似于 RAID 6,总共 6 个盘,4 个做数据存储,2 个做奇偶校验,最多可以坏 2 块硬盘而不会丢失数据。

假如不是 RAID-Z2 的话,很有可能我现在的所有数据都丢失了。

硬盘有价,数据无价!还是那句话能花钱解决的问题都不是问题,数据没了花钱都解决不了。