欢迎光临散文网 会员登陆 & 注册

深度剖析LDM详解,一文解决!

2022-08-17 16:15 作者:补给站Linux内核  | 我要投稿

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

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

这是我xp虚拟机上的一块动态磁盘,今天我们就详细研究下它



首先是一个很明显的MBR分区,但是这个MBR分区其实只是个幌子 之所以在动态磁盘中保留MBR一方面是为了考虑一些磁盘管理工具和双系统环境的情况,另一方面是考虑到系统盘和引导盘在动态盘上,所以保留了一个MBR分区。

重点是那个6号扇区(从0计数),这里一律用LBA地址了,所以序号是0 它的偏移量是0xC00,我们跳过去看一下:


这里是动态磁盘的私有头,上面记录了一些很重要的信息,这个私有头在动态磁盘上还有两份拷贝,并且需要注意的是,LDM中采用的是Big-Endian ,这个一定要注意!!!

接下来我们分析一下它的结构,这里仅标注重要的地方



【文章福利】小编推荐自己的Linux内核技术交流群:【891587639】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!(含视频教程、电子书、实战项目及代码)  

LDM有个特点就是喜欢在一个特定的结构前面加一串固定值,这里是PRIVHEAD(Private Head)私有头的意思。 第二项是一个校验和,占四个字节

然后跳到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,真的好奇怪,明明前面都是这样的格局)。

然后我们跳到LDM数据库的位置看下LDM数据库的相关信息,LDM扇区地址是0x13FF800,跳转之后发现空空如也。不要惊讶,我们给出LDM数据库的结构


果然,它第一个扇区规定为空


跳到第二扇区

看到了TOCBLOCK,config,log字样,是TOC没错了,下面说明一下TOC的结构。


我们关注的主要是它的固定值,位图名,位图起始地址。这里我们需要制作一个模板,按照这样的样式来,想知道原理的自己搜一搜,这里就不提了,打开模板的快捷键是Crtl+F12


注意这里是大端的方式,全部以十六进制的方式呈现 分析的结果如下:


首先是一个TOCBLOCK的固定ascill字符串,然后BitmapName是config,这是配置信息的总表(VMDB)的名称,它的所处扇区是0x11,相对于LDM的数据库而言的。第二个BitmapName是log,这是日志记录的地方,它所在的相对扇区是0x5DA。我们先看VMDB,结构如下。

仍然需要制作模板

VMDB信息

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

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

跨区卷:


镜像卷


镜像跨区卷


而我们这里是两个简单卷,并且在同一块磁盘上。


所以,会有2个卷记录,2个组件记录,2个分区记录,因为没有扩展卷,所以一个卷一个分区,1个磁盘记录就足够了,因为在同一磁盘上。


后面就是VBLK了,一个大小为0x80。


VBLK的结构是一个动态的结构,对于V,C,P,D有不同的描述,但是这些结构有个相同的Header。另外一个动态磁盘会有一个磁盘组的记录,但是动态磁盘仅支持1个磁盘组。

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

先看第一个VBLK


sequnence num为4,说明这是第一条记录,类型是0x34表明是一个磁盘的VBLK


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

再看下一条的ID


sequence num是5,说明是第2条记录。Flags是磁盘组的VBLK。


重要的已经标了出来,磁盘组的对象ID是401 ,这个很重要

再看下一条有效VBLK


Flags是0x51,说明是一个卷结构


对象ID是406 ,卷名为Volume1,是一个普通卷,被分配的驱动器号是J,有一个独特的GUID,分区类型是07,表明是NTFS类型,也确实如此,卷大小是0x1c2000,换算一下大小,是900MB,因为LDM分去了1MB,所以可用的为899MB


继续往下:


Flags为分区类型,看一下分区结构。


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


组件结构:


组件的对象ID是408,正是分区的父对象ID,名称是Volume1-01,是一个基本组件,它的父ID(卷)为406,正是逻辑磁盘J。至此一个简单卷的分析就到此了。

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


深度剖析LDM详解,一文解决!的评论 (共 条)

分享到微博请遵守国家法律