深度剖析LDM詳解,一文解決!
管理動(dòng)態(tài)磁盤的子系統(tǒng)是LDM,與MS-DOS分區(qū)(即上節(jié)所探討的基本分區(qū))不同,LDM有專門的數(shù)據(jù)庫(kù)記錄在動(dòng)態(tài)磁盤的最后1MB中,所以要基本盤轉(zhuǎn)動(dòng)態(tài)盤的話要記得留有足夠空間
LDM子系統(tǒng)很大程度上提高了容錯(cuò)性,并且可以支持最多2000個(gè)卷,并且允許卷存在于不同的磁盤上。我們?cè)趧?dòng)態(tài)磁盤中是對(duì)卷進(jìn)行管理,而不是分區(qū),這里要記住。卷分為簡(jiǎn)單卷(simple volume),跨區(qū)卷(spanned volume),帶區(qū)卷(striped volume)。這里跨區(qū)卷顧名思義,可以擴(kuò)展到另一個(gè)磁盤上,而帶區(qū)卷的讀寫性能最佳,它將數(shù)據(jù)平均的分給磁盤的帶區(qū)卷上,效率提高了幾倍,大概類似于RAID-0(對(duì)RAID不了解的可以移步我轉(zhuǎn)載的那篇博客上)。
這是我xp虛擬機(jī)上的一塊動(dòng)態(tài)磁盤,今天我們就詳細(xì)研究下它


首先是一個(gè)很明顯的MBR分區(qū),但是這個(gè)MBR分區(qū)其實(shí)只是個(gè)幌子 之所以在動(dòng)態(tài)磁盤中保留MBR一方面是為了考慮一些磁盤管理工具和雙系統(tǒng)環(huán)境的情況,另一方面是考慮到系統(tǒng)盤和引導(dǎo)盤在動(dòng)態(tài)盤上,所以保留了一個(gè)MBR分區(qū)。
重點(diǎn)是那個(gè)6號(hào)扇區(qū)(從0計(jì)數(shù)),這里一律用LBA地址了,所以序號(hào)是0 它的偏移量是0xC00,我們跳過(guò)去看一下:

這里是動(dòng)態(tài)磁盤的私有頭,上面記錄了一些很重要的信息,這個(gè)私有頭在動(dòng)態(tài)磁盤上還有兩份拷貝,并且需要注意的是,LDM中采用的是Big-Endian ,這個(gè)一定要注意?。?!
接下來(lái)我們分析一下它的結(jié)構(gòu),這里僅標(biāo)注重要的地方

【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺(jué)得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)??


LDM有個(gè)特點(diǎn)就是喜歡在一個(gè)特定的結(jié)構(gòu)前面加一串固定值,這里是PRIVHEAD(Private Head)私有頭的意思。 第二項(xiàng)是一個(gè)校驗(yàn)和,占四個(gè)字節(jié)
然后跳到offset為0xc20的地方,前面的地方不是很重要我們就不分析了,有興趣的可以去msdn上找一找。0xc20這里表示私有頭的第一備份地址,這里是0x7FF扇區(qū)。后面的8個(gè)字節(jié)是私有頭的第二備份地址,這里是0x740扇區(qū)。
接下來(lái)三組每個(gè)64字節(jié),分別表示磁盤ID,主機(jī)ID,磁盤組ID,后面的一個(gè)32字節(jié)是該磁盤組的名字。
然后我們跳到0xD1B這里,這里表示邏輯磁盤的起始地址,這里是0x3F。后面的一個(gè)八字節(jié)表示該邏輯磁盤的size,這里是0x13FE59A??梢钥闯鲞@里已經(jīng)擴(kuò)展到8個(gè)字節(jié)了,也就是2PB的大小,可以表示的空間非常非常大了,足夠滿足現(xiàn)有的狀況。
然后接著是LDM數(shù)據(jù)庫(kù)的位置,這里是0x13FF800,后面一個(gè)是LDM數(shù)據(jù)庫(kù)的size,這里是0x800。 接著是TOC的數(shù)目,這里是1,下面一個(gè)則是TOC的size,這里是0x7FE。(TOC全稱是table of content 我查了好久…百度居然木得,可以理解為是目錄表,最重要的是記錄著兩個(gè)表的總體信息) 最后是日志和配置的相關(guān)信息。順序依次是配置信息數(shù)量,這里為1,日志數(shù)量,這里為1,配置信息的大小,這里為0x5c9字節(jié)大小,日志大小,這里為0xE0大小(好奇為啥不一個(gè)數(shù)量后面接一個(gè)size,真的好奇怪,明明前面都是這樣的格局)。
然后我們跳到LDM數(shù)據(jù)庫(kù)的位置看下LDM數(shù)據(jù)庫(kù)的相關(guān)信息,LDM扇區(qū)地址是0x13FF800,跳轉(zhuǎn)之后發(fā)現(xiàn)空空如也。不要驚訝,我們給出LDM數(shù)據(jù)庫(kù)的結(jié)構(gòu)

