一種實(shí)現(xiàn)邏輯卷元數(shù)據(jù)備份存儲(chǔ)的方法
【專利摘要】本發(fā)明公開了一種實(shí)現(xiàn)邏輯卷元數(shù)據(jù)備份存儲(chǔ)的方法,通過在磁盤首尾各存放一份元數(shù)據(jù),當(dāng)磁盤首位置的元數(shù)據(jù)被破壞后可以從磁盤末尾讀取元數(shù)據(jù)的備份,反之亦然。本發(fā)明通過在磁盤首尾存放兩份元數(shù)據(jù)信息提高了元數(shù)據(jù)的容錯(cuò)能力,當(dāng)一份元數(shù)據(jù)被異常破壞時(shí)可以使用另一份正常加載,然后完成邏輯卷的激活等操作。
【專利說明】一種實(shí)現(xiàn)邏輯卷元數(shù)據(jù)備份存儲(chǔ)的方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及計(jì)算機(jī)系統(tǒng)及通信領(lǐng)域,具體涉及一種實(shí)現(xiàn)邏輯卷元數(shù)據(jù)備份存儲(chǔ)的 方法。 技術(shù)背景
[0002] 在存儲(chǔ)系統(tǒng)中為提高磁盤空間管理的便利和有效性,通常采用邏輯卷的方式對(duì)存 儲(chǔ)空間進(jìn)行管理,即通常情況下,在磁盤上創(chuàng)建物理卷(Phisical Volume),然后將物理卷 組成存儲(chǔ)池,在存儲(chǔ)池上劃分邏輯卷(Logical Volume),基于邏輯卷可以實(shí)現(xiàn)卷空間擴(kuò)容 等高級(jí)功能。為了描述存儲(chǔ)池的組成及邏輯卷的劃分,需要在磁盤上記錄其元數(shù)據(jù)信息,當(dāng) 系統(tǒng)啟動(dòng)時(shí)根據(jù)磁盤上的邏輯卷元數(shù)據(jù)信息將各個(gè)卷進(jìn)行激活。
[0003] 通常的卷管理器實(shí)現(xiàn)方式,只在磁盤起始位置存放一份邏輯卷元數(shù)據(jù)信息,如果 磁盤起始的元數(shù)據(jù)信息被異常破壞,會(huì)導(dǎo)致邏輯卷無法被正常掃描和激活,為了提高邏輯 卷元數(shù)據(jù)的容錯(cuò)能力,通常采用元數(shù)據(jù)備份的方式。
【發(fā)明內(nèi)容】
[0004] 本發(fā)明要解決的技術(shù)問題是:提供一種實(shí)現(xiàn)邏輯卷元數(shù)據(jù)備份存儲(chǔ)的方法。
[0005] 本發(fā)明所采用的技術(shù)方案為: 一種實(shí)現(xiàn)邏輯卷元數(shù)據(jù)備份存儲(chǔ)的方法,通過在磁盤首尾各存放一份元數(shù)據(jù),當(dāng)磁盤 首位置的元數(shù)據(jù)被破壞后可以從磁盤末尾讀取元數(shù)據(jù)的備份,反之亦然。
[0006] 所述元數(shù)據(jù)在磁盤上的具體布局方式如下: 1) 首先在磁盤的起始的第二個(gè)扇區(qū)存放卷標(biāo)描述信息和物理卷描述信息,用于表示此 硬盤已被卷管理器所使用,并記錄物理卷的UUID ; 2) 在磁盤起始4KB位置處,開始存放邏輯卷元數(shù)據(jù)及其描述信息,元數(shù)據(jù)區(qū)默認(rèn)占用 1024個(gè)扇區(qū),其中第一個(gè)扇區(qū)存放mda_header結(jié)構(gòu)用于對(duì)隨后的元數(shù)據(jù)進(jìn)行描述; 3) 當(dāng)啟用元數(shù)據(jù)的備份時(shí),在磁盤末尾存放一份元數(shù)據(jù)的鏡像; 4) 當(dāng)磁盤開始位置的label_header被破壞時(shí),可以根據(jù)默認(rèn)的元數(shù)據(jù)區(qū)大小計(jì)算出 磁盤末尾位置的lable_head er結(jié)構(gòu),用以判斷磁盤是否被卷管理器使用,并根據(jù)隨后的 pv_header結(jié)構(gòu)計(jì)算出磁盤首尾兩個(gè)元數(shù)據(jù)區(qū)的位置; 當(dāng)磁盤開始的mda_header結(jié)構(gòu)被破壞時(shí),同樣從磁盤末尾備份的mda_header讀取最 近一個(gè)版本元數(shù)據(jù)的偏移位置,然后讀取實(shí)際的邏輯卷元數(shù)據(jù)將卷激活。
[0007] 所述卷標(biāo)描述信息的定義如下: struct label_header { int8_t id[8] ; // id 字段存儲(chǔ)了 "LABELONE" 字符串 uint64_t sector_xl; //當(dāng)前結(jié)構(gòu)所在的扇區(qū),默認(rèn)為1,即起始第二個(gè)扇區(qū) uint32_t crc_xl; // 校驗(yàn)字段 uint32_t offset_xl; //后面pv_header結(jié)構(gòu)相對(duì)此扇區(qū)起始的偏移 int8_t type [8] ; // 類型信息 }〇
[0008] 所述卷標(biāo)信息隨后存放的是物理卷描述信息,其定義如下: struct pv_header { int8_t pv_uuid[ID_LEN] ; //使用隨機(jī)數(shù)生成的UUID,唯一標(biāo)示一個(gè)物理卷 uint64_t device_size_xl; //物理卷大小,以字節(jié)為單位 struct disk_locn disk_areas_xl [0] ; //描述了數(shù)據(jù)區(qū)及元數(shù)據(jù)區(qū)的位置 }〇
[0009] 其中,pv_header結(jié)構(gòu)中的disk_areas_xl成員是一個(gè)結(jié)構(gòu)體數(shù)組,具體描述了各 個(gè)數(shù)據(jù)區(qū)和元數(shù)據(jù)區(qū)在磁盤上的位置。如果使用元數(shù)據(jù)備份功能,則需要在磁盤首尾各存 放一份元數(shù)據(jù),其相對(duì)磁盤起始位置的偏移和元數(shù)據(jù)區(qū)長(zhǎng)度均在此結(jié)構(gòu)洪描述。
[0010] 所述mda_header結(jié)構(gòu)的定義如下: struct mda_header { uint32_t checksum_xl; //元數(shù)據(jù)區(qū)描述符的校驗(yàn)值 int8_t magic[16] ; //用于標(biāo)識(shí)元數(shù)據(jù)區(qū)的字符串 uint32_t version; //元數(shù)據(jù)版本信息 uint64_t start; //元數(shù)據(jù)區(qū)在磁盤上的起始偏移字節(jié) uint64_t size; //元數(shù)據(jù)區(qū)大小 struct raw_locn raw_locns [0] ; //用于描述最近一個(gè)版本的元數(shù)據(jù)所在磁盤位置 }〇
[0011] 在所述mda_header結(jié)構(gòu)之后的下一個(gè)扇區(qū)存放實(shí)際的邏輯卷元數(shù)據(jù)。
[0012] 所述邏輯卷元數(shù)據(jù)采用可讀文本的方式描述,且在元數(shù)據(jù)區(qū)內(nèi)循環(huán)存放,當(dāng)元數(shù) 據(jù)區(qū)寫滿時(shí)回繞到元數(shù)據(jù)區(qū)開始位置。
[0013] 本發(fā)明的有益效果為:本發(fā)明通過在磁盤首尾存放兩份元數(shù)據(jù)信息提高了元數(shù)據(jù) 的容錯(cuò)能力,當(dāng)一份元數(shù)據(jù)被異常破壞時(shí)可以使用另一份正常加載,然后完成邏輯卷的激 活等操作。
【專利附圖】
【附圖說明】
[0014] 圖1為未使用元數(shù)據(jù)備份的磁盤布局示意圖; 圖2為本發(fā)明使用元數(shù)據(jù)備份的磁盤布局示意圖。
【具體實(shí)施方式】
[0015] 下面參照附圖,通過【具體實(shí)施方式】對(duì)本發(fā)明進(jìn)一步說明: 一種實(shí)現(xiàn)邏輯卷元數(shù)據(jù)備份存儲(chǔ)的方法,通過在磁盤首尾各存放一份元數(shù)據(jù),當(dāng)磁盤 首位置的元數(shù)據(jù)被破壞后可以從磁盤末尾讀取元數(shù)據(jù)的備份,反之亦然。
[0016] 所述元數(shù)據(jù)在磁盤上的具體布局方式如下: 1) 首先在磁盤的起始的第二個(gè)扇區(qū)存放卷標(biāo)描述信息和物理卷描述信息,用于表示此 硬盤已被卷管理器所使用,并記錄物理卷的UUID ; 2) 在磁盤起始4KB位置處,開始存放邏輯卷元數(shù)據(jù)及其描述信息,元數(shù)據(jù)區(qū)默認(rèn)占用 1024個(gè)扇區(qū),其中第一個(gè)扇區(qū)存放mda_header結(jié)構(gòu)用于對(duì)隨后的元數(shù)據(jù)進(jìn)行描述; 3)當(dāng)啟用元數(shù)據(jù)的備份時(shí),在磁盤末尾存放一份元數(shù)據(jù)的鏡像; 假設(shè)邏輯卷元數(shù)據(jù)區(qū)的大小為1024扇區(qū),則磁盤末尾4KB+512KB的區(qū)域用于存放備份 數(shù)據(jù),其中備份區(qū)域的第二個(gè)扇區(qū)用于存放label_header和pv_header結(jié)構(gòu),用于記錄卷 管理表識(shí)和物理卷標(biāo)識(shí)。備份區(qū)域的4K偏移處一個(gè)扇區(qū)內(nèi)存放mda_head er,注意此扇區(qū) 內(nèi)存在兩個(gè)mda_header結(jié)構(gòu),第一個(gè)用于記錄磁盤末尾的元數(shù)據(jù)存儲(chǔ)位置,第二個(gè)用于記 錄磁盤開頭的元數(shù)據(jù)位置,并與磁盤開頭的兩個(gè)mda_header結(jié)構(gòu)對(duì)稱存放。具體布局方式 如圖2所示。
[0017] 4)當(dāng)磁盤開始位置的label_header被破壞時(shí),可以根據(jù)默認(rèn)的元數(shù)據(jù)區(qū)大小計(jì) 算出磁盤末尾位置的lable_head er結(jié)構(gòu),用以判斷磁盤是否被卷管理器使用,并根據(jù)隨后 的pv_header結(jié)構(gòu)計(jì)算出磁盤首尾兩個(gè)元數(shù)據(jù)區(qū)的位置; 當(dāng)磁盤開始的mda_header結(jié)構(gòu)被破壞時(shí),同樣從磁盤末尾備份的mda_header讀取最 近一個(gè)版本元數(shù)據(jù)的偏移位置,然后讀取實(shí)際的邏輯卷元數(shù)據(jù)將卷激活。
[0018] 所述卷標(biāo)描述信息的定義如下: struct label_header { int8_t id[8] ; // id 字段存儲(chǔ)了 "LABELONE" 字符串 uint64_t sector_xl; //當(dāng)前結(jié)構(gòu)所在的扇區(qū),默認(rèn)為1,即起始第二個(gè)扇區(qū) uint32_t crc_xl; // 校驗(yàn)字段 uint32_t offset_xl; //后面pv_header結(jié)構(gòu)相對(duì)此扇區(qū)起始的偏移 int8_t type [8] ; // 類型信息 }〇
[0019] 所述卷標(biāo)信息隨后存放的是物理卷描述信息,其定義如下: struct pv_header { int8_t pv_uuid[ID_LEN] ; //使用隨機(jī)數(shù)生成的UUID,唯一標(biāo)示一個(gè)物理卷 uint64_t device_size_xl; //物理卷大小,以字節(jié)為單位 struct disk_locn disk_areas_xl [0] ; //描述了數(shù)據(jù)區(qū)及元數(shù)據(jù)區(qū)的位置 }〇
[0020] 其中,pv_header結(jié)構(gòu)中的disk_areas_xl成員是一個(gè)結(jié)構(gòu)體數(shù)組,具體描述了各 個(gè)數(shù)據(jù)區(qū)和元數(shù)據(jù)區(qū)在磁盤上的位置。如果使用元數(shù)據(jù)備份功能,則需要在磁盤首尾各存 放一份元數(shù)據(jù),其相對(duì)磁盤起始位置的偏移和元數(shù)據(jù)區(qū)長(zhǎng)度均在此結(jié)構(gòu)洪描述。
[0021] 所述mda_header結(jié)構(gòu)的定義如下: struct mda_header { uint32_t checksum_xl; //元數(shù)據(jù)區(qū)描述符的校驗(yàn)值 int8_t magic[16] ; //用于標(biāo)識(shí)元數(shù)據(jù)區(qū)的字符串 uint32_t version; //元數(shù)據(jù)版本信息 uint64_t start; //元數(shù)據(jù)區(qū)在磁盤上的起始偏移字節(jié) uint64_t size; //元數(shù)據(jù)區(qū)大小 struct raw_locn raw_locns [0] ; //用于描述最近一個(gè)版本的元數(shù)據(jù)所在磁盤位置 }〇
[0022] 在所述mda_header結(jié)構(gòu)之后的下一個(gè)扇區(qū)存放實(shí)際的邏輯卷元數(shù)據(jù)。
[0023] 所述邏輯卷元數(shù)據(jù)采用可讀文本的方式描述,且在元數(shù)據(jù)區(qū)內(nèi)循環(huán)存放,當(dāng)元數(shù) 據(jù)區(qū)寫滿時(shí)回繞到元數(shù)據(jù)區(qū)開始位置。
[0024] 邏輯卷元數(shù)據(jù)以可讀文本的方式存放,用于描述物理卷、存儲(chǔ)池、邏輯卷的組 成、空間劃分等信息。例如第一份元數(shù)據(jù)的起始存放位置為4096+512=4608字節(jié),且元 數(shù)據(jù)長(zhǎng)度默認(rèn)對(duì)齊到512字節(jié),假設(shè)對(duì)齊后的元數(shù)據(jù)長(zhǎng)度為1024字節(jié),則其結(jié)束偏移為 4608+1024-1=5631。當(dāng)邏輯卷劃分出現(xiàn)變化時(shí),例如對(duì)邏輯卷進(jìn)行增加、擴(kuò)容、刪除等操作 時(shí),會(huì)對(duì)元數(shù)據(jù)進(jìn)行更新,則在上一份元數(shù)據(jù)的后面重新存放一份新版本的元數(shù)據(jù)。假設(shè)上 一元數(shù)據(jù)的結(jié)束位置5621,則第二份元數(shù)據(jù)的起始存放偏移為5632,如果后續(xù)邏輯卷結(jié)構(gòu) 變化較大,元數(shù)據(jù)則依次向后排列,當(dāng)?shù)竭_(dá)元數(shù)據(jù)區(qū)的末尾時(shí),回繞到元數(shù)據(jù)區(qū)的開頭進(jìn)行 存放。
[0025] 當(dāng)未使用元數(shù)據(jù)備份時(shí)的磁盤布局如圖1所示。
【權(quán)利要求】
1. 一種實(shí)現(xiàn)邏輯卷元數(shù)據(jù)備份存儲(chǔ)的方法,其特征在于:在磁盤首尾各存放一份元數(shù) 據(jù)。
2. 根據(jù)權(quán)利要求1所述的一種實(shí)現(xiàn)邏輯卷元數(shù)據(jù)備份存儲(chǔ)的方法,其特征在于,所述 元數(shù)據(jù)在磁盤上的具體布局方式如下: 1) 首先在磁盤的起始的第二個(gè)扇區(qū)存放卷標(biāo)描述信息和物理卷描述信息,用于表示此 硬盤已被卷管理器所使用,并記錄物理卷的UUID ; 2) 在磁盤起始4KB位置處,開始存放邏輯卷元數(shù)據(jù)及其描述信息,元數(shù)據(jù)區(qū)默認(rèn)占用 1024個(gè)扇區(qū),其中第一個(gè)扇區(qū)存放mda_header結(jié)構(gòu)用于對(duì)隨后的元數(shù)據(jù)進(jìn)行描述; 3) 當(dāng)啟用元數(shù)據(jù)的備份時(shí),在磁盤末尾存放一份元數(shù)據(jù)的鏡像; 4) 當(dāng)磁盤開始位置的label_header被破壞時(shí),根據(jù)默認(rèn)的元數(shù)據(jù)區(qū)大小計(jì)算出磁 盤末尾位置的lable_header結(jié)構(gòu),用以判斷磁盤是否被卷管理器使用,并根據(jù)隨后的pv_ header結(jié)構(gòu)計(jì)算出磁盤首尾兩個(gè)元數(shù)據(jù)區(qū)的位置; 當(dāng)磁盤開始的mda_header結(jié)構(gòu)被破壞時(shí),從磁盤末尾備份的mda_header讀取最近一 個(gè)版本元數(shù)據(jù)的偏移位置,然后讀取實(shí)際的邏輯卷元數(shù)據(jù)將卷激活。
3. 根據(jù)權(quán)利要求1或2所述的一種實(shí)現(xiàn)邏輯卷元數(shù)據(jù)備份存儲(chǔ)的方法,其特征在于,所 述卷標(biāo)描述信息的定義如下: struct label_header { int8_t id[8] ; // id 字段存儲(chǔ)了 "LABELONE" 字符串 uint64_t sector_xl; //當(dāng)前結(jié)構(gòu)所在的扇區(qū),默認(rèn)為1,即起始第二個(gè)扇區(qū) uint32_t crc_xl; // 校驗(yàn)字段 uint32_t offset_xl; //后面pv_header結(jié)構(gòu)相對(duì)此扇區(qū)起始的偏移 int8_t type [8] ; // 類型信息 }〇
4. 根據(jù)權(quán)利要求1或2所述的一種實(shí)現(xiàn)邏輯卷元數(shù)據(jù)備份存儲(chǔ)的方法,其特征在于,所 述卷標(biāo)信息隨后存放的是物理卷描述信息,其定義如下: struct pv_header { int8_t pv_uuid[ID_LEN] ; //使用隨機(jī)數(shù)生成的UUID,唯一標(biāo)示一個(gè)物理卷 uint64_t device_size_xl; //物理卷大小,以字節(jié)為單位 struct disk_locn disk_areas_xl [0] ; //描述了數(shù)據(jù)區(qū)及元數(shù)據(jù)區(qū)的位置 }〇
5. 根據(jù)權(quán)利要求1或2所述的一種實(shí)現(xiàn)邏輯卷元數(shù)據(jù)備份存儲(chǔ)的方法,其特征在于,所 述mda_header結(jié)構(gòu)的定義如下: struct mda_header { uint32_t checksum_xl; //元數(shù)據(jù)區(qū)描述符的校驗(yàn)值 int8_t magic[16] ; //用于標(biāo)識(shí)元數(shù)據(jù)區(qū)的字符串 uint32_t version; //元數(shù)據(jù)版本信息 uint64_t start; //元數(shù)據(jù)區(qū)在磁盤上的起始偏移字節(jié) uint64_t size; //元數(shù)據(jù)區(qū)大小 struct raw_locn raw_locns [0] ; //用于描述最近一個(gè)版本的元數(shù)據(jù)所在磁盤位置 }〇
6. 根據(jù)權(quán)利要求5所述的一種實(shí)現(xiàn)邏輯卷元數(shù)據(jù)備份存儲(chǔ)的方法,其特征在于:在所 述mda_header結(jié)構(gòu)之后的下一個(gè)扇區(qū)存放實(shí)際的邏輯卷元數(shù)據(jù)。
7. 根據(jù)權(quán)利要求6所述的一種實(shí)現(xiàn)邏輯卷元數(shù)據(jù)備份存儲(chǔ)的方法,其特征在于:所述 邏輯卷元數(shù)據(jù)采用可讀文本的方式描述,且在元數(shù)據(jù)區(qū)內(nèi)循環(huán)存放,當(dāng)元數(shù)據(jù)區(qū)寫滿時(shí)回 繞到元數(shù)據(jù)區(qū)開始位置。
【文檔編號(hào)】G06F11/14GK104090829SQ201410383038
【公開日】2014年10月8日 申請(qǐng)日期:2014年8月6日 優(yōu)先權(quán)日:2014年8月6日
【發(fā)明者】張會(huì)健 申請(qǐng)人:浪潮電子信息產(chǎn)業(yè)股份有限公司