首先强调一点,动态磁盘的LDM数据库中数据存储的字节序都是Big-Endian。
LDM数据库占用动态磁盘最后1MB空间,也就是2048个扇区的大小。下面以LDM数据库的起始扇区为0扇区,来描述LDM数据库的结构,见表4-4。
表4-4 LDM数据库的结构
扇区地址 | 扇区数 | 结构名称 |
---|---|---|
0 | 1 | 总为零 |
1 | 1 | 目录表1(TOCBLOCK) |
2 | 1 | 目录表2(TOCBLOCK) |
17 | 1 | 数据库的配置信息(VMDB) |
18 | 1481 | 数据库的配置记录(VBLK) |
1498 | 224 | 数据库的日志记录(KLOG) |
1856 | 1 | 私有头的第二个备份 |
2045 | 1 | 目录表2的备份 |
2046 | 1 | 目录表1的备份 |
2047 | 1 | 私有头的第一个备份 |
下面再用示意图描述动态磁盘的LDM数据库结构,如图4-107所示。
LDM数据库目录表共有16个扇区大小,一般只用到前两个扇区,第一个扇区为“目录表1”,第二个扇区为“目录表2”。这两个目录表分别在LDM数据库的2045和2046扇区有一个备份。
目录表(TOCBLOCK)的结构见表4-5。
表4-5 目录表(TOCBLOCK)结构
数据库配置信息(VMDB)起始于LDM的17号扇区,占用1个扇区,其中存放关于动态磁盘的总体信息。VMDB的结构见表4-6。
表4-6 VMDB结构
其中,更新状态标志的含义见表4-7。
表4-7 更新状态标志的含义
标志 | 描述 |
---|---|
0x01 | VMDB为连续状态 |
0x02 | VMDB为创建阶段 |
0x03 | VMDB为删除阶段 |
数据库配置记录(VBLK)是128字节定长记录,每一个VBLK项描述一个磁盘组、磁盘、分区、组件或卷。因为动态磁盘只能支持一个磁盘组,所以每一个VBLK项可以是如下四种类型之一:磁盘、分区、组件、卷。
LDM把每一个VBLK项与内部对象的标识符联系到一起。在最低的级别,分区项描述软分区,它是在一个盘上的连续区域。存储在分区项中的标识符把这个项与一个组件和一个磁盘项联系起来。磁盘项代表一个磁盘组中的动态盘,包括磁盘的GUID。组件项像一条链子把一个或多个分区项和与分区相连的卷项联系起来。卷项存放这个卷的GUID、卷的大小和状态、驱动器的名字。比一个数据库记录大的磁盘项占用多个记录的空间,分区项、组件项和卷项很少占用多个记录的空间。
VBLK项所包含的类型及它们之间的关系如图4-108所示。
在动态磁盘内部,每一磁盘、分区、组件和卷都被赋予一个唯一的名称。磁盘组是由Dg0和计算机的名字一起组成的,例如LiuWeiDg0,意味着计算机的名字是LiuWei。磁盘命名为Disk1、Disk2等。磁盘1的分区命名为Disk1-01,Disk1-02等。条带卷命名为Stripe1、Stripe2等。RAID卷命名为Raid1、Raid2等。简单卷、跨区卷和镜像卷命名为Volume1、Volume2等。卷的组件命名为Stripe1-01、Stripe1-02、Raid1-01、Raid1-02、Volume1-01、Volume1-02等。当对象删除时,新对象命名时使用第一个可以使用的低数值的名称。
下面分别看几种卷的例子。
首先是简单卷。这是最简单的一种结构,文件系统占用一个磁盘上的一个分区。其组成结构如图4-109所示。
如果给该简单卷增加一个分区,则卷就升级成跨区卷,其结构如图4-110所示。
镜像卷是把同样的卷信息传递给两个组件、分区和磁盘,组件根本就不修改数据。对于两个以上的分区,可以扩展卷,这样两个组件就都有两个孩子,如镜像跨区卷。给卷增加一个分区,创建第三个镜像段,也就是给卷加入第三个孩子。镜像卷组成结构如图4-111所示。
条带、RAID-5、跨区卷,由组件控制卷信息来处理。对于跨区卷,分区按线性连接到一起,文件系统从第一个分区开始,然后到下一部分即第二个分区,以此类推。
对于条带卷,文件系统将数据分成大小相同的块,通常64KB,第一个块写入第一个分区,第二个块写入第二个分区,直到所有分区,再转到第一个分区。
RAID-5卷的文件系统也将数据分成大小相同的块,它需要至少三个分区,对每组数据有一个块包含有附加的奇偶校验信息,来为卷提供容错能力。
镜像条带和镜像跨区卷有两个组件,分别由条带和跨区卷组成。这种卷可以通过两种方式扩展,增加新的镜像需要两个以上的分区,扩展卷需要四个以上的分区。
镜像跨区卷组成结构如图4-112所示。
每个VBLK都有一个标准的长度为16字节的头部,存储着结构信息。标准VBLK头的结构见表4-8。
表4-8 标准VBLK头结构
字节偏移 | 字段长度(字节) | 字段名和定义 |
---|---|---|
0x00 | 4 | 固定值VBLK |
0x04 | 4 | 序列号 |
0x08 | 4 | 参考号 |
0x0C | 2 | 记录号 |
0x0E | 2 | 记录数 |
VBLK的记录类型可以是0x32(组件)、0x33(分区)、0x34(磁盘)、0x35(磁盘组)或0x51(卷)。
VBLK的数目出现在记录数与记录号中,它是一个基于0的索引。为保持对扩展VBLK跟踪,每组记录都有一个唯一的参考号。扩展VBLK在VMDB中并不一定连续存放。
VBLK的卷结构(0x51)见表4-9。
表4-9 卷结构(0x51)
VBLK的组件结构(0x32)详见表4-10。
表4-10 组件结构(32H)
VBLK的分区结构(0x33)详见表4-11。
表4-11 分区结构(0x33)
VBLK的磁盘结构(0x34)详见表4-12。
表4-12 磁盘结构(0x34)
VBLK的磁盘组命名限制在28个字符以内,磁盘组(0x35)结构详见表4-13。
表4-13 磁盘组(0x35)
修改数据库时,VMDB和KLOG就记录所发生的事件,加入新的VBLK,删除旧的VBLK,并给出一个序列号存储在KLOG中。KLOG的结构见表4-14。
表4-14 KLOG结构