delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

13 Mar 2014

基于Asrock C2750D4I的全加密存储

去年第四季度的时候,在网上看到 华擎科技 推出了一款基于 Intel Atom C2750 SoC 的主板, Asrock C2750D4I,感觉很赞,于是立即和华擎科技取得了联系(当时这款主板还没进入量产),并着手开始了测试等工作。这张主板的重要特色包括:

  • mini-iTX尺寸
  • CPU支持Intel AES-NI,加密加速
  • 提供了两个千兆以太网口
  • 支持ECC内存(更重要的是,采用的是台式机和服务器常见的4x240-pin DDR3 DIMM规格,不像同类产品通常使用的是204-pin的SO-DIMM,这一点可以节省很多成本)
  • 提供了8个SATA III 6.0Gbps接口和4个SATA II 3.0Gbps接口
  • 支持IPMI并提供了独立网口

此处强行插入一条广告: 我厂 目前这一代的 FreeNAS Mini 采用了这张主板,组装好的产品可以通过 Amazon 购买,我厂每年都会将一部分利润捐给 FreeBSD 基金会,如果先 在 smile.amazon.com 注册支持 FreeBSD 基金会,并使用前述链接, Amazon 公司还会再捐出 0.5% 的金额给 FreeBSD 基金会

目前这张主板已经进入了量产阶段,因此也可以从其他零售渠道获得相关组件自行组装。

我厂的出厂配置中,整套系统包括了一个容量为 16GB、预装了最新版 FreeNAS 的 SATA DOM。目前新版的 FreeNAS 已经支持全盘加密,通过其 Web 界面即可完成配置(参见 FreeNAS 手册中关于如何创建加密卷的介绍)。

作为不折腾就会死星人,以及强烈的迫害妄想症患者 为了进一步完善 FreeBSD 对于全盘加密的支持以及为下一代 FreeNAS 版本尝试其他一些选择,我并没有直接使用 FreeNAS,而是改装成了一套我自己补过的 FreeBSD 版本。此外,在对磁盘初始化的过程中也进行了一些调整。

具体来说,在使用全盘加密之前,应首先对裸盘做一次初始化(在其上写满随机数)。写随机数的目的是在磁盘被人物理地拿到的时候,对方在没有密钥的情况下将无法知道某个具体的扇区是否存在加密数据。FreeBSD 的 geli(4) 手册上建议在 GELI provider 上写随机数,但是由于我们并不使用 GELI 的 checksum 能力,因此实际上直接在裸盘上写随机数就可以了。

FreeNAS 目前版本的做法是用 dd 在裸盘上写 /dev/random 的数据。这样做本身并没有太大的问题,但是很慢,根据我的计算,4块4TB (WD Red)的硬盘完成初始化需要将近两天的时间。显然,花些时间改进初始化流程是十分必要的,于是我对 libc 中的 arc4random(3) 进行了一些改进,然后写了一个简单的多线程 producer-consumer 程序,这样第二天起床的时候初始化就完全做好了(具体代码将在稍后集成进 FreeNAS)。

