标签归档:动态磁盘

DiskGenius软件对动态磁盘的支持

    动态磁盘是从Windows 2000开始,为用户准备的一套管理磁盘的方式,它可以通过软件的方式实现部分RAID功能。动态磁盘可以包含大量的动态卷(包括简单卷、跨区卷、带区卷、镜像卷、RAID-5卷)。卷的功能类似于基本磁盘上使用的分区。

    如何知道自己的磁盘是否为动态磁盘呢?通过DiskGenius软件即可判断。DiskGenius软件在显示磁盘名称时,会在动态磁盘的名称后面显示“动态”字样。

    动态卷的类型:

    简单卷(Simple volume): 简单卷是物理磁盘的一部分,但它工作时就好像是物理上的一个独立单元,类似基本磁盘中的“分区”。但是如果是从单个动态磁盘中对现有的简单卷进行扩展后(扩展的部分和被扩展的简单卷在同一个磁盘中),也称之为简单卷。

    跨区卷(Spanned volume): 跨区卷是将来自多个磁盘的空间合并到一个逻辑卷中。这样可以更有效地使用多个磁盘上的空间。跨区卷不能像镜像卷那样提供容错功能。如果包含一个跨区卷的磁盘出现故障,则整个卷将无法工作,且其上的数据都将丢失。

    带区卷(Striped volume): 带区卷是通过将2个或更多磁盘上的可用空间区域合并到一个逻辑卷而创建的。带区卷使用好比RAID-0一样,从而可以在多个磁盘上分布数据。带区卷不能被扩展或镜像,并且不提供容错。

    镜像卷(Mirrored volume): 镜像卷是具有容错能力的卷,它使用卷的两个副本(即镜像)复制存储在卷上的数据,从而提供数据冗余性。写入到镜像卷上的所有数据都写入到位于独立的物理磁盘上的两个镜像中。如果其中一个物理磁盘出现故障,则该故障磁盘上的数据将不可用,但是系统可以使用未受影响的磁盘继续操作。

    RAID-5卷(RAID-5 volume): RAID-5 卷是一种容错卷,并且数据和奇偶校验值在三个或更多的物理磁盘上成交替的带区分布。如果物理磁盘的某一部分失败,可以用余下的数据和奇偶校验重新创建磁盘上失败的那一部分上的数据。对于多数活动由读取数据构成的计算机环境中的数据冗余来说,RAID-5 卷是一种很好的解决方案。

    当电脑上存在动态磁盘时,DiskGenius软件可以自动解析出动态磁盘的结构,显示所有动态分区及卷的信息,并且可以列出卷内的文件。对于物理磁盘上的动态卷,DiskGenius软件打开后就会立即显示,所有“卷”都在左侧的“动态卷”类别中列出。如图所示:

点击查看原图

单一磁盘上的动态分区结构图

加载所有动态磁盘后的分区分布图

识别出的动态卷

    用鼠标选中“动态卷”后,在分区信息窗口会显示如下图所示的动态磁盘结构图。点击某个卷中的任意一个分区,这个卷中的其它连带的所有分区都会自动被选中。这样就能一目了然地看到卷的组成。双击结构图中的分区可以立即打开这个卷,显示卷内的文件目录。

与关联卷相关的分区可以自动选择

    对于虚拟磁盘中的动态磁盘,用DiskGenius打开虚拟磁盘文件后,软件会自动分析其动态磁盘结构。并像普通硬盘一样,会在左侧列出所有“动态卷”。打开虚拟磁盘的方法请参见:操作虚拟硬盘及其分区

    用DiskGenius软件,您可以对动态卷执行格式化文件复制与读写分区文件数据恢复分区备份等操作。具体的操作方法与普通磁盘及分区相同。

    此外,如果用户不小心将基本磁盘转换成了动态磁盘,可以用DiskGenius软件将这种只有简单卷的动态磁盘转换为基本磁盘,这种转换是无损转换,是不会破坏文件数据的。

