LDM详解

LDM详解管理动态磁盘的子系统是 LDM 与 MS DOS 分区 即上节所探讨的基本分区 不同 LDM 有专门的数据库记录在动态磁盘的最后 1MB 中 所以要基本盘转动态盘的话要记得留有足够空间 LDM 子系统很大程度上提高了容错性 并且可以支持最多 2000 个卷 并且允许卷存在于不同的磁盘上 我们在动态磁盘中是对卷进行管理 而不是分区 这里要记住 卷分为简单卷 simplevolume 跨区卷 spannedvol

管理动态磁盘的子系统是LDM,与MS-DOS分区(即上节所探讨的基本分区)不同,LDM有专门的数据库记录在动态磁盘的最后1MB中,所以要基本盘转动态盘的话要记得留有足够空间

LDM子系统很大程度上提高了容错性,并且可以支持最多2000个卷,并且允许卷存在于不同的磁盘上。我们在动态磁盘中是对卷进行管理,而不是分区,这里要记住。卷分为简单卷(simple volume),跨区卷(spanned volume),带区卷(striped volume)。这里跨区卷顾名思义,可以扩展到另一个磁盘上,而带区卷的读写性能最佳,它将数据平均的分给磁盘的带区卷上,效率提高了几倍,大概类似于RAID-0(对RAID不了解的可以移步我转载的那篇博客上)。

动态磁盘结构图

0扇区

然后跳到offset为0xc20的地方,前面的地方不是很重要我们就不分析了,有兴趣的可以去msdn上找一找。0xc20这里表示私有头的第一备份地址,这里是0x7FF扇区。后面的8个字节是私有头的第二备份地址,这里是0x740扇区。

接下来三组每个64字节,分别表示磁盘ID主机ID磁盘组ID,后面的一个32字节该磁盘组的名字

然后我们跳到0xD1B这里,这里表示逻辑磁盘的起始地址,这里是0x3F。后面的一个八字节表示该逻辑磁盘的size,这里是0x13FE59A。可以看出这里已经扩展到8个字节了,也就是2PB的大小,可以表示的空间非常非常大了,足够满足现有的状况。

然后接着是LDM数据库的位置,这里是0x13FF800,后面一个是LDM数据库的size,这里是0x800。
接着是TOC的数目,这里是1,下面一个则是TOC的size,这里是0x7FE。(TOC全称是table of content 我查了好久…百度居然木得,可以理解为是目录表,最重要的是记录着两个表的总体信息)
最后是日志和配置的相关信息。顺序依次是配置信息数量,这里为1,日志数量,这里为1,配置信息的大小,这里为0x5c9字节大小,日志大小,这里为0xE0大小(好奇为啥不一个数量后面接一个size,真的好奇怪,明明前面都是这样的格局)。




template "LDM Table of content Block" description "LDM Table of content Block" applies_to disk sector-aligned requires 0x00 "54 4F 43 42 4C 4F 43 4B" big-endian read-only hexadecimal begin { 
    char [8] "Signature:TOCBLOCK" hex 4 "Sequence number" hex 4 "Zeros" hex 4 "Sequence Number (2)" hex 16 "Zeros" char [8] "Bitmap Name" hex 2 "Bitmap Flags 1" int64 "Bitmap Start (in Sectors)" int64 "Bitmap Size (in Sectors)" hex 8 "Bitmap Flags 2" char [8] "Bitmap Name" hex 2 "Bitmap Flags 1" int64 "Bitmap Start (in Sectors)" int64 "Bitmap Size (in Sectors)" hex 8 "Bitmap Flags 2" } end 

仍然需要制作模板

VMDB信息

template "LDM VMDB Block" description "LDM VMDB Block" applies_to disk sector-aligned requires 0x00 "56 4D 44 42" read-only big-endian hexadecimal begin { 
    char [4] "Signature:VMDB" uint32 "Sequence Number of last VBLK" uint32 "Size of VBLK" uint32 "Offset to first VBLK" uint16 "Update Status" hex 2 "Version Major (Always 0x04)" hex 2 "Version Minor (Always 0x0A)" char [31] "Disk Group Name (string, null padded)" hex 64 "Disk Group Id GUID (string, null padded)" int64 "Committed Sequence" int64 "Pending Sequence" uint32 "Number of Committed Volume VBLKs" uint32 "Number of Committed Component VBLKs" uint32 "Number of Committed Partition VBLKs" uint32 "Number of Committed Disk VBLKs" hex 12 "Unused" uint32 "Number of Pending Volume VBLKs" uint32 "Number of Pending Component VBLKs" uint32 "Number of Pending Partition VBLKs" uint32 "Number of Pending Disk VBLKs" hex 12 "Unused" filetime "Last Accessed Time" } end 

