Linux系统家庭服务器下机械硬盘优化方法

随着Ipv6的普及,很多朋友已经建立了基于ipv6的家庭服务器,相信也有不少人和我一样,采用的是原生Linux操作系统 [什么,你还没有开通ipv6,那么点这里zhuanlan.zhihu.com/p/60 ],但是,很多NAS老用户都会告诉你,NAS很伤硬盘,你一定满脑子的浆糊了,what?

习惯了Windows环境下,如果某个磁盘不用,几分钟后,系统自动把磁盘给休眠了,太好用了,什么都不用设置,操作系统自动就为你做了,这一点上,windows确实做的很好,比linux/unix好太多了. 而采用linux的操作系统,比如ubuntu linux (desktop,这已经可以说是问题最少的桌面linux系统了),如果你是在一台有电池的笔记本上安装,大部分情况下,操作系统也会自动帮你把没有使用的笔记本硬盘给休眠掉的,但是如果不是笔记本,比如我们自己部署的低功耗家庭服务器,你会发现磁盘休眠功能经常不起作用,磁盘始终是idle待机状态而不会进入sleep状态,如果服务器是和我的一样一年365天全年24小时运行的,这个功耗不算大,但是对磁盘的伤害就比较大了,用过NAS的好多用户都有一个感觉,那就是NAS很伤硬盘,经常出现2年多时间磁盘就完蛋,而同期购买在windows下用的磁盘依然还很健康,为什么?.

经过长期运行测试,现在可以找到一点原因,为什么linux[unix]系统下做文件服务的机械磁盘相对windows寿命要短.

[1] Linux系统下磁盘自动休眠存在问题.

光靠调整linux电源设置,实际上常常出现第一次管用,然后就失效的问题,和使用指令类似 sudo hdparm -S 80 /dev/sdxxxx 效果其实差不多,让硬盘自动在比如10分钟无操作后就休眠,但是,在linux系统[其实其他类似bsd unix系统也存在同样问题]上,经常出现设置后第一次管用,硬盘确实休眠了,但是当被唤醒后,后续无论多长时间,或者重新使用hdparm -S指令设置休眠,居然都不管用了,这到底是怎么回事我到现在也没搞清楚,hdparm说明里,-S指令只需要设置一次(源代码里的实际操作是写硬盘寄存器),后续就应该持续生效,但是实际操作中,有可能出现指令设置后第一次管用,但是被唤醒后,不会再次休眠了,这是非常让人抓狂的. 网络上的解决方法是各种各样,但是很多其实是错的,最典型也是目前最常见的是在crontab中采用定时任务的方法,每几分钟,执行 hdparm -Y,强制硬盘休眠, hdparm -Y确实可以强制磁盘休眠,但是如果服务器软件例如samba正在读磁盘,你定时进程一个指令把磁盘给休眠了,用户直接一个卡顿,然后磁盘立即被唤醒,重新加载,这其实不是保护硬盘,而是在谋杀硬盘,而且hdparm -Y指令实际使用中是有问题的,会导致硬盘[如果休眠状态]被唤醒然后休眠, 因此千万别学网上的那种crontab几分钟执行一次hdparm强制休眠的方式,这会导致你硬盘的磁头加载卸载次数飞速增加,如果一天执行300次,一年就是10万次了,而硬盘厂商给出的保用次数一般默认也就30万次多点,也就是不到3年,你的磁盘就达到了厂商的质保极限了. 这个问题我一直没有找到有效可靠并广泛适用的方法,最后我自己是修改了自己服务器主程序源代码,在守护线程中加入了一个状态参数,如果XFile服务目前没有有效连接,并且持续设置秒数[默认是1小时]内没有连接,就使用管道依次对设置的/dev/sdx 执行sudo hdparm -Y 指令,然后重置记录时间, 这个方法在我自己的服务器上[linux安装到独立的ssd磁盘,机械盘挂载到/home/disk1000/子目录,除了XFile没有其他磁盘服务]有效, 但是如果一个服务器上同时存在其他磁盘服务例如samba,nfs等,就会产生问题,因为只能监测自己的服务而无法同时检测其他磁盘服务,最好的解决办法还是由Linux内核来负责磁盘休眠,就象windows一样,目前是乎无解.

