通過修改DB給CloudStack中添加模板

CloudStack的模板上傳有隻能通過http server,但經常會遇到httpserver搭建異常、上傳發生timeout或者上傳一半的時候無法繼續上傳等等各種問題,而項目實施的時候,按進度又要求必須儘快使用該模板,這個時候就會有是否能夠直接將模板scp到SecondaryStorage中的需求。

在SS中,模板存放在template目錄中,此目錄的結構爲:template/tmpl/[account_id]/[template_id]/
account_id爲此模板所屬用戶的id
例如:登陸admin用戶,上傳一個centos.ova作爲vmware模板,該模板id爲202,則此模板在SS中存放路徑爲template/tmpl/2/202/。該目錄中一共有4個文件:509f8d99-d81f-3104-95c9-9cfd23026f83.ova,CentOS_5.6-disk1.vmdk,CentOS5.6.mf,CentOS 5.6.ovf,template.properties。
".ova"文件是上傳的原始ova文件,".vmdk",".mf",".ovf"是由ova解壓之後產生的模板文件。
".vmdk"是虛擬機的磁盤鏡像文件
".ovf"是虛擬機在導出爲ovf格式的時候所產生的描述文件,包含了虛擬機磁盤文件vmdk,資源文件iso和domain之間的正確對應
".mf"是相關文件的SHA的集合,主要作用是防止模板文件被修改
此例中,mf文件內容如下:
[root@localhost 202]# catCentOS\ 5.6.mf 
SHA1(CentOS 5.6.ovf)=867999689b9a2f4591dc3c930d4033f7872264b0
SHA1(CentOS_5.6-disk1.vmdk)=f8a0fdbbafafcc2dc1535c1bf53f500180a5cf75
以上3個文件是vmware模板相關文件,另外一個template.properties則是CloudStack在installtemplate完成之後,產生的模板描述文件,內容如下:
[root@localhost 202]# cattemplate.properties 
#
#Mon Jul 29 06:42:11 UTC 2013
ova.virtualsize=10737418240 //模板的額定值
filename=509f8d99-d81f-3104-95c9-9cfd23026f83.ova //ova文件名
ova.filename=509f8d99-d81f-3104-95c9-9cfd23026f83.ova  //ova文件名
id=202  //db中vm_template.id
public=true //db 中vm_template.public,控制模板的訪問權限
uniquename=202-2-fc9f565a-9e17-3de2-b81a-f91b2b69894f//db中vm_template.uniquename
virtualsize=10737418240 //模板的額定值
checksum=847b01e45b6ad09519f4c3fabeb5b823//校驗碼,檢查文件是否完整或被改變
hvm=true//db中vm_template.hvm,是否需要主機支持hvm
ova=true //是否ova文件
description=test//db中vm_template.display_text
ova.size=1011362816 //ova模板文件大小
size=1011362816 //ova模板文件大小