在这里插入图片描述
固定值VMDB开头,VBLK的个数是0x1724个,代表着VMDB后面的VMLK(配置记录)的数量是这么多,每个VMLK的一般来说是128字节大小,也就是0x80大小,OffsetToFirstVBLK是VBLK相对于VMDB的字节偏移,这里是512字节,也就是VMDB占了一个扇区的大小,DiskGroupName磁盘组名,一般是你的计算机名+Dgx(x从1开始标)。
比较重要是下面的四项




  1. Number of Committed Volume VBLKs //提交的卷记录
  2. Number of Committed Component VBLKs //提交的组件记录
  3. Number of Committed Partition VBLKs //提交的分区记录
  4. Number of Committed Disk VBLKs //提交的磁盘记录
    之所以会有这四项,是因为一个卷的建立并不是只有一个卷记录而已的,不同的卷类型有着不同的逻辑结构用以尽可能详细的描述该卷的信息,其中v代表volume,c代表component,p代表partition,d代表disk。
    简单卷
    简单卷






跨区卷:
在这里插入图片描述

镜像卷
在这里插入图片描述

镜像跨区卷
在这里插入图片描述

struct Vblk { 
    uint8_t magic[4]; uint32_t sequenceNumber; uint32_t groupNumber; uint16_t recordNumber; uint16_t numberOfRecords; uint16_t updateStatus; uint8 types; uint8 flags uint32_t length; uint8_t otherData; //动态结构,大小视类型而定,这里仅用uint8代表之后有不定字节 }; 

magic是一个固定的ASCII值“VBLK”,sequenceNumber表示是配置记录的第几个,这是从4开始编制的,因为VMDB占了0-3。NumberOfRecords是所占的记录数,因为有时一个128字节并不能完全表示除某个类型的特征。flags是一个很重要的标志,用于标识这个是什么类型。otherData则是代表了后面的动态结构,具体我会再下面讲。

flags的不同取值 组件的VBLK:0x32 分区的VBLK:0x33 磁盘的VBLK:0x34 磁盘组的VBLK:0x35 卷的VBLK:0x51 

重点关注它的对象ID,磁盘ID是403,磁盘名是Disk1,全局ID是c0cfb0bc-a5b6-43c9-a170-7052ee

这块分区的对象ID是40A,名称为Disk1-01,动态磁盘的扇区相对位置为0,这个的绝对扇区地址应该为63,卷偏移为0,说明是这个简单卷的第一个分区,若卷偏移不是0,说明有扩展卷的存在父对象的组件ID是408,磁盘对象ID是403,这个403正是我们我们这块磁盘的ID。所以到这里,我们不难看出,LDM区分不同的部件是根据对象ID来的,所以每个部件的对象ID是一个独特的ID值,并且非常重要。
继续往下查找该卷的组件
flags的值为0x32,表明是一个组件。
在这里插入图片描述






最后给出卷,分区,组件,磁盘,VBLK头的模板,仅供参考,template标明这是啥,记得别看错,模板识别是根据现在的光标位置进行选择的

template "LDM VBLK Header" description "LDM VBLK Header" applies_to disk multiple requires 0x00 "56 42 4C 4B" big-endian begin { 
    char [4] "Signature:VBLK" hexadecimal uint32 "Sequence Number" hexadecimal uint32 "Group Number" hexadecimal uint16 "Record Number " hexadecimal uint16 "Number of Records" hexadecimal uint16 "Update Status" hexadecimal uint8 "Type" hexadecimal uint8 "Flags" hexadecimal uint32 "Length" move 104 } end 
template "动态磁盘 VBLK组件结构 0x32" description "VBLK,组件结构" big-endian applies_to disk requires 0x0 "56 42 4C 4B" requires 0x13 "32" begin char[4] "标志" hexadecimal uint32 "序列号" hexadecimal uint32 "参考号" hexadecimal uint16 "记录号" hexadecimal uint16 "记录数" section "组件结构(0x32)" hexadecimal uint24 "更新状态" hex 1 "记录类型和标志" hexadecimal uint32 "数据长度" uint8 "对象ID长度" //用ID长度来控制对象ID内容 IfEqual "对象ID长度" 1 hexadecimal int8 "对象ID" endif IfEqual "对象ID长度" 2 hexadecimal int16 "对象ID" endif IfEqual "对象ID长度" 3 hexadecimal int24 "对象ID" endif IfEqual "对象ID长度" 4 hexadecimal int32 "对象ID" endif //判断结束 uint8 "名称长度" char[名称长度] "名称" uint8 "卷状态(活动)长度" char[卷状态(活动)长度] "卷状态(活动)" hexadecimal uint8 "组件类型(1为条带,2为基本或跨区),3为RAID" hex 4 "0值" uint8 "子组件数量长度" IfEqual "子组件数量长度" 1 hexadecimal int8 "子组件数量" endif IfEqual "子组件数量长度" 2 hexadecimal int16 "子组件数量" endif IfEqual "子组件数量长度" 3 hexadecimal int24 "子组件数量" endif IfEqual "子组件数量长度" 4 hexadecimal int32 "子组件数量" endif hexadecimal int64 "日志提交ID" hex 8 "0值" uint8 "父ID(卷)长度" IfEqual "父ID(卷)长度" 1 hexadecimal int8 "父ID(卷)" endif IfEqual "父ID(卷)长度" 2 hexadecimal int16 "父ID(卷)" endif IfEqual "父ID(卷)长度" 3 hexadecimal int24 "父ID(卷)" endif IfEqual "父ID(卷)长度" 4 hexadecimal int32 "父ID(卷)" endif hex 1 "0值" uint8 "条带大小长度" IfEqual "条带大小长度" 1 hexadecimal int8 "条带大小" endif IfEqual "条带大小长度" 2 hexadecimal int16 "条带大小" endif IfEqual "条带大小长度" 3 hexadecimal int24 "条带大小" endif IfEqual "条带大小长度" 4 hexadecimal int32 "条带大小" endif uint8 "条带数量长度" IfEqual "条带数量长度" 1 hexadecimal int8 "条带数量" endif IfEqual "条带数量长度" 2 hexadecimal int16 "条带数量" endif IfEqual "条带数量长度" 3 hexadecimal int24 "条带数量" endif IfEqual "条带数量长度" 4 hexadecimal int32 "条带数量" endif end 
template "动态磁盘 VBLK卷结构 0x51" description "VBLK,卷结构" big-endian applies_to disk requires 0x0 "56 42 4C 4B" requires 0x13 "51" begin char[4] "标志" hexadecimal uint32 "序列号" hexadecimal uint32 "参考号" hexadecimal uint16 "记录号" hexadecimal uint16 "记录数" section "卷结构(0x51)" hexadecimal uint24 "更新状态" hex 1 "记录类型和标志" hexadecimal uint32 "数据长度" uint8 "ID长度" //用ID长度来控制对象ID内容 IfEqual "ID长度" 1 hexadecimal int8 "对象ID" endif IfEqual "ID长度" 2 hexadecimal int16 "对象ID" endif IfEqual "ID长度" 3 hexadecimal int24 "对象ID" endif IfEqual "ID长度" 4 hexadecimal int32 "对象ID" endif //判断结束 uint8 "名称长度" char[名称长度] "名称" uint8 "应用类型长度" char[应用类型长度] "应用类型" hex 1 "0值" char[14] "卷状态(活动)" hexadecimal uint8 "卷类型(3为普通,4为RAID)" hexadecimal uint8 "总是1" hexadecimal uint8 "卷数量" hex 3 "0值" hex 1 "标志(0x11为普通,0x13为RAID)" hexadecimal uint8 "子单元数长度" hexadecimal uint8 "子单元数" hexadecimal int64 "日志提交ID" hexadecimal int64 "ID" uint8 "大小长度" IfEqual "大小长度" 1 hexadecimal int8 "大小" endif IfEqual "大小长度" 2 hexadecimal int16 "大小" endif IfEqual "大小长度" 3 hexadecimal int24 "大小" endif IfEqual "大小长度" 4 hexadecimal int32 "大小" endif hex 4 "0值" hex 1 "分区类型" hex 16 "卷GUID" uint8 "ID1长度" char[ID1长度] "ID1(驱动器号)" uint8 "ID2长度" char[ID2长度] "ID2(驱动器号)" end 
template "动态磁盘 VBLK分区结构 0x33" description "VBLK,分区结构" big-endian applies_to disk requires 0x0 "56 42 4C 4B" requires 0x13 "33" begin char[4] "标志" hexadecimal uint32 "序列号" hexadecimal uint32 "参考号" hexadecimal uint16 "记录号" hexadecimal uint16 "记录数" section "分区结构(0x33)" uint24 "更新状态" hex 1 "记录类型和标志" hexadecimal uint32 "数据长度" uint8 "对象ID长度" //用ID长度来控制对象ID内容 IfEqual "对象ID长度" 1 hexadecimal int8 "对象ID" endif IfEqual "对象ID长度" 2 hexadecimal int16 "对象ID" endif IfEqual "对象ID长度" 3 hexadecimal int24 "对象ID" endif IfEqual "对象ID长度" 4 hexadecimal int32 "对象ID" endif //判断结束 uint8 "名称长度" char[名称长度] "名称" hex 4 "0值" hexadecimal int64 "日志提交ID" hexadecimal int64 "起始位置" hexadecimal int64 "卷偏移" uint8 "大小长度" IfEqual "大小长度" 1 hexadecimal int8 "大小" endif IfEqual "大小长度" 2 hexadecimal int16 "大小" endif IfEqual "大小长度" 3 hexadecimal int24 "大小" endif IfEqual "大小长度" 4 hexadecimal int32 "大小" endif uint8 "父对象ID(组件)长度" IfEqual "父对象ID(组件)长度" 1 hexadecimal int8 "父对象ID(组件)" endif IfEqual "父对象ID(组件)长度" 2 hexadecimal int16 "父对象ID(组件)" endif IfEqual "父对象ID(组件)长度" 3 hexadecimal int24 "父对象ID(组件)" endif IfEqual "父对象ID(组件)长度" 4 hexadecimal int32 "父对象ID(组件)" endif uint8 "磁盘对象ID长度" IfEqual "磁盘对象ID长度" 1 hexadecimal int8 "磁盘对象ID" endif IfEqual "磁盘对象ID长度" 2 hexadecimal int16 "磁盘对象ID" endif IfEqual "磁盘对象ID长度" 3 hexadecimal int24 "磁盘对象ID" endif IfEqual "磁盘对象ID长度" 4 hexadecimal int32 "磁盘对象ID" endif int64 "组件部分的索引" end 
template "动态磁盘 VBLK磁盘组结构 0x35" description "VBLK,磁盘组结构" big-endian applies_to disk requires 0x0 "56 42 4C 4B" requires 0x13 "35" begin char[4] "标志" hexadecimal uint32 "序列号" hexadecimal uint32 "参考号" hexadecimal uint16 "记录号" hexadecimal uint16 "记录数" section "磁盘组结构(0x35)" hexadecimal uint24 "更新状态" hex 1 "记录类型和标志" hexadecimal uint32 "数据长度" uint8 "对象ID长度" //用ID长度来控制对象ID内容 IfEqual "对象ID长度" 1 hexadecimal int8 "对象ID" endif IfEqual "对象ID长度" 2 hexadecimal int16 "对象ID" endif IfEqual "对象ID长度" 3 hexadecimal int24 "对象ID" endif IfEqual "对象ID长度" 4 hexadecimal int32 "对象ID" endif //判断结束 uint8 "名称长度" char[名称长度] "名称" uint8 "磁盘组ID长度" char[磁盘组ID长度] "磁盘组ID" hex 4 "0值" int64 "日志提交ID" uint8 "可选域1长度" IfEqual "可选域1长度" 1 hex 1 "可选域1" endif IfEqual "可选域1长度" 2 hex 2 "可选域1" endif IfEqual "可选域1长度" 3 hex 3 "可选域1" endif IfEqual "可选域1长度" 4 hex 4 "可选域1" endif uint8 "可选域2长度" IfEqual "可选域2长度" 1 hex 1 "可选域1" endif IfEqual "可选域2长度" 2 hex 2 "可选域1" endif IfEqual "可选域2长度" 3 hex 3 "可选域1" endif IfEqual "可选域2长度" 4 hex 4 "可选域1" endif end 
template "动态磁盘 VBLK磁盘结构 0x34" description "VBLK,磁盘结构" big-endian applies_to disk requires 0x0 "56 42 4C 4B" requires 0x13 "34" begin char[4] "标志" hexadecimal uint32 "序列号" hexadecimal uint32 "参考号" hexadecimal uint16 "记录号" hexadecimal uint16 "记录数" section "磁盘结构(0x34)" hexadecimal uint16 "更新状态" hexadecimal uint16 "记录类型和标志" hexadecimal uint32 "数据长度" hexadecimal uint8 "对象ID长度" IfEqual "对象ID长度" 1 hexadecimal int8 "对象ID" endif IfEqual "对象ID长度" 2 hexadecimal int16 "对象ID" endif IfEqual "对象ID长度" 3 hexadecimal int24 "对象ID" endif IfEqual "对象ID长度" 4 hexadecimal int32 "对象ID" endif uint8 "名称长度" char[名称长度] "名称" uint8 "磁盘ID长度" char[磁盘ID长度] "磁盘ID" uint8 "预备名称长度" char[预备名称长度] "预备名称" hex 4 "0值" hexadecimal int64 "日志提交ID" end 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/198866.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午2:19
下一篇 2026年3月26日 下午2:19


相关推荐