果然,它第一個(gè)扇區(qū)規(guī)定為空

跳到第二扇區(qū)

看到了TOCBLOCK,config,log字樣,是TOC沒(méi)錯(cuò)了,下面說(shuō)明一下TOC的結(jié)構(gòu)。

我們關(guān)注的主要是它的固定值,位圖名,位圖起始地址。這里我們需要制作一個(gè)模板,按照這樣的樣式來(lái),想知道原理的自己搜一搜,這里就不提了,打開模板的快捷鍵是Crtl+F12

注意這里是大端的方式,全部以十六進(jìn)制的方式呈現(xiàn) 分析的結(jié)果如下:

首先是一個(gè)TOCBLOCK的固定ascill字符串,然后BitmapName是config,這是配置信息的總表(VMDB)的名稱,它的所處扇區(qū)是0x11,相對(duì)于LDM的數(shù)據(jù)庫(kù)而言的。第二個(gè)BitmapName是log,這是日志記錄的地方,它所在的相對(duì)扇區(qū)是0x5DA。我們先看VMDB,結(jié)構(gòu)如下。


仍然需要制作模板
VMDB信息

固定值VMDB開頭,VBLK的個(gè)數(shù)是0x1724個(gè),代表著VMDB后面的VMLK(配置記錄)的數(shù)量是這么多,每個(gè)VMLK的一般來(lái)說(shuō)是128字節(jié)大小,也就是0x80大小,OffsetToFirstVBLK是VBLK相對(duì)于VMDB的字節(jié)偏移,這里是512字節(jié),也就是VMDB占了一個(gè)扇區(qū)的大小,DiskGroupName是磁盤組名,一般是你的計(jì)算機(jī)名+Dgx(x從1開始標(biāo))。 比較重要是下面的四項(xiàng)
Number of Committed Volume VBLKs //提交的卷記錄 Number of Committed Component VBLKs //提交的組件記錄 Number of Committed Partition VBLKs //提交的分區(qū)記錄 Number of Committed Disk VBLKs //提交的磁盤記錄 之所以會(huì)有這四項(xiàng),是因?yàn)橐粋€(gè)卷的建立并不是只有一個(gè)卷記錄而已的,不同的卷類型有著不同的邏輯結(jié)構(gòu)用以盡可能詳細(xì)的描述該卷的信息,其中v代表volume,c代表component,p代表partition,d代表disk。 簡(jiǎn)單卷:

跨區(qū)卷:

鏡像卷

鏡像跨區(qū)卷

而我們這里是兩個(gè)簡(jiǎn)單卷,并且在同一塊磁盤上。

所以,會(huì)有2個(gè)卷記錄,2個(gè)組件記錄,2個(gè)分區(qū)記錄,因?yàn)闆](méi)有擴(kuò)展卷,所以一個(gè)卷一個(gè)分區(qū),1個(gè)磁盤記錄就足夠了,因?yàn)樵谕淮疟P上。