目前 FreeBSD 提供了以磁盘序号作为标签的能力(/dev/diskid/*)。因此,直接在初始化后的磁盘上建立 GELI provider,这样当盘位变化时不致影响 GELI 的解密;此外,密钥直接放在一个USB盘上,在其上建立一个GPT分区(放上4KB随机数),这样在系统启动时插上,启动脚本检测到其存在即开始解密磁盘,之后将其拔下即可。保险起见,我做了两个USB盘分别保存用于解密 GELI 两个密钥槽中的两个不同的密钥。

由于民用硬盘的尺寸可能略有不同,因此我在 GELI provider 上也建立了 GPT 分区,并留出了最后大约1GB的空间作为缓冲,以备将来出现硬盘损坏时找不到更大的替换硬盘时使用。(使用最后部分作为缓冲区的原因是在初始化过程中发现靠后的部分性能较差)。

这个存储上采用的 ZFS 有一些尚未提交的改进,例如采用 LZ4 作为默认的元数据压缩算法,等等。此外,我采用了 sha256 而不是默认的 fletcher4 作为 checksum,虽然这样性能会稍微有些影响,但它可以改善send dedup的性能,由于这台机器只有两个千兆口,因此 CPU 也不致成为性能瓶颈。


Archived: 11 Comments

mine260309 | March 13, 2014 10:31 PM

正想说/dev/random会block,因为涉及到entropy pool这么个东东。
后来一查wiki发现FreeBSD的/dev/random本质上就是Linux的/dev/urandom,好吧,又学到东西了。。。

iget.myopenid.com | March 13, 2014 10:51 PM

感谢分享,期待更新。有三个问题问一下:
1、FreeNAS下能跑VirtualBOX吗?内存够的话,这东西起win虚拟机挂程序很不错呀!
2、这主板支持64G内存啊,怎么16T只配了16G内存?不够用吧。
3、记得你以前介绍过,推荐2^x + raidzX。就是raidz2推荐用6块盘或者10块盘做,不推荐用8块盘来做。那这个8盘位做哪种合适啊?

iget.myopenid.com | March 13, 2014 11:06 PM

不会数数了,主板上是12个SATA,抱歉问错了。可是你们厂就提供了4个盘位啊!是不是有点瘦啊?
:P

Xin LI replied to comment from mine260309 | March 14, 2014 10:49 AM

wiki上说的不完全对(比如硬件RNG只是作为entropy源之一而不是替代Yarrow),等我有时间的时候去改改……

Xin LI replied to comment from iget.myopenid.com | March 14, 2014 11:06 AM

  1. 目前没有,但是自行安装不是问题。未来版本可能会不再支持VirtualBox(由于会采用BHyVe)。

  2. 我是做家用存储,没有很高的性能要求(另外反正已经可以跑慢两张千兆卡了,再高也没用),又没打算做dedup(也没有配SSD),因此没太大必要配64GB内存。

实际测试,目前的16GB内存跑上两个VM还是有富裕的。我目前的配置是8Gx2,因此如果真的有需要的话可以继续增加8Gx2达到32GB。

  1. 目前配置可以跑满两张千兆网卡。如果RAID-Z2的话,推荐用6或10块盘来做。

我们目前选择的机箱提供的电源带动不了更多的硬盘,另外配8块或10块硬盘也会有散热等更复杂的问题。此外,这个主板最多可以接8块SATA III的硬盘,而设计中还有一个SATA DOM(也许可以接到SATA II口上),因此选机箱的话很可能是最多8个盘位的,再多了也没地方接了;假如允许接SAS HBA卡的话,这个机器可以外挂一个甚至多个JBOD,但我个人不会考虑这种方案(因为如果真有这么大的存储需求的话,我会考虑直接弄一台3-4U的机架式服务器扔到车库去)。

如果有兴趣的话,Sans Digital以及许多其他供应商都有小型SAS JBOD提供,价格还算合理。

howard0su | March 21, 2014 1:12 AM

如果RAID-Z2的话,推荐用6或10块盘来做。

为什么不推荐4块盘呢?是性价比还是技术的原因?

Xin LI replied to comment from howard0su | March 21, 2014 2:11 AM

4塊盤RAID-Z2只是在發生故障的恢復的機會比RAID-10略好(任意兩塊 vs 每組各一塊),但是性能會差很多。

另一方面,WD硬盤的壞損率大約是不到4%(來源: http://blog.backblaze.com/2014/01/21/what-hard-drive-should-i-buy/),也就是說4塊硬盤中平均6.25年會出現一塊壞盤。我認為這個風險是可以接受的。假如是10塊盤的話,出現至少一塊壞盤的時間就變成了2.5年,風險要高許多,自然也就需要更大的冗餘度來因應。總體而言我認為4塊盤做RAID-Z2有些overkill了,而性能方面也有些得不償失。

howard0su | March 21, 2014 6:49 AM

多谢。了解了。我这次买4块WD的蓝盘,到货两块是坏的,当时脑子一热就做了Z2.不过家用存照片和视频的,性能倒要不计较,数据也不多。4块硬盘最好1.8T也够我用一段时间了。

macafee | March 26, 2014 5:19 AM

定了块类似的SUPERMICRO A1SAM-2750F板子回家搭存储,不过好像没有16G ECC单条的条子,目前只有8GB的。

xjflyttp | April 12, 2014 7:35 AM

今天看了blog才知道有smile.amazon.com~

CH Chong | October 16, 2014 2:25 PM

买了新币450大洋。 装了freebsd,做了一些测试。
基本上我还算幸运, 在国外很多人有stability issue。都做了RMA回去了。

装了16GB ram + WD red 6 * 3TB。 只可惜的是zfs还没有persistent L2ARC。 算了。

基本上这个主板不错,用电量很低。拿来做NAS一流。
希望下一代可以有Intel VT-D,我很需要这个东西。