介绍
我是一个很忠实的NAS用户,并且使用了FreeNas很多年,一直很稳定好用,也很想推荐给大家使用,就打算写这篇文章了。
现在改名叫
TrueNas
,并且分支为TrueNas Core
和TrueNas Scale
。文章里面提及的FreeNas
与TrueNas 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,应该是一个类似如下的界面:
如果你无法进入,提示错误,考虑一下升级主板bios以及确认主板是否支持UEFI启动,以及关闭主板的secure boot。
在界面上你会看到检测出来的硬盘,确认哪个是你的U盘,进入那个U盘则输入
fs0:
接着输入
dir
,看看目录下的文件是否是U盘里之前放的,不是的话退出去,再找别的路径进来。
- 刷入固件
- 进入U盘根目录后,输入sas2flash.efi -listall,确保你的卡被识别出来(图片我随便找的,跟你的卡数值可能不同)。
- 如果找不到这张卡,请确认这张卡是完好的,在bios设置界面中也能看到。
- 输入
sas2flash.efi -list
,记录下16位SAS Address (图片也是网上找的,可能不同,红色框内的所有东西都记下来!!!!!!!). - 输入
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。如图:
你可以进入shell里查看自己的池:
cd /mnt
ls
#一般会输出你刚才创建的pool名字,我们这里叫Home
cd Home
ls -l
#输出的是你刚才创建的Media,并应该可以看到这个文件夹的所有人是xjn这个用户
这样就可以记下了我们的Media的实际目录是/mnt/Home/Media
- 创建一个jail
我们创建一个叫做myjail的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"
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莫名其妙就变得非常慢,查阅了很多资料,问题是:
- Big Sur 默认的包wsize risze非常小。
- MacOS 也许是考虑到了兼容性问题,默认的NFS链接方式是NFS v3,其实我们是可以用v4版本的。
解决这些问题,在Truenas的Service/NFS中最大化CPU数值,比如我的CPU有12个核心,在Number of Servers中填入12,并且打勾Enable NFSv4
& NFSv3 ownership model for NFSv4
最后,在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提供一次免费数据修复之外,还有啥区别。
- 内存是否必须ECC?
最近也读了FreeBSD开发者的一些书籍,其实有一些观点是,ZFS比任何一个其他的文件系统都不那么依赖ECC内存,因为ZFS的block本身就具有checksum
并通过Geom 实现了data healing
。这话不是让你去优先选择非ecc内存的。
- ZFS是什么?
有一篇图文并茂的文章,可以看看:Understanding ZFS storage and performance
- 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查一下盘是不是挂了。