  • Android滑动解锁功能实现,Android_滑动解锁

    Android滑动解锁功能实现,Android_滑动解锁1.滑动解锁代码流程图:流程图图片资源:https://pan.baidu.com/s/1tkcw0tdxV78mnwHqOtcAGg提取码:2xsq2.代码:xml文件:xmlns:app=”http://schemas.android.com/apk/res-auto”xmlns:tools=”http://schemas.android.com/tools”android:layout_wi…

    2022年6月29日
    42
  • select top 用法

    select top 用法access:selecttop(10)*fromtable1where1=1 db2:selectcolumnfromtablewhere1=1fetchfirst10rowsonly 取第三行到第5行的记录select*from(selectrow_number() over()asrowfromtable)ast

    2022年7月13日
    38
  • Matlab系列教程_数值计算_求方差和标准差

    Matlab系列教程_数值计算_求方差和标准差首先 什么是方差和标准差 方差 是在概率论和统计方差衡量随机变量或一组数据时离散程度的度量 统计中的方差 样本方差 是每个样本值与全体样本值的平均数之差的平方值的平均数 在许多实际问题中 研究方差即偏离程度有着重要意义 标准差 中文环境中又常称均方差 是离均差平方的算术平均数的平方根 标准差是方差的算术平方根 标准差能反映一个数据集的离散程度 平均数相同的两组数据 标准差未必相同

