家用万兆FreeNAS组建

介绍

我是一个很忠实的NAS用户,并且使用了FreeNas很多年,一直很稳定好用,也很想推荐给大家使用,就打算写这篇文章了,也没别的什么目的。

为什么选择FreeNas

  • 硬盘池的可拓展性
  • 数据的安全性
  • ZFS格式
  • 独特的缓存机制

什么样的用户适合FreeNas?

首先刚开始玩的小白并不适合用FreeNas,上手比较难,但当然一开始就选择FreeNas,花费多一点的学习成本,肯定也是一个不错的选择。FreeNas有很多缺点,比如上手比较难(相比群晖什么的),入门条件也比较高,但你一但会用了,是一件很棒的事情。我罗列了一下条件:

  • 你并不打算用FreeNas来做一个All in One(AIO)的服务器。FreeNas更适合单独使用作为存储使用,它的虚拟化真的不怎么样,我有另外一台PVE来专门做别的服务。

  • 你打算使用10GB万兆网络来使用FreeNas。其实FreeNas在万兆网络环境情况下才能体现优势,不然好像跟群晖之类的也没啥区别,设置还更难。

  • 你的7200转的硬盘数量必须大于或者等于10个。因为考虑万兆环境,我们并不喜欢通过加缓存提高读命中率的方式来达到万兆,直接10个盘来让读取速度达到恒定万兆读取。(当然你可以加读缓存,但缓存永远是有限的,你还要考虑命中率等问题,没意思)

  • 你的内存起码128GB,别慌,这其实不是很贵,比如我也会推荐DDR3的内存给X79用。


我该购买什么样的机器来运行FreeNas

在FreeNas的官网有很多标准配置,我自己也是按照官网以及前辈的推荐来购买的,这样可以避免走很多弯路。
清单一是我自己的配置,价格也还好比较适中。


清单一 (除机械硬盘外总计8991元)

  • 主板: 超微X10SRA-F 二手主板自带IPMI,这是我买服务器主板的首要条件,不然大机箱管理起来特别麻烦。 闲鱼买来950元

  • 内存:海力士HMA82GR7CJR8N-VK 16G X8 一共128G内存,其实我觉得还是有点不够,淘宝二手价格还行。 380元X8=3040元

  • CPU:E5-2680V3 我买的线程数有点多了,非常够用,可以考虑买便宜一点的。665元

  • 机箱:超微846 24盘位机箱。这款机箱淘宝有很多很多,并且自带背板,注意要问清楚自带的背板是SAS几的,最好买背板是SAS2或者SAS3的!如果机箱自带的是SAS1的话,你必须买回来把背板拆了,再买一个SAS2+的背板。1100元

  • 散热器:猫头鹰(NOCTUA)NH-D15S 买这个完全是为了静音。这个高度是刚好给这个4U机箱用的,你可以按照此款高度购买别的静音款风扇。 600元

  • 电源:PWS-920P-SQ 机箱自带的电源非常吵,不喜欢的话买这个,SQ结尾的是静音系列,这个机箱其实可以插两个电源,一个做冗余接在UPS,我买的是80块一个的成色非常差的(成色新的估计也只是抛光了一下),80元。

  • 机箱背板:BPN-SAS2-846EL1 如果能买到超微846机箱自带SAS2+的最好不过了,如果不行,请购买这款。当然你要SAS3的就购买BPN-SAS3-846EL1(这款海外EBAY上很多,淘宝上就见到过一两次) 960元

  • 机箱配件:机箱风扇,机箱开机键跳针 共200元

    • 背板后的风扇:ARCTIC F8 8cm X3 更换教程请看2分28秒

    • 机箱最后的出风口风扇:ARCTIC F8 8cm X2

    • 跳线:超微 CBL084L 机箱上连接开关电源键,指示灯的接口非常特殊,846机箱有很多版本,有的给X9用的,有的是X10用的。你可以自己制作公母杜邦线(PDD3块钱一大包),也可以购买我推荐的成品(淘宝有一家,EBAY无数家卖)。

  • SAS卡:LSI SAS 9217-8i 这款卡是给SAS2用的,有两个模式,自己刷成it模式,可以找淘宝店主直接帮你刷好。如果你买的是SAS3的背板,你需要购买LSI SAS 9300-8i,同样需要刷好it模式(以防万一,我会写一下刷IT模式的教程)。 闲鱼100元

  • SAS线:MINI-SAS线SFF-8087 X2,SAS2的线,80CM的。如果是买的SAS3背板请购买相应的线,两根46元

  • 万兆网卡:Intel 82599 万兆光口网卡 这张卡其实是我用黑苹果多余出来的。你可以买光口寨卡,82599或者mellanox的,都支持。但如果你购买万兆电口的话,尽可能购买原厂卡!(之前买的万兆寨卡一热就掉速) 闲鱼包含光模块250元(寨光卡)

  • 机械硬盘:自己看着办(西数的固件降速策略似乎不太兼容FREEBSD)。

  • 固态硬盘:intel s3510 1T 购买固态硬盘不是为了让他成为缓存什么的,因为ZFS的特殊性,尽可能设置PT软件(e.g. transmission)先把文件下载到固态,再自动转移到机械硬盘的池里,这主要是因为ZFS的特殊性而考虑。为什么买S3510呢?便宜吧,最主要是MLC,如果你用TLC做这个事,很快就会坏了的。1000元


