不过,在这里我打算使用 OpenMediaValut 来作为操作系统。首先,这个基于FreeNAS的系统其实来也是Linux系统,方便我以后继续折腾一些东西。硬盘数据以后也可以再其他Linux上读取。第二,对安装盘的要求很小,所以我计划把4个SATA全部都用来装硬盘,操作系统安装在一个U盘上。全部安装完毕后,把这个U盘拷贝下,以后就算是把这个U盘写坏了,也就是在买一个U盘的事情了。在OpenMediaVault 上有专用 FlashMemory插件 来减少对根目录的读写来保护U盘。
数据存储如果资金充裕,还是建议使用NAS专用的硬盘,比如西数的紫盘,或者希捷的狼盘。这些硬盘能够保证在长时间运转(7x24h)运行中保持良好的稳定性。我在自己的系统中采用了希捷的酷鹰——监控盘,主要的原因是价格便宜,也能够长期运行,转速只有5900RPM——可以有效的减少磁盘读写噪声。
针对硬盘文件系统,我也放弃了RAID和LVM的方式,而是采用了 MergerFS + SnapRAID 方案。自我感觉这是目前市面上最合适家庭NAS系统的磁盘和文件管理系统。
MergerFS
首先出场的mergerFS是union file system中的一种(这里有 一个比较不错的关于Aufs的介绍 ),类似LVM所追求的结果,通过megerFS可以将多个硬盘上的数据以一个目录的方式来使用。但不同的是,这种文件系统是一个用户空间的文件系统,它并不会对硬盘进行条带化的处理,每个硬盘上都保存着原来文件系统中的目录和文件。如果拿出一个硬盘接到其他的机器上,无需逻辑卷的配置数据,就可以读取这个硬盘上的数据。类似的文件系统还有AuFS和 Mhddfs ,不过很多测试表示目前MergerFS的效率更好,也提供了更多的配置选项。
如果A硬盘上设置了“movie”目录,B盘上有“download”目录。将两个盘通过MergerFS合并到一个目录下,你会看到“movie”和“download”两个文件夹。在默认的策略(epmfs-目录存在的前提下用空间大的盘)下,在movie目录存放的数据会先存在A盘,下载的文件先存放在B盘。这样,有些不太经常使用的盘就可以减少运行,甚至可以进行休眠。这样的策略很适合BT下载后,把文件拷贝到电源目录下,保护存放电影的盘。关于不同的策略,可以参考MergerFS的GitHub上面的说明,可以根据自己的需要进行设计。
MegerFS 的缺点主要也是由于没有条带化磁盘,而是通过将实际文件存放在不同的磁盘来实现,造成无法彻底利用磁盘空间。比如说一个蓝光盘有30GB大,虽然A,B盘都有20GB的空间,却没法存放这个文件了。因为MergerFS中文件是完整存放的,无法分割为两个15GB的文件。不过相对于试下几个T为单位的磁盘,这种情况也是很少能遇到的。我的建议就是在磁盘利用率达到80%左右的时候,开始考虑加入新的磁盘。
我在MergerFS中将第一个硬盘为基础建立了一个安装点为 /pool 的逻辑卷。所有的共享文件都在此目录中进行。后加的硬盘也会出现在这个目录中。当程序访问这个目录进行读写后,MergerFS会自动的实时处理,将数据放置在正确的磁盘文件目录中。测试结果看来最高CPU占用率在15%左右就可以实现近100MB/s的读写了。
SnapRAID
和ZFS 不同的是,MergerFS 没有冗余功能来保障数据安全。这时候我们可以采用SnapRAID来实现一个软件的RAID支持。此功能类似RAID5,需要额外的一个硬盘来存放校验数据。此盘的容量必须大于等于其他数据盘。其他数据盘里面也要保存一些称之为“content”的数据信息。也就是说SnapRAID需要占用一些额外空间来做数据冗余。
为什么SnapRAID比其他硬件RAID,ZFS更让我觉得推荐呢?首先,SnapRAID 不需要所有盘的大小是完全一致的,也不关心每个硬盘的格式。
SnapRAID 功能如其名,是采用快照的方式来做数据冗余的。具体说就是定时执行一次同步操作后,会生成冗余数据。相比硬件RAID方式,这种设计及避免了所有硬盘在没有数据操作情况下也要运转以满足实时数据同步带来不必要的耗费。如果修复失败,也不会让整个硬盘上的数据丢失,只会有个别文件无法恢复。
SnapRAID 的缺点也是明显的,它不太适合大量小文件,频繁更改的系统。更适合像是存放照片和电影的家庭NAS,有很多尺寸比较大,很少变更的存储系统。
设置SnapRAID 需要将数据盘——也就是映射在MergerFS下的磁盘全部都加入到数据盘列表中,而另外一块专用的校验数据盘不要加入到MergerFS中,在这里只保存校验数据和冗余信息。
相比于MergerFS近乎实时的工作方式,SnapRAID 则是需要定时维护的。而且要避免在生成校验信息的时候进行数据操作。可以选择在OMV 网页管理界面里面,人工选择同步,然后校验和冗余数据就会同步好。另外,也可以创建一个定时任务,每天深夜没有数据写入的时候来执行来实现生成同步信息。