基本磁盘、动态磁盘、GPT磁盘、MBR磁盘

        Windows磁盘管理器中,在磁盘标签处右击鼠标,随磁盘属性的不同会出现“转换到动态磁盘”,“转换到基本磁盘”“转换成GPT磁盘”,“转换成MBR磁盘”等选项。本文就此做简单介绍。

        基本磁盘与动态磁盘

        磁盘的使用方式可以分为两类:一类是“基本磁盘”。基本磁盘非常常见,我们平时使用的磁盘类型基本上都是“基本磁盘”。“基本磁盘”受26个英文字母的限制,也就是说磁盘的盘符只能是26个英文字母中的一个。因为A、B已经被软驱占用,实际上磁盘可用的盘符只有C~Z 24个。另外,在“基本磁盘”上只能建立四个主分区(注意是主分区,而不是扩展分区);另一种磁盘类型是“动态磁盘”。“动态磁盘”不受26个英文字母的限制,它是用“卷”来命名的。“动态磁盘”的最大优点是可以将磁盘容量扩展到非邻近的磁盘空间。

        动态硬盘,是指在磁盘管理器中将本地硬盘升级得来的。动态磁盘与基本磁盘相比,最大的不同就是不再采用以前的分区方式,而是叫做卷集(Volume),卷集分为简单卷、跨区卷、带区卷、镜像卷、RAID-5 卷。基本磁盘和动态磁盘相比,有以下区别:

        1、卷集或分区数量。动态磁盘在一个硬盘上可创建的卷集个数没有限制。而基本磁盘在一个硬盘上只能分最多四个主分区。

        2、磁盘空间管理。动态磁盘可以把不同磁盘的分区创建成一个卷集,并且这些分区可以是非邻接的,这样的大小就是几个磁盘分区的总大小。基本磁盘则不能跨硬盘分区并且要求分区必须是连续的空间,每个分区的容量最大只能是单个硬盘的最大容量,存取速度和单个硬盘相比也没有提升。

        3、磁盘容量大小管理。动态磁盘允许我们在不重新启动机器的情况下调整动态磁盘大小,而且不会丢失和损坏已有的数据。而基本磁盘的分区一旦创建,就无法更改容量大小,除非借助于第三方磁盘工具软件,比如PQ Magic。

        4、磁盘配置信息管理和容错。动态磁盘将磁盘配置信息放在磁盘中,如果是RAID容错系统会被复制到 其他动态磁盘上,这样可以利用RAID-1的容错功能,如果某个硬盘损坏,系统将自动调用另一个硬盘的数据,保持数据的完整性。而基本磁盘将配置信息存放在引导区,没有容错功能。

        基本磁盘转换为动态磁盘可以直接进行,但是该过程是不可逆的。要想转回基本磁盘,只有把所有数据全部拷出,然后删除硬盘所有分区后才能转回去。

        GPT磁盘与MBR磁盘

        GPT(Globally Unique Identifier Partition Table Format)一种由基于 Itanium 计算机中的可扩展固件接口 (EFI) 使用的磁盘分区架构。与主启动记录 (MBR) 分区方法相比,GPT 具有更多的优点,因为它允许每个磁盘有多达 128 个分区,支持高达 18 千兆兆字节的卷大小,允许将主磁盘分区表和备份磁盘分区表用于冗余,还支持唯一的磁盘和分区 ID (GUID)。

        与支持最大卷为 2 TB (terabytes) 并且每个磁盘最多有 4 个主分区(或 3 个主分区,1 个扩展分区和无限制的逻辑驱动器)的主启动记录 (MBR) 磁盘分区的样式相比,GUID 分区表 (GPT) 磁盘分区样式支持最大卷为 18 EB (exabytes) 并且每磁盘最多有 128 个分区。与 MBR 分区的磁盘不同,至关重要的平台操作数据位于分区,而不是位于非分区或隐藏扇区。另外,GPT 分区磁盘有多余的主要及备份分区表来提高分区数据结构的完整性。

        在运行带有 Service Pack 1 (SP1) 的 Windows Server 2003 的基于 x86 的计算机和基于 x64 的计算机上,操作系统必须驻留在 MBR 磁盘上。其他的硬盘可以是 MBR 或 GPT。

        在基于 Itanium 的计算机上,操作系统加载程序和启动分区必须驻留在 GPT 磁盘上。其他的硬盘可以是 MBR 或 GPT。

