关于ZFS、GPT、4K、Geom Label的一些说明
日前重建了之前被玩坏的zfs,碰到几个概念,查了很多资料,理清一下
一、关于硬盘分区表
目前常用的有两种分区表,MBR和GPT,但是严格来说ZFS并不需要任何一种分区表,ZFS可以直接管理裸盘,换句话说,zfs对硬盘有自己的管理方式,不需要经过MBR或者GPT这一层
二、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
三、FreeBsd上生成固定设备名的问题
Linux上有udev,通过编写规则,匹配一些硬件的信息,然后只要是相同的硬件信息,就能生成指定的名称。查了一些文档,fb上的devfs也有类似的功能(fb的devfs和linux的devfs不是一回事),是通过devd这个程序做到的,我们只需要编写devd的规则就可以了。但是,实际操作后,我发现,这个根本没有linux的udev好用。主要是两个问题:
1、需要先执行devd -d,然后去插拔设备,才能监控到设备的相关信息,linux下面不需要真实的去插拔设备
2、通过devd -d获得的信息少得可怜,devd 规则中,指定的很多变量(比如什么vendor,sernum)的值,都没有出现,这实际导致了根本不能编写对应的规则(我在网上搜索了很久,没有看到类似的信息,我在一开始是按照使用固定设备节点名操作设备这篇文章的介绍来操作的,文章里针对的是打印机,相同的方法我用到我的硬盘上,什么信息都没得到)
因为实在搜索不到相关资料,我只能放弃devd这条路,改为使用geom label的方式。这里为什么可以使用geom label呢,因为zfs可以直接管理裸盘,不需要GPT之类的分区表,所以geom label和GPT冲突的问题就不存在了,算是柳暗花明又一村。
四、如果使用GPT标签呢?
如果使用GPT标签,那么需要按照上文第二点中描述的进行操作,但是这样,实际就是在硬盘上先创建了gpt的分区,zfs系统之后使用的是gpt分区,而不是直接管理裸盘,性能上会有些差异(oracle的官方文档是建议能裸盘的最好裸盘),所以此路放弃
五、4K对齐的问题
目前的FreeBSD 10.2版本,执行zpool create命令创建出来的存储池,直接就是4K对齐好的,所以不需要再使用额外的方式来绕行了。
检测存储池是否4K对齐,可以使用如下命令:
# zdb | grep ashift
如果输出是9就是512字节的扇区,如果是12就是4K