    2026年3月18日
    1
  • 运行react项目命令(react项目怎么启动)

    进入目录,按住shift键,在此处打开命令窗口输入:npmstart会弹出localhost:3000,的浏览器窗口打包项目:npmrunbuild

    2022年4月12日
    1.2K
  • 大数据时代来临,数据应用随处可见吗_随着大数据时代的来临

    大数据时代来临,数据应用随处可见吗_随着大数据时代的来临序:大数据之所以可能成为一个时代,在很多程度上是因为这是一个可以由社会各界广泛参与,八面出击,处处结果的社会运动,而不仅仅是少数专家学者的研究对象。数据产生于各行各业,这场变革也必将影响到各行各业,因此,机遇也蕴含于各行各业。致力于IT创业的人们紧紧盯着这个市场,洞察着每一个机遇。数据对于科学进步有推动的作用,而海量数据对数据的分析既带来了机遇,也构成了新的挑战。随着大数据的迅速发展,许多企业开始…

    2026年4月17日
    7
  • lib vs 生成pdb_pdb文件 VS c++编译[通俗易懂]

    lib vs 生成pdb_pdb文件 VS c++编译[通俗易懂]使用VS-debug模式下编译的时候,经常出现以下问题:’Dlib.exe'(Win32):Loaded’D:\c++\Dlib\x64\Debug\Dlib.exe’.Symbolsloaded.’Dlib.exe'(Win32):Loaded’C:\Windows\System32\ntdll.dll’.CannotfindoropenthePDBfile.’Dl…

    2022年5月18日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号