清单二 (除机械硬盘外总计6780元)

  • 主板: 超微X9SRL-F 因为X9这一代的CPU单路支持IPMI的特别难找,这是我搜到的,可以试试搜搜别的单路更便宜的。800元

  • 内存:M386B4G70DM0-YK04 32G X4 因为是DDR3的内存所以超级便宜,可以考虑多买一点,一共128G总计1480元

  • CPU:E5-2650v2。根据自己情况可以选别的,165元

  • 机箱:同清单一,1100元

  • 电源,同清单一, 80元

  • 散热器:利民thermalright ITX-R REV.A 清单一的太贵了,从高度来说可以,但不知道挡不档内存,500元

  • 机箱背板:同清单一 960元

  • 机箱配件:同清单一 共200元

  • SAS卡:同清单一 闲鱼100元

  • 万兆网卡:同清单一 闲鱼包含光模块250元

  • 机械硬盘:同清单一

  • 固态硬盘:同清单一,1000元

当然,以上两个清单你不考虑噪音可以便宜一些。


安装

安装包括硬件和系统,首先是把SAS卡LSI SAS 9217-8i刷成it模式,再讲FreeNas的安装。

LSI SAS 9217-8i 刷成it模式

在家用FreeNas环境我没有推荐用阵列模式,一来是这个是家用而已,二来ZFS已经足够健壮了,把卡刷成直通的it模式就行了。

  • 下载如下软件

  • 准备一个U盘

    • 4G的U盘都够用了,不需要太大,但不要超过32G。
    • 把U盘格式化成Fat32格式,注意不要带任何ESP分区。
  • 把文件放入U盘

    • 解压Installer_P20_for_UEFI.zip,复制Installer_P20_for_UEFI\sas2flash_efi_ebc_rel\sas2flash.efi 至U盘根目录。
    • 解压UEFI_BSD_P20.zip,复制UEFI_BSD_P20\uefi_bsd_rel\Signed\x64sas2.rom 至U盘根目录。
    • 解压9207_8i_Package_P20_IR_IT_FW_BIOS_for_MSDOS_Windows.zip。复制Firmware\HBA_9207_8i_IT\9207-8.bin 至U盘根目录。当然如果你是9300-8i的SAS卡,到官网下载一下it固件,一样的。
    • 在同上一个目录复制sasbios_rel\mptsas2.rom 至U盘根目录。
  • 制作UEFI Shell启动项
    • 如果是超微主板,一般在开启选择启动画面是可以直接使用自带的UEFI Shell,那你就可以跳过此步骤。
    • 在U盘根目录创建一个名叫efi文件夹,进入此文件夹,再创建一个叫boot的文件夹,即efi/boot/。同此也创建一组boot/efi/的文件夹。因为老一点的主板路径对UEFI的识别路径不同,以防万一,做两个。
    • 下载 Shell_full.efi
    • 准备两份shell_full.efi,分别重命名为ShellX64.efi和BootX64.efi。
    • 把ShellX64.efi和BootX64.efi放入efi/boot/下,同样的,把这两个文件放到boot/efi/

      一般情况下,shell文件放在efi/boot/BootX64.efi即可,只是有些主板对UEFI的读取有点奇怪,记得要关了BIOS中的secure boot这个选项

  • 进入UEFI Shell

    • 开机按启动选择键,以U盘作为启动,进入UEFI shell,应该是一个类似如下的界面:
      e41a0684dd51574fd1cc6fed6c3d08fd55226f34.png

    • 如果你无法进入,提示错误,考虑一下升级主板bios以及确认主板是否支持UEFI启动,以及关闭主板的secure boot。

    • 在界面上你会看到检测出来的硬盘,确认哪个是你的U盘,进入那个U盘则输入fs0:

    • 接着输入dir,看看目录下的文件是否是U盘里之前放的,不是的话退出去,再找别的路径进来。

  • 刷入固件
    • 进入U盘根目录后,输入sas2flash.efi -listall,确保你的卡被识别出来(图片我随便找的,跟你的卡数值可能不同)。5a719c1baa02ba545539f89c3c77696dba3a1e60.jpg
    • 如果找不到这张卡,请确认这张卡是完好的,在bios设置界面中也能看到。
    • 输入sas2flash.efi -list,记录下16位SAS Address (图片也是网上找的,可能不同,红色框内的所有东西都记下来!!!!!!!).
      afae920ac73b9b7a6fa5b201efa5cf09dc4ddc00.png
    • 输入sas2flash.efi -o -e 7来删除当前固件。
    • 输入sas2flash.efi -o -f xxxxx.bin -b x64sas2.rom -b mptsas2.rom 写入新的固件。xxxxx.bin应该是你之前放入的固件名字,比如9207-8.bin。
    • 输入sas2flash.efi -o -sasaddhi XXXXXXX 写入SAS地址,其中XXXXXXX为刚才记录的SAS地址的前7位,一般是500开头。
    • 接着按提示输入剩下的sas地址的数字,不需要输入-
    • 搞定,输入一下sas2flash.efi -list看看新的固件有没有刷进去。
    • 重启输入reset就可以用了。