[2] 部署了samba服务,设置中直接将磁盘挂载在了系统推荐的挂载目录下,导致磁盘频繁被唤醒.

在linux下,不同发行版有不同的默认挂载目录,大部分成品NAS更进一步,直接把挂载位置给固定了,普遍都是在根目录下的子目录下的一个对应目录,然后设置samba服务的时候,直接把磁盘目录给配置进去了,这样出现了一个什么问题呢? samba是采用广播包进行探测的,有些路由器,或者手机等,如果配置了samba客户端,会定期发送一个广播包,当你的服务器samba进程接到这个udp广播包后,会自动扫描一遍发布目录,无论用户是否会有后续的操作,都会导致唤醒硬盘,这是非常要命的特性. 对于使用成品NAS的用户,你可能除了彻底禁用路由器端和手机端[包括电脑端]的samba客户端或者干脆关闭samba服务,根本没有其他办法; 而对于自己使用linux系统架设服务器的用户,我的建议是将硬盘挂载到二级子目录,例如将磁盘挂载到/home/diskall/diskxxxx, 然后在配置samba的时候使用/home/diskall,而不是/home/diskall/diskxxxx, 这样可以有效的避免因为samba客户端查询广播包导致 磁盘被频繁的错误唤醒问题.

[3]挂载磁盘的时候没有使用 noatime参数

大家知道,无论是ext2 ext3 ext4 xfs ntfs 等磁盘文件系统,都支持文件创建时间,文件最后修改时间和文件最后读取时间,这其中,对于几乎99.99的家庭用户而言,文件最后读取时间是没有任何意义的,但是默认这个参数是被开启的,这意味着什么呢,可能你的服务器有16G内存,然后有一个新的电影比如8G大小,你家里几个人先后在用手机电脑电视看这个电影,按linux的特性,实际上这个文件会被完全缓冲到内存,然后如果设置正常,磁盘会进入休眠状态, 但是,如果你没有针对挂载的磁盘设置noatime这个参数, 即使这个文件已经完全被缓冲到了系统内存,内容虽然不会读盘了,但是每一次新的后续播放,都会导致磁盘被唤醒,干什么呢? 就是改写最后读取时间,这是及其错误的行为,因为对于电影文件,对于普通数据盘,非资料盘,这种最后读取时间根本没有任何意义,但是如果你不配置noatime, 每一个新的播放就会导致磁盘被唤醒并修改一次最后读时间,这是一个对保护磁盘非常关键的挂载参数,成品NAS可能无法修改设置,但是对于自己架设的linux系统,我建议对每一个挂载的机械硬盘添加这个参数,对延长硬盘使用寿命非常有意义.

[4]对于常见的使用windows系统然后虚拟机建立的服务器,个人是不建议你这么干的,虽然使用windows系统做宿主,解决了linux/unix等系统下磁盘休眠问题,但是一来效率不高,二来内存的缓冲存在大问题,你的软件跑在虚拟机里,事实上会自动把大部分没有使用的内存分配给文件缓冲,而当你读盘时,宿主系统,也就是windows,其实也会自动为同一个文件做文件缓冲,这样导致了,同一个文件,事实上在你的虚拟机和宿主操作系统下维持了两个相同的缓冲,资源浪费很严重.


最后总结: 要在类Linux系统中保护磁盘寿命, 一要解决磁盘的自动休眠问题,目前这个是乎没有靠谱的可以广泛适用的方法,暂时只能靠服务器软件本身来协助完成; 二要解决磁盘挂载和samba唤醒问题,建议挂载到二级子目录,并在samba中不要直接使用挂载目录,而应该使用上级目录.三是磁盘挂载,使用noatime,配合大内存,可以非常有效的保护和延长机械盘寿命. 四,尽量用原生系统,而避免使用虚拟机.

至于其他类似自动同步软件,软raid等导致的磁盘无法休眠,性能差,额外损耗等,不在覆盖范围内.

发布于 2019-11-01 12:51