家用万兆FreeNAS组建

介绍

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

现在改名叫TrueNas,并且分支为TrueNas CoreTrueNas Scale。文章里面提及的FreeNasTrueNas Core是一回事。
最近TrueNas的官网好像被污染了,自己找梯子解决=。= https://www.v2ex.com/t/832355

为什么选择FreeNas

  • 硬盘池的可拓展性
  • 数据的安全性
  • ZFS格式
  • 独特的缓存机制
  • 对物理硬盘的感知能力

什么样的用户适合FreeNas?

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

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

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

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

  • 你的内存起码64GB,别慌,这其实不是很贵,比如我也会推荐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元(寨光卡)

  • 机械硬盘:自己看着办

  • 固态硬盘: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模式

ZFS请不要使用阵列模式,因为一旦用了ZFS就无法感知每一个物理硬盘,则data healing等功能是失效的,因此我们需要把这张卡刷成直通的it模式。

如果不刷rom,只刷bin文件,则在TrueNAS系统下输入:

sas2flash -o -f SAS9217_xx_IT.bin   #这个是刷9217的
sas3flash -o -f SAS9300_xx_IT.bin   #这个是刷9300的

刷完后记得重启

如若要刷新Bin和Rom固件,根据流程:

  • 下载如下软件

  • 准备一个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盘根目录。
    • 在同上一个目录复制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就可以用了。
  • LSI的9300系列卡在TrueNAS下对于HGST品牌的硬盘有很严重的性能问题,TrueNas官网出了一个与Broadcom合作的固件,这个固件没有在官网释放,你需要去TrueNAS下载:下载链接

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下输入:
    root@truenas[~] id xjn
    uid=1000(xjn) gid=1000(xjn) groups=1000(xjn),0(wheel),545(builtin_users)

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

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



  • 确定你的目录权限,并且知道他的实际位置

相信你已经在存储页面(storage)下面建立好你的存储池(pool)了,并且建立了自己的datasheet,比如我的Pool叫做Home,并且在Home下建立了一个叫Media的dataset。点击Media最右边的设置按钮,修改权限,我们把这个dataset的权限修改成你自己的用户和组,而不是root。如图:

Screen Shot 2021-08-09 at 11.16.22 PM.png

你可以进入shell里查看自己的池:

cd /mnt
ls
#一般会输出你刚才创建的pool名字,我们这里叫Home
cd Home
ls -l
#输出的是你刚才创建的Media,并应该可以看到这个文件夹的所有人是xjn这个用户


这样就可以记下了我们的Media的实际目录是/mnt/Home/Media
  • 创建一个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 exec myjail pkg update
    iocage exec myjail pkg install -y nano transmission   #在刚才创建的myjail的容器里安装transmission以及nano编辑器


  • 在Jail中创建与主系统相连的文件目录
    我们这里默认刚才得到的下载目录是/mnt/Home/Media 我们需要把主系统的目录和jail下的目录连接起来。

    iocage exec myjail mkdir -p  /mnt/downloads #在myjail下创建一个叫做downloads的文件夹
    iocage fstab -a myjail /mnt/Home/Media /mnt/downloads nullfs rw 0 0 #把主系统的Media与刚才在jail里创建的downloads连接起来。这样的话,到时候transmission下载到这个downloads文件夹,也等同于下载到了我们系统的Media目录下了。


  • 修改安装好的transmission的权限,保持与主系统一致。

因为直接安装的transmission会以root的权限运行,这样的话transmission下载下来的文件的权限都是root所有的,我们这个xjn用户是没有权限编辑它的。因此,我们要用xjn这个账户去运行transmission来保证程序正常运行。

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

iocage exec myjail "pw user add xjn -c xjn -u 1000 -d /nonexistent -s /usr/bin/nologin"
#创建好之后,输入:
iocage exec myjail id xjn
#看一下jail里这个xjn的ID是否跟主系统中的一致

如果你的主系统NAS有多个用户要用,你可以把所用的用户归类到同一个组里去。

我们把transmission的权限交给jail里xjn这个用户:

iocage exec myjail chown -R xjn:xjn /usr/local/etc/transmission
iocage exec myjail chown -R xjn:xjn /mnt/downloads
iocage exec myjail sysrc "transmission_enable=YES"
iocage exec myjail sysrc "transmission_download_dir=/mnt/downloads/"
iocage exec myjail sysrc "transmission_user=xjn"
iocage exec myjail sysrc "transmission_group=xjn"
  • 运行及调试
    做完以上内容,可以运行transmission了
iocage exec myjail service transmission start

不知道为什么,最新的transmission在运行后,要等十几分钟才能进网页端,慢慢等吧,ip地址是你刚才自己设置好的那个,端口号是9091,这个教程里的地址就是:

http://10.10.10.4:9091


你可能需要修改配置文件来符合自己的需求:
iocage console myjail  #登陆你的jail
service transmission stop  #必须先停止transmission的主程序才能修改配置文件
nano /usr/local/etc/transmission/home/settings.json

修改如下两项:

"rpc-whitelist-enabled": false,

"umask": 7,

其他你看情况吧

修改完后+X保存

搞定后输入

service transmission start
exit #退出jail,回到主系统

至此,完成。

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


FreeNas Tuning

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

  • vfs.zfs.dirty_data_max