FreeNas相关设置

怎么安装,怎么设置硬盘池,开共享目录那些就不说了,网上一大堆视频教程。如果是相关优化的话,因为每个人的机器需求不同,可以参考ZFS Tuning Guide

相信新手碰到最头痛的肯定就是权限问题了,这里可以展开说一下。

FreeNas权限设置

其实这里有很多很多方法,我说一下我自己的吧,可能不是最好的办法,但是是我最习惯的办法。
一般新用户会去account里新建一个自己的用户,这个新的用户用来访问SMB,NFS等。比如我设置的用户叫做xjn,我打算用这个用户来使用所有的文件共享,我们就对所有的pool下面的datasheet的权限都给xjn,所有者和所有组都是(记得要apply permissions recursively)。提一嘴,如果是NFS共享,记得把Mapall User设置成xjn。

另一方面,我们可能会装一些jail来使用一些功能,比如安装transmission来下载,但是默认情况下,jail里transmission下载的所有文件都是归root用户所有,导致我们用自己的账户打不开这个文件。这里我们需要对transmission的权限给xjn这个用户,这样下载下来的文件都能打开了。

因为我不是特别喜欢freenas里面plugins一个插件一个jail的逻辑,我觉得你想要啥就全装在同一个jail里就够了。所以以下内容包括了设置权限,以及怎么手动装一个transmission(我打个比方而已)。

  • 获得你的gid uid
    在shell下输入:
    [email protected][~] id xjn
    uid=1000(xjn) gid=1000(xjn) groups=1000(xjn),0(wheel),545(builtin_users)

    对,我给xjn这个用户多给了一个wheel的组,以防万一,你们可以参考一下。

得到我的这个xjn账户的uid和gid都是1000,记下来。

  • 创建一个jail

    iocage create -n "myjail" -r 12.2-RELEASE vnet="on" ip4_addr="vnet0|10.10.10.4/24" defaultrouter="10.10.10.3" boot="on"

    我们创建一个叫做myjail的jail,使用的是12.2-RELEASE这个版本,把这个jail的ip地址设置成了10.10.10.4,并且本地的路由器地址是10.10.10.3。请根据自己情况改一下。

  • 在Jail中安装软件,我们假设装一个transmission。

    iocage console myjail   #进入刚才创建的myjail的shell里
    env ASSUME_ALWAYS_YES=YES pkg bootstrap
    pkg update
    pkg upgrade -y          #更新一下软件和源
    pkg install -y nano wget transmission    #安装一下这三个常用软件
  • 修改安装好的transmission的权限,保持与主系统一致。