==============================================================================
CloudStack中對模板的信息,會分別存放在5個表中:vm_template,template_host_ref,template_zone_ref,template_spool_ref,template_swift_ref。
vm_template主要存放模板的詳細信息,包含名稱,訪問權限,下載地址,格式,類型等。
表結構如下:
+--------------------+---------------------+------+-----+---------+----------------+
| Field            | Type             | Null | Key | Default | Extra        |
+--------------------+---------------------+------+-----+---------+----------------+
| id               | bigint(20) unsigned | NO  | PRI | NULL   | auto_increment |
| unique_name       | varchar(255)      | NO   |    | NULL    |             |
| name             | varchar(255)      | NO   |    | NULL    |             |
| uuid             | varchar(40)       | YES  | UNI | NULL   |             |
| public           | int(1) unsigned    | NO   |    | NULL    |             |訪問權限
| featured          | int(1)unsigned     | NO  |     | NULL   |             |訪問權限
| type             | varchar(32)       | YES  |    | NULL    |             | 
| hvm              | int(1) unsigned    | NO   |    | NULL   |              |
| bits             | int(6) unsigned    | NO   |    | NULL   |             |32/64
| url              | varchar(255)      | YES  |    | NULL    |             |模板上傳地址
| format           | varchar(32)        | NO  |     | NULL   |             | OVA/VHD/QCOW2/ISO
| created          | datetime          | NO   |    | NULL    |             |
| removed          | datetime          | YES  | MUL | NULL   |             |
| account_id        | bigint(20) unsigned | NO  |     | NULL   |             |
| checksum          |varchar(255)       | YES  |    | NULL   |              |
| display_text      | varchar(4096)      | YES  |    | NULL   |              |
| enable_password    |int(1) unsigned     | NO  |     | 1      |             |
| enable_sshkey     | int(1) unsigned    | NO   |    | 0      |              |
| guest_os_id       | bigint(20) unsigned | NO  |     | NULL   |             |操作系統類型
| bootable          | int(1)unsigned     | NO  |     | 1      |             |
| prepopulate       | int(1) unsigned    | NO   |    | 0      |             |
| cross_zones       | int(1) unsigned    | NO   |    | 0      |             |跨資源域
| extractable       | int(1) unsigned    | NO   |    | 0      |             |可下載
| hypervisor_type    |varchar(32)        | YES  |    | NULL   |              |
| source_template_id | bigint(20) unsigned | YES |     | NULL   |             |
| template_tag      | varchar(255)       | YES |     | NULL   |             |
| sort_key          | int(32)           | NO  |     | 0      |             |
+--------------------+---------------------+------+-----+---------+----------------+
type有4種類型,分別爲USER/SYSTEM/BUILTIN/PERHOST,即用戶模板,系統虛擬機模板,內建模板,PERHOST。
CloudStack默認提供的模板,除了系統虛擬機模板之外,還對每種類型的hyperviser提供一個CentOS5.3(64-bit) no GUI(XenServer)的內建模板(BUILTIN),以供測試或小型應用。
PERHOST爲hyperviser中自帶的vmtools.iso。
SYSTEM,BUILTIN和PERHOST屬於system用戶,所以account_id=1,這3類模板的信息,在db的vm_template中,是在初始化db的時候就寫入其中的,所以,SS中template/tmpl/1中的目錄和文件可以在部署CloudStack之前提前放入其中,如果使用其他CloudStack環境中使用過的SS的來部署CloudStack的時候,SS中的template/tmpl/1目錄中的所有模板,都可以保持不變,這樣能夠省去不少傳輸模板的時間
USER爲用戶上傳模板,上傳用戶爲其所屬用戶,account_id爲用戶的id。
cross_zones爲模板的跨資源域屬性,上傳模板的時候,如果選AllZone,則此項爲1,此時模板標記爲跨資源域,在多個Zone的情況下,如果刪除某一Zone裏的該模板,則其他資源域中相應模板也會一併刪除。
例:
mysql> select *from vm_template where id=202 \G;
*************************** 1.row ***************************
             id: 202 //template.properties中的id
     unique_name:202-2-fc9f565a-9e17-3de2-b81a-f91b2b69894f//template.properties中的unique_name
            name:test
            uuid:9838688c-4845-4d2f-827a-8035aee76f8b
          public: 1 
        featured: 1
            type:USER
            hvm: 1
            bits:64
            url:http://192.168.204.199/CentOS5.6.ova
          format: OVA
         created: 2013-07-2906:23:43
         removed: NULL
      account_id: 2
        checksum:847b01e45b6ad09519f4c3fabeb5b823
     display_text:test
  enable_password: 0
    enable_sshkey: 0
     guest_os_id: 103
        bootable: 1
     prepopulate: 0
     cross_zones: 0
     extractable: 1
  hypervisor_type: VMware
source_template_id:NULL
     template_tag:NULL
        sort_key: 0

