基于qcow2的虛擬磁盤使用空間的計(jì)算方法、虛擬設(shè)備的制造方法【
技術(shù)領(lǐng)域:
】[0001]本發(fā)明屬于計(jì)算機(jī)
技術(shù)領(lǐng)域:
,更具體涉及一種基于qcow2的虛擬機(jī)的虛擬磁盤中使用空間的計(jì)算方法及一種虛擬設(shè)備?!?br>背景技術(shù):
】[0002]在云計(jì)算領(lǐng)域中,經(jīng)常要在一臺(tái)主機(jī)上創(chuàng)建多臺(tái)虛擬機(jī),這樣可以將多臺(tái)虛擬機(jī)分配給不同的人使用,或者用其中的虛擬機(jī)做一些特殊工作,通常情況下主機(jī)使用的是一種虛擬化軟件,例如qemu程序來創(chuàng)建虛擬機(jī),對(duì)于主機(jī)來說,每個(gè)虛擬機(jī)就是一個(gè)qemu程序,qemu程序負(fù)責(zé)虛擬cpu,虛擬磁盤,以及鼠標(biāo),鍵盤等一臺(tái)PC機(jī)不可缺少的部分,虛擬機(jī)使用者感知不到這臺(tái)PC是虛擬出來的。[0003]虛擬機(jī)是虛擬出來的PC機(jī),里面同樣可以運(yùn)行操作系統(tǒng),比如windows、linux系統(tǒng),同樣可以在系統(tǒng)中安裝各種軟件,可以像正常物理實(shí)體PC機(jī)一樣使用虛擬出來的磁盤。[0004]qemu虛擬機(jī)運(yùn)行在主機(jī)上,主機(jī)為qemu虛擬機(jī)的運(yùn)行提供了最底層的支持,比如可以提供一個(gè)主機(jī)上的qcow2(—種虛擬磁盤的格式)格式的文件,qemu虛擬機(jī)可以用該格式的文件虛擬出一塊磁盤給qemu虛擬機(jī)使用,這樣從qemu虛擬機(jī)中的操作系統(tǒng)看這是一塊磁盤,從主機(jī)操作系統(tǒng)中看這是一個(gè)文件,當(dāng)要獲取虛擬機(jī)中這塊虛擬磁盤的使用情況時(shí),由于它是主機(jī)中的一個(gè)文件,因此可以使用常用的獲取文件大小的方法就可以了,比如通過fstat函數(shù)獲取文件有多少塊number,通過number*512bytes就能得到當(dāng)前虛擬機(jī)的虛擬磁盤已經(jīng)使用了多少空間。[0005]如果主機(jī)為qemu虛擬機(jī)提供的不是一個(gè)文件,而是共享存儲(chǔ),或者說是主機(jī)的一個(gè)塊設(shè)備,而不是一個(gè)文件,該塊設(shè)備也是按照qcow2格式來組成虛擬機(jī)中的磁盤,這時(shí),由于對(duì)于主機(jī)來說不是文件而是一個(gè)塊設(shè)備了,就不能使用上述方法計(jì)算虛擬機(jī)中磁盤的大小了。那么如何高效準(zhǔn)確地獲得由文件或其他設(shè)備虛擬形成的磁盤的使用空間的大小是目前急需要解決的技術(shù)問題。【
發(fā)明內(nèi)容】[0006](一)要解決的技術(shù)問題[0007]本發(fā)明要解決的技術(shù)問題是如何高效準(zhǔn)確地獲得由文件或其他設(shè)備虛擬形成的磁盤的使用空間的大小。[0008](二)技術(shù)方案[0009]為了解決上述技術(shù)問題,本發(fā)明提供一種基于qC0W2的虛擬磁盤使用空間的計(jì)算方法,所述方法包括以下步驟:[0010]S1、根據(jù)簇的偏移位數(shù)計(jì)算簇的大??;[0011]S2、對(duì)于引用表對(duì)應(yīng)的每個(gè)引用塊,利用引用表中記錄的該引用塊的偏移地址找到對(duì)應(yīng)的引用塊;其中每個(gè)所述引用塊均包括多個(gè)表項(xiàng);[0012]S3、統(tǒng)計(jì)所有引用塊中內(nèi)容不為空的所述表項(xiàng)的數(shù)量,并利用下面公式計(jì)算虛擬磁盤中使用的空間:虛擬磁盤中使用的空間=所有引用塊中內(nèi)容不為空的所述表項(xiàng)的數(shù)量*簇的大小。[0013]優(yōu)選地,所述步驟S1之后、S2之前,所述方法還包括以下步驟:[0014]根據(jù)引用表的基礎(chǔ)數(shù)量以及簇的偏移位數(shù)計(jì)算引用表對(duì)應(yīng)的引用塊的數(shù)量。[0015]優(yōu)選地,所述引用塊的數(shù)量利用如下公式計(jì)算:[0016]refcount_table_entry=refcount_table_clusters〈〈(cluster_bites_3)[0017]式中,refcount_table_entry為所述引用塊的數(shù)量,refcount_table_clusters為所述引用表的基礎(chǔ)數(shù)量,單位是個(gè),cluster_bites為所述簇的偏移位數(shù),〈〈表示左移的意思。[0018]優(yōu)選地,所述步驟S2之后、S3之前,所述方法還包括以下步驟:[0019]對(duì)于每一個(gè)所述引用塊,根據(jù)所述引用塊的大小以及所述表項(xiàng)的預(yù)定大小計(jì)算每個(gè)所述引用塊中所述表項(xiàng)的數(shù)量。[0020]優(yōu)選地,所述表項(xiàng)的數(shù)量為所述引用塊的大小除以所述表項(xiàng)的預(yù)定大小得到的值。[0021]優(yōu)選地,所述步驟S2中利用引用表中記錄的該引用塊的偏移地址找到對(duì)應(yīng)的一個(gè)引用塊具體為:從所述偏移地址開始讀取引用塊預(yù)定大小的數(shù)據(jù)形成對(duì)應(yīng)的所述引用塊。[0022]優(yōu)選地,所述引用塊預(yù)定大小與所述簇的大小相等。[0023]優(yōu)選地,所述步驟S1中利用如下公式計(jì)算所述簇的大小:[0024]cluster__size=l〈〈cluster_bits[0025]式中,01118丨61'_8126為所述簇的大小,01118丨61'_13;^8為所述簇的偏移位數(shù),〈〈表示左移的意思。[0026]—種虛擬機(jī)設(shè)備,所述虛擬機(jī)設(shè)備用于計(jì)算虛擬磁盤中的使用空間,包括簇大小計(jì)算模塊、引用塊搜索模塊以及磁盤使用空間計(jì)算模塊;[0027]所述簇大小計(jì)算模塊用于根據(jù)簇的偏移位數(shù)計(jì)算簇的大??;[0028]所述引用塊搜索模塊用于利用引用表中記錄的偏移地址找到引用表對(duì)應(yīng)的多個(gè)引用塊;[0029]所述磁盤使用空間計(jì)算模塊用于統(tǒng)計(jì)所有引用塊中內(nèi)容不為空的所述表項(xiàng)的數(shù)量,并利用下面公式計(jì)算虛擬磁盤中使用的空間:虛擬磁盤中使用的空間=所有引用塊中內(nèi)容不為空的所述表項(xiàng)的數(shù)量*簇的大小。[0030]優(yōu)選地,還包括引用塊數(shù)量計(jì)算模塊;所述引用塊計(jì)算模塊用于利用下面公式,根據(jù)所述引用表占用的基礎(chǔ)數(shù)量以及簇的偏移的位數(shù)計(jì)算引用表中引用塊的數(shù)量:[0031]refcount_table_entry=refcount_table_clusters〈〈(cluster_bites_3)[0032]式中,refcount_table_entry為所述引用塊的數(shù)量,refcount_table_clusters為所述引用表的基礎(chǔ)數(shù)量,單位是個(gè),cluster_bites為所述簇的偏移位數(shù),〈〈表示左移的意思。[0033]優(yōu)選地,還包括表項(xiàng)數(shù)量計(jì)算模塊,對(duì)于每一個(gè)所述引用塊,所述表項(xiàng)數(shù)量計(jì)算模塊用于根據(jù)所述引用塊的大小以及所述表項(xiàng)的預(yù)定大小計(jì)算每個(gè)所述引用塊中所述表項(xiàng)的數(shù)量。[0034]優(yōu)選地,所述簇大小計(jì)算模塊利用如下公式計(jì)算所述簇的大小:[0035]cluster__size=l〈〈cluster_bits[0036]式中,01118161'_8126為所述簇的大小,01118161'_13;^8為所述簇的偏移位數(shù),〈〈表示左移的意思。[0037](三)有益效果[0038]本發(fā)明提供了一種基于qC0W2的虛擬磁盤使用空間的計(jì)算方法以及應(yīng)用該方法計(jì)算虛擬磁盤使用空間的一種虛擬設(shè)備,本發(fā)明根據(jù)簇的偏移位數(shù)計(jì)算得到簇的大小,再根據(jù)引用表記錄的偏移地址找到對(duì)應(yīng)的引用塊,之后統(tǒng)計(jì)所有引用塊中內(nèi)容不為空的表項(xiàng)的數(shù)量,最后根據(jù)簇的大小以及表項(xiàng)的數(shù)量計(jì)算得到虛擬磁盤中使用的空間大小,上述方案不僅可以計(jì)算由文件虛擬形成的磁盤的使用空間的大小,而且可以計(jì)算出由其他設(shè)備虛擬形成的磁盤的使用空間的大小,同時(shí)可以保證計(jì)算的效率和準(zhǔn)確率?!靖綀D說明】[0039]為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。[0040]圖1為本發(fā)明的基于qC0W2的虛擬磁盤使用空間的計(jì)算方法流程圖。【具體實(shí)施方式】[0041]下面結(jié)合附圖和實(shí)施例對(duì)本發(fā)明作進(jìn)一步詳細(xì)描述。以下實(shí)施例用于說明本發(fā)明,但不能用來限制本發(fā)明的范圍。[0042]—種基于qC0W2的虛擬磁盤使用空間的計(jì)算方法,如圖1所示,所述方法包括以下步驟:[0043]S1、根據(jù)簇的偏移位數(shù)計(jì)算簇的大??;[0044]S2、對(duì)于引用表對(duì)應(yīng)的每個(gè)引用塊,利用引用表中記錄的該引用塊的偏移地址找到對(duì)應(yīng)的引用塊;其中每個(gè)所述引用塊均包括多個(gè)表項(xiàng);[0045]此步驟中,引用表中包括多個(gè)引用塊地址表項(xiàng),并且在每個(gè)引用塊地址表項(xiàng)中記錄對(duì)應(yīng)引用塊的偏移地址;[0046]S3、統(tǒng)計(jì)所有引用塊中內(nèi)容不為空的所述表項(xiàng)的數(shù)量,并利用下面公式計(jì)算虛擬磁盤中使用的空間:虛擬磁盤中使用的空間=所有引用塊中內(nèi)容不為空的所述表項(xiàng)的數(shù)量*簇的大小。[0047]上述方法適用于利用qcow2格式組成的虛擬磁盤,不僅可以計(jì)算由文件虛擬形成的磁盤的使用空間的大小,而且可以計(jì)算出由其他設(shè)備,如塊設(shè)備虛擬形成的磁盤的使用空間的大小,同時(shí)可以保證計(jì)算的效率和準(zhǔn)確率。[0048]進(jìn)一步地,在執(zhí)行步驟S1之前,所述方法還包括讀取信息的步驟:對(duì)于qcow2格式形成的虛擬磁盤來說,可以通過讀取其頭部信息獲得計(jì)算磁盤使用空間的相關(guān)數(shù)據(jù)信息,具體為:[0049]1、讀取每個(gè)簇的偏移位數(shù),用cluSter_bitS表示;其中各個(gè)簇的偏移位數(shù)是相等的;[°°50]2、讀取引用表的基礎(chǔ)數(shù)量,用refcount_table_clusters表示,單位是個(gè);[°°51]3、讀取引用表在設(shè)備中的偏移地址refcount_tab1e_offset,用于找到引用表。[0052]進(jìn)一步地,所述步驟SI之后、S2之前,所述方法還包括以下步驟:[0053]對(duì)于引用表,根據(jù)所述引用表的基礎(chǔ)數(shù)量以及簇的偏移位數(shù)計(jì)算引用表中對(duì)應(yīng)的引用塊的數(shù)量。其中所述引用塊的數(shù)量利用如下公式計(jì)算:[0054]refcount_table_entry=refcount_table_clusters〈〈(cluster_bites_3)[0055]式中,refcount_table_entry為所述引用塊的數(shù)量對(duì)應(yīng)的二進(jìn)制數(shù)字,refcount_table_clusters為所述引用表的基礎(chǔ)數(shù)量,單位是個(gè),cluster_bites為所述簇的偏移位數(shù),〈〈表示左移的意思。引用塊的數(shù)量的單位是個(gè)。[0056]假設(shè)代;1^011111:_七&1316_(31118七6^當(dāng)前第1頁1 2