本来紧接着上一回说好了作为一台入门的NAS应该具备的功能后,本来打算先说两个稍微进阶的功能ISCSI和SVN在OpenWRT的部署,
但刚刚一个群友,又用黑裙掉盘了~然后貌似群里的人都没有对磁盘进行维护的习惯….好吧我就跳过ISCSI和SVN先说这个吧~
至于iscsi和svn不用急~下来的文章后补就好~

在讨论前首先戴头盔
对于中小企业来说~千万不要~毕竟对于企业而言稳定第一~
以下看法纯属个人主观与偏见的看法~并非技术讨论帖~各位大神如果有不同意见可以留言讨论
如果觉得在下太水皮的话~就当你赢~我输就好~

1、硬盘休眠
首先我们说硬盘休眠~
很多人听到这个词的时候想到的居然不是省电~而是容易坏~~没错的,在大概十来年前西部数据绿盘和监控盘大规模故障事件~
老玩家们到现在依然心有余悸~当年的确是很多硬盘在这方面并没有做的很好,但技术是会发展的~
很快硬盘厂家就解决这个问题了,休眠甚至会为非7*24小时工作设计的硬盘延长寿命,顺便省电~~当然反过来理解也可以~
那么我先说说如果你编译OpenWRT固件的时候选上了HD-Idle的话,直接在管理界面上选就可以了~
我今天说一个无论在CentOS / Debian / Ubuntu上还是OpenWRT上都可以实现磁盘休眠的东西~叫做hdparm
在OpenWRT下可以直接opkg install hdparm来安装
安装好后~直接在OpenWRT的Startup一栏的最下面加入以下内容
或者好像Linux系统一样直接在/etc/rc.local下添加

/sbin/hdparm -S 60 /dev/sda #这里你的硬盘是什么就什么,有多少个硬盘加多少行

意思是说硬盘无访问5分钟自动休眠,当然你还可以配合Scheduled Tasks栏来实现定期的开启或者关闭休眠
或者好像Linux系统一样直接使用crontab -e来编辑定期任务排程

2、S.M.A.R.T
S.M.A.R.T – Self-Monitoring Analysis and Reporting Technology
现在只要是个硬盘都带这项技术,简单点儿说是硬盘提供给系统一个接口可以监控硬盘的各种运作状态数据。
而发行版Linux和OpenWRT都可以通过smartmontools工具包来读取这个数据
OpenWRT下直接opkg install smartmontools就可以安装完毕
其中smartctl -H /dev/sda命令是输出硬盘的smart的简要报告
其中smartctl -a /dev/sda命令是输出硬盘的smart的完整报告
以下我要给大家提供一个我写简单脚本,用来定期检查硬盘的情况,如果发现有异常就发邮件通知你,那么我们先来做一些准备
首先要安装ssmtp,用于发邮件通知用户,只需要opkg install ssmtp就可以安装完成
Debian和Ubuntu则直接sudo apt-get update && apt-get install ssmtp,而CentOS则可以使用EPEL软件源来进行yum安装。
过程我就不多说了~当我们安装好ssmtp后,我们需要进行配置
首先我们要编辑/etc/ssmtp/ssmtp.conf文件,内容为

root=xxx@xxx.com              #邮箱地址
mailhub=mail.xxx.com:465      #SMTP服务器地址,如果不适用SSL的话一般是25端口
rewriteDomain=xxx.com         #重写路径域名域名
hostname=xxx.com              #域名
FromLineOverride=YES
UseTLS=YES                    #是否使用SSL
AuthUser=xxx@xxx.com          #邮箱用户名
AuthPass=xxxxxxxxxxx          #密码
AuthMethod=LOGIN

然后编辑/etc/ssmtp/revaliases文件,内容为

root:xxx@xxx.com:mail.xxx.com:465 #root:你的邮箱地址:邮件服务器地址:端口

然后就可以建立一个脚本放在你喜欢的地方,HDD.Health.Care,当然名字随便了~自己喜欢就行,内容如下
这里假设你的NAS里面有4块硬盘~分别是sda / sdb / sdc / sdd

#!/bin/sh
rm /tmp/hdstatus* -rf    #删除之前留下的所有本脚本生成的硬盘健康状况报告
#对SDA进行测试
/usr/sbin/smartctl -H /dev/sda > /tmp/hdstatus.sda
if grep -q "PASSED" /tmp/hdstatus.sda
then
	echo "Your HDD sda is health."
else
	echo "Your HDD sda not health."
	echo "Your HDD sda not health.\n" > /tmp/hdstatus.Err
	/usr/sbin/smartctl -a /dev/sda >> /tmp/hdstatus.Err
fi

#对SDB进行测试
/usr/sbin/smartctl -H /dev/sdb > /tmp/hdstatus.sdb
if grep -q "PASSED" /tmp/hdstatus.sdb
then
        echo "Your HDD sdb is health."
else
        echo "Your HDD sdb not health."
        echo "Your HDD sdb not health.\n" >> /tmp/hdstatus.Err
        /usr/sbin/smartctl -a /dev/sdb >> /tmp/hdstatus.Err
fi

#对SDC进行测试
/usr/sbin/smartctl -H /dev/sdc > /tmp/hdstatus.sdc
if grep -q "PASSED" /tmp/hdstatus.sdc
then
        echo "Your HDD sdc is health."
else
        echo "Your HDD sdc not health."
        echo "Your HDD sdc not health.\n" >> /tmp/hdstatus.Err
        /usr/sbin/smartctl -a /dev/sdc >> /tmp/hdstatus.Err
fi

#对SDD进行测试
/usr/sbin/smartctl -H /dev/sdd > /tmp/hdstatus.sdd
if grep -q "PASSED" /tmp/hdstatus.sdd
then
        echo "Your HDD sdd is health."
else
        echo "Your HDD sdd not health."
        echo "Your HDD sdd not health.\n" >> /tmp/hdstatus.Err
        /usr/sbin/smartctl -a /dev/sdd >> /tmp/hdstatus.Err
fi

if [ -f /tmp/hdstatus.Err ];
then
#你的硬盘看来有毛病哦~~发个邮件通知自己~
	echo "Your HDD not health. now sending warning Email...."
	sed -i '1i\Subject: HDD Health Warning Letter.\n\n' /tmp/hdstatus.Err | cat /tmp/hdstatus.Err | ssmtp -v xxx@xxx.com
else
	echo "All your HDD is health."
fi

这个脚本大概逻辑很简单,就是输出每个硬盘的粗略检测报告,检查里面是否有PASSED字样,有的话代表硬盘的smart报告显示健康。
如果没有的话就把详细报告写到/tmp/hdstatus.Err文件里面
最后判断是否存在这份文件,有的话就发邮件通知用户,这脚本简单粗暴但十多年来一直好用~
然后在定期任务排程里面添加这个脚本
例如每个周末凌晨进行一次检测~

3、磁盘阵列数据校验
如果你的NAS有做了Raid 5,或者你以前做过Raid 5,应该知道,其实Raid 5有奇偶校验,至于这玩意儿是什么就不多说了,
反正Raid 5为了保证数据的一致性,Linux的mdadm有一套机制对磁盘阵列进行数据完整性测试,如果有问题的话会自动进行修复。
那么这个机制是否可以手动进行呢,答案是可以的。
mdadm的磁盘检验状态是保存在/sys/block/md0/md/sync_action文件
内容为check则会开始进行校验,正常则是idle。
那么为了不影响日常使用,我一般会定义每个月的1号的凌晨2点钟自动进行一次校验。
只需要在定期拍成加入以下一行就可以了。

0 2 1 * * echo check > /sys/block/md0/md/sync_action