ZFS做/是个好主意吗?
一段时间之前我曾经和很多人讨论过使用ZFS作为/的可能性。现在看来,这个也未必真就是一个很好的主意。
目前FreeBSD 8-CURRENT已经完全支持从ZFS启动了(换言之,连 /boot 也不需要了),方法是透过 GPT 分区(我最近MFC了最后一套gpart的补丁回7-STABLE,gpart将在7.1-RELEASE中以一种可用的形式出现)的gptboot。简单地说,配合ZFS v13和支持ZFS的gptboot,FreeBSD就可以从ZFS启动了。针对RAID-Z和RAID-Z2的支持也在计划中。
但是,我认为现阶段使用ZFS做/仍然是风险相当大的事情。
有几个比较重要的原因。当然首先最重要的原因是ZFSboot目前不支持RAID-Z或RAID-Z2,对典型的ZFS用例(使用单盘而非在RAID卷上创建ZPOOL)来说这显然是不适合的,然后是ZFS作为/的时候,所有直接在/文件系统上的内容是无法通过其快照功能回滚的(题外话,FreeBSD内核处在以/dev为/的时候,如果使用一些不好的hack是可以做到的,也就是说告诉人家说回滚到某个快照即将完成,请重新启动系统,然后在重启过程中做)。如果做系统的时候不知道这件事,以后用起来就会比较麻烦,而另一方面,实际上/需要回滚的机会,除了使用开发版本的纯爷们们之外,似乎也不是很大。
因此,目前来说ZFSboot主要的作用是省掉笔记本上1-2GB的UFS /boot的容量。但其实即使是这样也会有问题—-我们一般希望使用尽可能少的东西去恢复系统,比如说,你可能不希望在笔记本硬盘出现问题的时候还要手忙脚乱地刻张光盘出来……假如/是ZFS,那么除非它是另外一个zpool(这个是Sun的最佳实践推荐的),要不然recoverdisk的时候就需要从活动的FS上去复制数据,很明显,这样做可能导致复制出来的数据是坏的。而假如/是一个单独的zpool,又会面临另一个问题—-ZFS是一个仍然在开发过程中的文件系统,内核升级的时候,是否做upgrade?如果upgrade之后起不来怎么办?另一方面,嵌入GPT boot分区的那个ZFSboot很可能不认识新版的ZFS,这些都会是问题。
这样,至少在现在,看起来保留包含/boot、/etc这些部分的/,然后将ZFS作为存储挂到/var、/usr/local这些地方是更好的做法。在多盘系统上,则可以将/复制出来两份存在另一块磁盘上,以实现容灾。而在其他硬盘上可以将/的容量分给交换区或者ZIL,以确保所有硬盘上的RAID-Z[2]分片尺寸一致。