日前重建了以前被玩坏的zfs,碰到几个概念,查了不少资料,理清一下
1、关于硬盘分区表
目前经常使用的有两种分区表,MBR和GPT,可是严格来讲ZFS并不须要任何一种分区表,ZFS能够直接管理裸盘,换句话说,zfs对硬盘有本身的管理方式,不须要通过MBR或者GPT这一层
2、Geom Label和GPT分区表冲突的问题
Geom Label使用glabel命令建立,会被写入到磁盘的最后一个扇区,重启之后不会丢失。可是若是你使用的是GPT分区表,那么会有冲突。GPT分区表会利用磁盘的最后一个扇区来备份GPT分区表头(这个备份表头,直接指向的是备份分区表的数据区)(具体GPT分区表的数据结构,能够参考GUID Partition Table (简体中文)还有GUID Partition Table)。若是在使用GPT分区格式来初始化磁盘之后,再给磁盘设置Geom Label,就会致使GPT的备份分区表出现问题,这个不会致使系统崩溃,可是有数据丢失的危险,由于若是主分区表丢失,那么系统没有办法使用备份分区表的数据来还原。
解决办法是,若是使用GPT分区表后,不要使用geom label,而是直接使用GPT本身的label,以下:
# gpart create -s gpt ad0
# gpart add -t freebsd-zfs -l disk0 /dev/ad0
这样就给设备da0设置了一个label,叫disk0
3、FreeBsd上生成固定设备名的问题
Linux上有udev,经过编写规则,匹配一些硬件的信息,而后只要是相同的硬件信息,就能生成指定的名称。查了一些文档,fb上的devfs也有相似的功能(fb的devfs和linux的devfs不是一回事),是经过devd这个程序作到的,咱们只须要编写devd的规则就能够了。可是,实际操做后,我发现,这个根本没有linux的udev好用。主要是两个问题:php
一、须要先执行devd -d,而后去插拔设备,才能监控到设备的相关信息,linux下面不须要真实的去插拔设备
二、经过devd -d得到的信息少得可怜,devd 规则中,指定的不少变量(好比什么vendor,sernum)的值,都没有出现,这实际致使了根本不能编写对应的规则(我在网上搜索了好久,没有看到相似的信息,我在一开始是按照使用固定设备节点名操做设备这篇文章的介绍来操做的,文章里针对的是打印机,相同的方法我用到个人硬盘上,什么信息都没获得)
由于实在搜索不到相关资料,我只能放弃devd这条路,改成使用geom label的方式。这里为何可使用geom label呢,由于zfs能够直接管理裸盘,不须要GPT之类的分区表,因此geom label和GPT冲突的问题就不存在了,算是柳暗花明又一村。
4、若是使用GPT标签呢?
若是使用GPT标签,那么须要按照上文第二点中描述的进行操做,可是这样,实际就是在硬盘上先建立了gpt的分区,zfs系统以后使用的是gpt分区,而不是直接管理裸盘,性能上会有些差别(oracle的官方文档是建议能裸盘的最好裸盘),因此此路放弃
5、4K对齐的问题
目前的FreeBSD 10.2版本,执行zpool create命令建立出来的存储池,直接就是4K对齐好的,因此不须要再使用额外的方式来绕行了。
检测存储池是否4K对齐,可使用以下命令:
# zdb | grep ashift
若是输出是9就是512字节的扇区,若是是12就是4Klinux