前言
从去年年初开始折腾NAS并选择了TrueNAS作为系统之后,可以历尽艰辛,软件硬件的坑踩了一大堆,但好在大部分在有限的学习和试错成本之后,都解决了,但是从去年年中开始,TrueNAS突然开始报严重错误(Critical),存储池降级,状态为DEGRADED;一块磁盘也显示降级,状态为DEGRADED。因为我做了TrueNAS自带的Raidz1,相当于标准的Raid5,能抗一块硬盘坏的情况,再加上使用正常,无论是系统运行还是存取速度都没有明显变化,我就没理它。
进入2023年,系统突然像抽风一样报DEGRADED的错误,一共四块盘,三块都报DEGRADED错误,最夸张的时候偶尔四块都报,但是存储池还能访问,把我整蒙圈了,但大部分时候都是三块报。怀着惴惴不安的心情,在度娘上搜索数日,也开着翻译软件看了TrueNAS英文论坛里的相关主题,也请教了大厂专业做存储设备的工程师,断断续续折腾一周多,说实话TrueNAS资料实在是少得可怜,大多是教你怎么安装配置初始化的教程,故障处理的基本没有,查资料和尝试的过程无比痛苦。在我最终自行尝试找到一种方法解决了之后,我决定把我的个人经验分享出来,给有同样困惑的朋友提供一点帮助。
问题描述
如本文标题所示,本篇是个人经验,对于存储系统原理、Linux、NAS存储原理和TrueNAS系统,我都还是小白,虽然我找到了一种方法解决了DEGRADED的问题,但不确定它的适用范围,所以我先详细描述一下我的系统条件和遇到的问题。
系统基本情况
TrueNAS版本:TrueNAS-SCALE-22.02.0.1
存储池磁盘:4块4T希捷硬盘
Raid情况:Raidz1
存储池名称:MainData(个人给存储池起的名,非系统术语,仅用于方便理解截图)
系统报错情况
1、首先是TrueNAS系统的报警,提示我自建的“MainData”存储池降级了,一块或以上的磁盘设备遇到了不能修复的问题,这里提示有两块磁盘处于“DEGRADED”状态。
2、查看存储池的状态,发现存储池总体是DEGRADED,池内的RAIDZ1阵列也是DEGRADED,下面sdb和sdd这两块磁盘也是DEGRADED。
3、进入TrueNAS的命令行,输入"zpool status MainData"查看MaiData的状态,发现除了DEGRADED提示和之前一样外,这两块盘还提示“too many errors”,即错误过多。
如果你的报错情况和我的一致,可以往下看处理方法。
处理方法
1、首先把DEGRADED磁盘从阵列中离线
在存储池状态里把提示DEGRADED的一块磁盘离线,点击最右侧的三个点,会弹出菜单,选“离线”。这里我操作的磁盘设备是sdb,首先对它进行离线操作。
点“确定”之后有个请稍后的提示,根据情况不同时间不同,一般时间不会太久。在这里顺便吐槽一下TrueNAS半生不熟的汉化。
操作完成之后,sdb磁盘状态已经显示为“OFFLINE”了。
2、把离线的磁盘擦除数据
在存储>磁盘里,把离线的这个磁盘擦除数据,我这个就是把sdb擦除数据。
注意,如果没有提前把磁盘从阵列中离线,那么这里是不会有“擦除”的按钮的。
点“擦除”会有弹窗,直接点“擦除”
3、用擦除过的空磁盘替换存储池里原位置的设备
擦除完成后,回到存储池状态界面,可以看到原来磁盘sdb的那一行已经变成了一长串字符串,状态会变成“UNAVAIL”(意思是不可用);点击最右侧三个点,在弹出菜单中选择“更换”,在弹出的界面中选择sdb。这里因为我只操作了一个磁盘,所以只有一个待选项,如果你同时操作了多个磁盘,这里可能会有多个磁盘的选项,因为都是空的,理论上选哪个都行,当然最好是和原来的位置对应选。
4、阵列重建
替换完磁盘后,阵列会自动进行重建,最上面一行“RESILVER”,翻译过来就是重建的意思(再次吐槽TrueNAS半生不熟的界面汉化)。阵列重建的意思就是按照raid的规则,把数据分布在所有磁盘上的意思。比如原来有4块盘,我做的是raid5,每块盘都按raid5的规则存储了实际数据和校验数据,这些校验数据保证了在损失一块盘的情况下,数据不会丢失。当其中一块盘被更换成空盘之后,raid就会按照规则,通过计算把实际数据和校验数据重新写到空盘里,来实现数据的完整保护机制。更详细的可以自己百度,有很多通俗易懂的解释。
阵列重建是最消耗时间的,消耗的时间和数据量大小有关,而且每操作一次替换硬盘的操作,就要重建一次,我这个阵列数据量只有2T多点,一次重建时间1个多小时,还可以接受;数据量大的可能就得7、8个小时甚至更多,好在是个自动过程,不需要干预,不做高吞吐量操作的话,也不影响NAS使用。重建完成后,磁盘的状态就会变成“ONLINE”了,再把其他DEGRADED状态的磁盘按这个步骤逐一操作,全部磁盘都操作完毕后,阵列的状态也就正常了,不会再有DEGRADED的提示了。
我遇到的问题
我在操作时,遇到一个情况,就是擦除磁盘后,在存储池状态里,sdb磁盘没有变成一长串字符串,还是显示sdb,此时做“更换”操作会报错,提示磁盘非空,存在分区(如下图),原因未知;后来偶尔发现,重启TrueNAS后,存储池状态里,sdb磁盘就变成长串字符串了,就可以正常更换硬盘了。
我遇到的那些坑
由于资料太少,网上能找到和能问到的每一种方法我几乎都试了一下,白干了不少事儿,还好没造成啥可怕的影响,这里把我趟过的主要的坑给大家列一下。
超级无敌巨坑:磁盘DEGRADED
一般来讲,对于各类raid磁盘阵列,除了raid0,DEGRADED这种状态是形容阵列总体状态的,用以形容阵列的数据保护级别降低了,原因也确实和TrueNAS提示的一样,一般是某块硬盘坏了,需要更换。但TrueNAS给硬盘也搞了个DEGRADED的状态,这就导致我在网上提问和请教专家的时候,别人都以为是阵列的状态,给的答复都是需要更换硬盘,网上能查到的资料,包括英文资料,也说要更换磁盘。但我把磁盘拆下来用diskgen查看了smart信息,做了全盘扫描,都没有问题,实在看不出来磁盘哪里坏了。说实话我到现在也不明白单个磁盘DEGRADED到底是啥意思,TrueNAS官网我看着也说的模棱两可,当然也可能是英文我不是很懂,总之这个错位的理解使我走了绝大多数的弯路。
无效方法:磁盘取下删除分区后再装上
大厂专门做存储的朋友给我提供的方法,让我把磁盘取下来,在Windows上用工具删掉所有分区,再装回去,系统就会认为安装了新盘,会自动重建阵列,并消除错误。但实际上我装回去之后,存储池状态里会出现类似磁盘擦除数据后的样子,但选择“更换”时,会提示磁盘非空,不允许选这块盘,报错和“我遇到的问题”那一节的截图一样。后来我发现,TrueNAS的这个软raid和真正的硬raid还是有区别的,有些在硬raid上可用的方法,在TrueNAS的raidz体系里不一定能行。
无效方法:存储池校验
网上有种说法是手动执行存储池校验(英文是scrub),校验完了只要没错误就会把磁盘状态修正为“ONLINE”,实测无论是通过UI界面还是命令行,执行校验后均不会修正磁盘状态,能看到进行了重建,但重建完了阵列和磁盘的DEGRADED状态不变。
待验证的说法:sata线和电源的影响
网上的资料和我做存储的朋友都提到sata线的质量、接头的接触是否良好,会影响磁盘是否出错。我朋友说“一个写操作没有正常执行,就会产生I/O错误”。此外,网上也有外国人说他更换了450W的电源,然后磁盘的DEGRADED状态消失了,不过阵列重建完了又成DEGRADED了,后续也没看到咋解决的。
对于我的情况,我是6盘位,4HDD+2SSD,200W电源,未更换sata线和电源,按本文的方法解决了问题,因此上述说法未经验证;但有一点是大家公认的,那就是尽量不要非正常关机NAS,容易一次性产生大量逻辑错误。
以上就是我处理TrueNAS存储池和磁盘降级(DEGRADED)的一点个人经验和教训,希望能对大家有所帮助。