在单个动态磁盘组中既可以有 MBR,也可以有 GPT 磁盘。也使用将基本 GPT 和 MBR 磁盘的混合,但它们不是磁盘组的一部分。可以同时使用 MBR 和 GPT 磁盘来创建镜像卷、带区卷、跨区卷和 RAID-5 卷,但是 MBR 的柱面对齐的限制可能会使得创建镜像卷有困难。通常可以将 MBR 的磁盘镜像到 GPT 磁盘上,从而避免柱面对齐的问题。可以将 MBR 磁盘转换为 GPT 磁盘,并且只有在磁盘为空的情况下,才可以将 GPT 磁盘转换为 MBR 磁盘。否则数据将发生丢失!!!

        不能在可移动媒体,或者在与群集服务使用的共享 SCSI 或 Fibre Channel 总线连接的群集磁盘上使用 GPT 分区样式。

动态磁盘 LDM结构

      动态磁盘的结构相对普通分区表会有些复杂,这里贴出LDM的结构代码,仅供编程爱好者参考,如果大家想管理动态磁盘推荐大家使用DiskGenius来管理。

点击查看原图

 

struct privhead {			/* Offsets and sizes are in sectors. */
	u16	ver_major;
	u16	ver_minor;
	u64	logical_disk_start;
	u64	logical_disk_size;
	u64	config_start;
	u64	config_size;
	u8	disk_id[GUID_SIZE];
};

struct tocblock {			/* We have exactly two bitmaps. */
	u8	bitmap1_name[16];
	u64	bitmap1_start;
	u64	bitmap1_size;
	u8	bitmap2_name[16];
	u64	bitmap2_start;
	u64	bitmap2_size;
};

struct vmdb {				/* VMDB: The database header */
	u16	ver_major;
	u16	ver_minor;
	u32	vblk_size;
	u32	vblk_offset;
	u32	last_vblk_seq;
};

struct vblk_comp {			/* VBLK Component */
	u8	state[16];
	u64	parent_id;
	u8	type;
	u8	children;
	u16	chunksize;
};

struct vblk_dgrp {			/* VBLK Disk Group */
	u8	disk_id[64];
};

struct vblk_disk {			/* VBLK Disk */
	u8	disk_id[GUID_SIZE];
	u8	alt_name[128];
};

struct vblk_part {			/* VBLK Partition */
	u64	start;
	u64	size;			/* start, size and vol_off in sectors */
	u64	volume_offset;
	u64	parent_id;
	u64	disk_id;
	u8	partnum;
};

struct vblk_volu {			/* VBLK Volume */
	u8	volume_type[16];
	u8	volume_state[16];
	u8	guid[16];
	u8	drive_hint[4];
	u64	size;
	u8	partition_type;
};

struct vblk_head {			/* VBLK standard header */
	u32 group;
	u16 rec;
	u16 nrec;
};

struct vblk {				/* Generalised VBLK */
	u8	name[64];
	u64	obj_id;
	u32	sequence;
	u8	flags;
	u8	type;
	union {
		struct vblk_comp comp;
		struct vblk_dgrp dgrp;
		struct vblk_disk disk;
		struct vblk_part part;
		struct vblk_volu volu;
	} vblk;
	struct list_head list;
};

struct ldmdb {				/* Cache of the database */
	struct privhead ph;
	struct tocblock toc;
	struct vmdb     vm;
	struct list_head v_dgrp;
	struct list_head v_disk;
	struct list_head v_volu;
	struct list_head v_comp;
	struct list_head v_part;
};