第一步里,记录下来我的常用用户为xjn (uid=1000),那么我们在这个jail里创建一个一模一样的用户:

pw useradd -n xjn -w none -u 1000 -c "xjn"
#创建好之后,输入:
id xjn
#看一下jail里这个xjn的ID是否跟主系统中的一致

如果你的主系统NAS有多个用户要用,你可以把所用的用户归类到同一个组里去。
我们把transmission的权限交给jail里xjn这个用户:

cd /usr/local/etc
chown -R xjn:xjn transmission
sysrc transmission_enable=YES
sysrc transmission_user=xjn
sysrc transmission_group=xjn
  • 在jail中创建一个与主系统池相连的目录,用来给transmission下载

仍然在刚才的jail的shell环境下,创建一个目录,比如是/mnt/pt

mkdir /mnt/pt

退出jail,回到主系统shell中,输入:

exit

把硬盘池的一个目录共享给jail用,比如主目录的地址为/mnt/home/pt,刚才我们在jail中设置的目录是/mnt/pt, 输入:

iocage fstab -a myjail "/mnt/home/pt" "/mnt/FTP" nullfs rw 0 0

回到myjail中:

iocage console myjail

让transmission生成配置文件:

service transmission start
service transmission stop

修改配置文件:

nano /usr/local/etc/transmission/home/settings.json

修改如下两项:

"rpc-whitelist-enabled": false,

"umask": 7,

修改完后+X保存

在jail里绑定下载路径,输入:

cd /usr/local/etc
sysrc transmission_download_dir="/mnt/pt"
service transmission start
exit

至此,完成。

强烈建议使用transmission的incomplete-dir那个选项,把下载的东西先放到一个MLC的硬盘中,全下载完后,再自动移到主机械硬盘池。


FreeNas Tuning

刚才有说到官网的freenas tuning设置,因为每个人的习惯不同似乎没有一个比较统一的说法,这是我的微调:

  • vfs.zfs.dirty_data_max

这个值是脏数据,默认是4GB,但是我一般拷贝单个文件到NAS上,很多都是超过8G的,这样在持续写入一段时间后会掉速到机械硬盘池的真正写入速度,我就把这个值调整到了8589932492(8gb)来优化了体验,按照你的需求和物理限制更改。

  • vfs.zfs.arc_max

这个是真的“写缓存”,其实我用默认的调整还是不错的,没有啥固定标准我就不说了

一些小问题

  • 是否需要自己加Slog以及L2arc?

你的网速是10gb,以及10个7200转的硬盘的话,不需要。SLOG是保证你数据绝对能写入,并不是帮你增加速度的,比较适用与金融场景,家用还是配好UPS吧。L2ARC的话是你内存不够用的情况下才用的,但是我们10个7200转的硬盘已经达到读取速度900+MB/S了,其实不需要读缓存了。设置多层存储或者说缓存的目的我觉得不是为了加速度(当然有这个效果),而是确保数据安全而用的。

  • 硬盘性能

买来先测一下硬盘的stroke和速度,

diskinfo -ctv /dev/daX
#X为你的硬盘编号,在管理页面的storage/disks下按照序列号对照过去

这是我刚用手机测的一块ST EXOS X16 12T的硬盘,刚好达到230MB的速度,stroke也很棒。西数固件似乎在FREEBSD下有兼容问题。

IMG_2776.PNG

  • 内存是否必须ECC?
    当然最好是ECC了,FreeNas先写入内存再写入硬盘,如果没有ECC的奇偶校验,可能,也许会有写入后文件出错的问题。另一方面,我看到国内很多文章宣称Slog是写缓存,我觉得与我们理解的写缓存差别还是很大的,总而言之,Slog无法让你获得比将硬盘池的sync关闭后更快的速度。老老实实加ECC内存吧,ddr3内存来一斤。

如果你真的很需要多层存储,可以去研究一下这个玩意:Bcache

下一篇