这个值是脏数据,默认是4GB,这个是内存作为一个缓冲区的大小,单个大文件的话其实没有那么大的区别,但是在小文件为主的写入中,如果缓冲区设置不合理则会导致在高速复制过后机械硬盘IO无法反应导致速度急速下滑。这需要自己去摸索一个比较合理的值,而变量则是这个值以及机械硬盘的实际写入速度(无论是4k或者大文件顺序读写)。

  • vfs.zfs.arc_max

如果不设置的话,默认会用完所有内存作为arc,自己看需求。

MacOS Big Sur后的链接方式

这里分别说一下nfs和smb这两种链接方式吧。MacOS源于Freebsd,在MacOS的文件系统中是很早就开始支持Async multi-threads for NFS的,可以参考一下官网的BSD Overview。对MAC用户来说NFS肯定是连接Freebsd NAS的第一选择。

NFS

但是在Big Sur之后开始NFS莫名其妙就变得非常慢,查阅了很多资料,问题是:

  1. Big Sur 默认的包wsize risze非常小。
  2. MacOS 也许是考虑到了兼容性问题,默认的NFS链接方式是NFS v3,其实我们是可以用v4版本的。

解决这些问题,在Truenas的Service/NFS中最大化CPU数值,比如我的CPU有12个核心,在Number of Servers中填入12,并且打勾Enable NFSv4 & NFSv3 ownership model for NFSv4
Screen Shot 2021-10-02 at 1.53.12 PM.png

最后,在MacOS下修改/etc/nfs.conf,加入如下代码:

nfs.client.allow_async = 1
nfs.client.mount.options = vers=4.0,async,wsize=131072,rsize=131072

修改后,重新挂载nfs生效

你可以在terminal中输入nfsstat -m来检查链接方式是否正确。

MacOS同时挂载一个aysnc以及一个sync的池非常不方便,推荐NFS Manager,或者用自带的Automator来做。



Samba(SMB协议)

看了Big Sur的一些更新记录,苹果在发力优化Samba,我们可以设置一下来优化的。
参考这个文章,可以把这个文件保存到MacOS的/etc/nsmb.conf,并重启MacOS。

另一方面Samba在Freenas下默认只有上传和下载2个线程,并没有办法修改,这样就非常考验单核能力了。事实上,除了服务端用Win Server的SMB好像没有别的办法。除此之外的话开启async io可以在parameters选项卡下面增加如下参数:

aio read size = 1
aio write size = 1

保存即生效。

另外,MacOS 11.3开始支持Samba的multichannel,可以参考官方文档自行设置体验,我没这个条件测试。

一些小问题

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

Slog应只应用于当你连接池时使用sync,是保证你数据绝对能写入,并不是帮你增加速度的,比较适用与金融票据等小文件场景,家用还是配好UPS吧。我看到国内很多文章宣称Slog是写缓存,我觉得与我们理解的写缓存差别还是很大的,总之,Slog无法让你获得比将硬盘池的sync关闭后更快的速度。老老实实加ECC内存吧,ddr3内存来一斤。

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


L2arc的话是你arc不再增长的情况下用的,在arc仍然growing的情况下使用l2arc是完全没有必要的!你可以通过arc_summary命令来观察。
10个7200转的硬盘,raid-z2已经达到万兆顺序读取速度,如果需要大量的4k读取以及随机则另当别论,这方面可以参考Meta-Dev功能。

  • 硬盘性能

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

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

这是我刚用手机测的一块ST EXOS X16 12T的硬盘,刚好达到230MB的速度,stroke也很棒。请尽可能不要购买HGST,太手动挡了,买了后你可能需要刷各种固件以及他们家自己的HUGO软件做很多设置,并且操作比较危险,容易整个盘报废。
TrueNAS官网的Buyer Guide里只推荐WD Red Pro和希捷。WD和HGST对我这样的老用户来说是两个不一样的品牌,现在产品线比较乱我也分不清,真的喜欢西数就买官网推荐的WD Red PRO。
顺便提一下希捷酷狼pro这个系列,我测出来的一些数据完全跟exos x16一模一样,不知道除了酷狼pro提供一次免费数据修复之外,还有啥区别。

IMG_2776.PNG

  • 内存是否必须ECC?
    最近也读了FreeBSD开发者的一些书籍,其实有一些观点是,ZFS比任何一个其他的文件系统都不那么依赖ECC内存,因为ZFS的block本身就具有checksum并通过Geom 实现了data healing。这话不是让你去优先选择非ecc内存的。

  • IO问题

我玩pt的时候老是遇到自己的垃圾mlc缓存盘因为过热,内存写入速度过快或者什么的导致缓存盘io suspend。请尽量确保你的pt缓存池已经打开了auto trim功能。买傲腾当pt下载盘的不需要。

如果你还是碰到io suspend的情况,请先关掉任何有关这个盘的进程。比如先把transmission的jail关了
然后输入:

zpool status #看看你的pt缓存池有没有error,一般会有好多好多。
zpool clear -F pt #我的pt缓存池就叫pt,按你自己情况写
zpool scrub pt  #scrub一下这个池

如果是过热导致的,你还是等他冷一会,或者自己加铜片加风扇什么的。

如果还是不行,使用smartctl查一下盘是不是挂了。

上一篇
下一篇