后面就是VBLK了,一個(gè)大小為0x80。

VBLK的結(jié)構(gòu)是一個(gè)動(dòng)態(tài)的結(jié)構(gòu),對(duì)于V,C,P,D有不同的描述,但是這些結(jié)構(gòu)有個(gè)相同的Header。另外一個(gè)動(dòng)態(tài)磁盤會(huì)有一個(gè)磁盤組的記錄,但是動(dòng)態(tài)磁盤僅支持1個(gè)磁盤組。
magic是一個(gè)固定的ASCII值“VBLK”,sequenceNumber表示是配置記錄的第幾個(gè),這是從4開始編制的,因?yàn)閂MDB占了0-3。NumberOfRecords是所占的記錄數(shù),因?yàn)橛袝r(shí)一個(gè)128字節(jié)并不能完全表示除某個(gè)類型的特征。flags是一個(gè)很重要的標(biāo)志,用于標(biāo)識(shí)這個(gè)是什么類型。otherData則是代表了后面的動(dòng)態(tài)結(jié)構(gòu),具體我會(huì)再下面講。
先看第一個(gè)VBLK

sequnence num為4,說(shuō)明這是第一條記錄,類型是0x34表明是一個(gè)磁盤的VBLK

重點(diǎn)關(guān)注它的對(duì)象ID,磁盤ID是403,磁盤名是Disk1,全局ID是c0cfb0bc-a5b6-43c9-a170-7052ee232537
再看下一條的ID

sequence num是5,說(shuō)明是第2條記錄。Flags是磁盤組的VBLK。

重要的已經(jīng)標(biāo)了出來(lái),磁盤組的對(duì)象ID是401 ,這個(gè)很重要
再看下一條有效VBLK

Flags是0x51,說(shuō)明是一個(gè)卷結(jié)構(gòu)

對(duì)象ID是406 ,卷名為Volume1,是一個(gè)普通卷,被分配的驅(qū)動(dòng)器號(hào)是J,有一個(gè)獨(dú)特的GUID,分區(qū)類型是07,表明是NTFS類型,也確實(shí)如此,卷大小是0x1c2000,換算一下大小,是900MB,因?yàn)長(zhǎng)DM分去了1MB,所以可用的為899MB

繼續(xù)往下:

Flags為分區(qū)類型,看一下分區(qū)結(jié)構(gòu)。

這塊分區(qū)的對(duì)象ID是40A,名稱為Disk1-01,動(dòng)態(tài)磁盤的扇區(qū)相對(duì)位置為0,這個(gè)的絕對(duì)扇區(qū)地址應(yīng)該為63,卷偏移為0,說(shuō)明是這個(gè)簡(jiǎn)單卷的第一個(gè)分區(qū),若卷偏移不是0,說(shuō)明有擴(kuò)展卷的存在,父對(duì)象的組件ID是408,磁盤對(duì)象ID是403,這個(gè)403正是我們我們這塊磁盤的ID。所以到這里,我們不難看出,LDM區(qū)分不同的部件是根據(jù)對(duì)象ID來(lái)的,所以每個(gè)部件的對(duì)象ID是一個(gè)獨(dú)特的ID值,并且非常重要。 繼續(xù)往下查找該卷的組件。 flags的值為0x32,表明是一個(gè)組件。

組件結(jié)構(gòu):

組件的對(duì)象ID是408,正是分區(qū)的父對(duì)象ID,名稱是Volume1-01,是一個(gè)基本組件,它的父ID(卷)為406,正是邏輯磁盤J。至此一個(gè)簡(jiǎn)單卷的分析就到此了。
最后給出卷,分區(qū),組件,磁盤,VBLK頭的模板,僅供參考,template標(biāo)明這是啥,記得別看錯(cuò),模板識(shí)別是根據(jù)現(xiàn)在的光標(biāo)位置進(jìn)行選擇的