template_zone_ref主要用於存放模板對應的zone的信息,表結構如下:
mysql> desc template_zone_ref;
+--------------+---------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra        |
+--------------+---------------------+------+-----+---------+----------------+
| id          | bigint(20) unsigned | NO  | PRI | NULL   | auto_increment |
| zone_id     | bigint(20) unsigned | NO   |MUL | NULL    |             |
| template_id  | bigint(20) unsigned | NO  | MUL | NULL   |              |
| created     | datetime          | NO   |    | NULL    |             |
| last_updated | datetime          | YES  |    | NULL   |              |
| removed     | datetime          | YES  | MUL | NULL   |             |
+--------------+---------------------+------+-----+---------+----------------+
若該模板註冊到某資源域(Zone),則會在此表中寫入一項
例:
mysql> select *from template_zone_ref where template_id=202 \G;
*************************** 1.row ***************************
        id: 13
    zone_id: 1
 template_id:202
    created: 2013-07-2906:23:43
last_updated: 2013-07-2906:23:43
    removed: NULL

template_host_ref主要存放模板和二級存儲的對應關係,上傳進度,上傳地址等信息,表結構如下:
mysql> desc template_host_ref;
+----------------+---------------------+------+-----+---------+----------------+
| Field         | Type             | Null | Key | Default | Extra        |
+----------------+---------------------+------+-----+---------+----------------+
| id            |bigint(20) unsigned | NO   | PRI | NULL   | auto_increment |
| host_id       | bigint(20) unsigned | NO  | MUL | NULL   |              |
| template_id    |bigint(20) unsigned | NO   | MUL | NULL   |             |
| created       | datetime          | NO   |    | NULL   |              |
| last_updated   | datetime          | YES |     | NULL   |             |
| job_id        | varchar(255)      | YES  |    | NULL    |             |上傳模板任務id
| download_pct   | int(10) unsigned   | YES  |    | NULL   |              |上傳進度
| size          |bigint(20) unsigned | YES  |    | NULL    |             |模板額定大小
| physical_size  | bigint(20) unsigned | YES |     | 0      |             |模板物理大小
| download_state | varchar(255)       | YES |     | NULL   |             |
| error_str     | varchar(255)       | YES |     | NULL   |             |
| local_path     |varchar(255)       | YES  |    | NULL   |             |SSVM中的下載地址
| install_path   | varchar(255)      | YES  |    | NULL    |             |SS中的存放路徑
| url           |varchar(255)       | YES  |    | NULL   |              |上傳地址
| destroyed     | tinyint(1)        | YES  |    | NULL    |             |
| is_copy       | tinyint(1)        | NO   |    | 0      |             |
+----------------+---------------------+------+-----+---------+----------------+
模板註冊到CloudStack之後,由management-server調度任務,發送到SSVM執行,將模板從給定的url下載到二級存儲中。local_path爲SSVM中下載模板的實際路徑,下載完成後,此項則不在起任何作用,同時會獲取模板在SS中的實際路徑並寫入表的install_path中。例:
mysql> select *from template_host_ref where template_id=202 \G;
*************************** 1.row ***************************
          id: 12
      host_id:3
  template_id: 202
      created:2013-07-29 06:23:43
 last_updated: 2013-07-29 14:39:50
       job_id:8aab877e-b6a2-4952-920e-d631102da361
 download_pct: 100
        size: 10737418240
 physical_size:1011362816
download_state:DOWNLOADED
    error_str: Install completedsuccessfully at 7/29/13 6:42 AM
   local_path:/mnt/SecStorage/d8c72098-9608-3917-90a4-ac88d47a30f4/template/tmpl/2/202/dnld912053474216253760tmp_
 install_path:template/tmpl/2/202//509f8d99-d81f-3104-95c9-9cfd23026f83.ova
         url:http://192.168.204.199/CentOS5.6.ova
    destroyed: 0
      is_copy:0

template_spool_ref存放的是模板由二級存儲傳入主存儲之後的對應信息,template_swift_ref是在啓用swift之後,模板和swift的對應信息。
由此可以看出,實際模板相關的信息,分別存放在db的vm_template,template_host_re,template_zone_ref和SS中的template.properties中。
所以,如果上傳模板失敗而暫時無法解決或由於網絡速度受限而需要長時間傳輸模板的情況下,實際可以通過手動複製模板文件到相關目錄,按模板編輯template.properties文件,然後插入db的方式,來解決此問題。可以省去不少傳輸模板的時間。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章