將OpenVZ架設的虛擬機器轉換為虛擬應用樣板的作法 / Package OpenVZ Container to Template
使用Proxmox VE的OpenVZ建立好虛擬機器(Container),並在裡面安裝好必要的服務之後,接著可以把它轉換成虛擬應用樣板(template),方便其他人從樣板建立起一模一樣的虛擬機器。以下這篇我就教大家在Proxmox 1.9版底下將OpenVZ的虛擬機器轉換成虛擬應用樣板的方法。
Once you create a OpenVZ container with a application system in Proxmox VE, you can package the container to a template and distribute it to others for installing and using. I wrote a script to do this job. Following is the usage guide.
背景與動機 / Background
由於Proxmox VE用OpenVZ架設起來的虛擬機器(Container)運作效率高、速度又快,所以後來我很多服務都以OpenVZ建立起來,甚至原本是用KVM架設的服務,後來也一併轉換成OpenVZ,運作效率也比KVM高上許多。
我們這邊時常需要將同樣的系統複製很多份,老師上課之用。原本我也可以用Proxmox VE的匯入與匯出來複製虛擬機器,但那究竟不太方便。我當然還是希望能做到像是Turnkey Linux那樣,把服務都包成一個漂亮的虛擬應用樣板,方便給人下載與安裝。
我之前文章中也想過建立虛擬應用樣板。如果要從實體機器或是其他虛擬機器中建立樣板,的確是不容易。但是如果要從OpenVZ建立好的虛擬機器中建立樣板,那就不難了。只要用tar打包起來,並依照正確的方式命名即可。
這篇就是在講如何從OpenVZ建立的虛擬機器(Container)中打包成虛擬應用樣板(template)。
Proxmox VE準備 / Proxmox VE Preparation
要使用OpenVZ,Proxmox VE絕對是目前的首選。這篇的指令也是基於Proxmox VE 3來測試。但是因為Proxmox VE 1跟2的目錄結構都一樣,所以也一樣可以使用這篇文章的教學來製作虛擬應用樣板。至於其他的OpenVZ系統,我就不敢保證了。
因為我們要把既有的虛擬機器轉換成虛擬應用樣板,所以Proxmox VE裡面必須要有一台以OpenVZ架設的虛擬機器。在此我用VMID (虛擬機器的ID編號) 100的ownCloud作為轉換的對象。
打包的動作是要用指令列來操作,而且必須要有root權限。我建議你使用Proxmox VE的SSH通訊協定連線操作比較方便。上圖是我使用的是mRemoteNG中的PieTTY來連線。
虛擬機器轉換虛擬應用樣板操作 / Packager Script Usage Guide
登入root之後,請輸入以下指令下載我製作的轉換腳本檔:
然後把該腳本檔加上可以執行的權限:
chmod +x openvz_CT_to_template.sh
再來執行腳本檔:
./openvz_CT_to_template.sh
腳本檔會顯示歡迎訊息,然後提示你輸入OpenVZ虛擬機器的VMID,預設編號為100:
Please enter OpenVZ Container's VMID: [100]
然後它會檢查你的Proxomx VE有沒有這台虛擬機器,有的話它接著會問你樣板名稱的一些訊息。OpenVZ的樣板是仰賴檔案名稱來辨識訊息,必須要輸入正確的格式,Proxmox VE才能正確地使用樣板。
腳本檔會先問你的作業系統及其版本,例如centos-5、debain-6.0、ubuntu-10.04。預設使用centos-5。注意,裡面要包含「-」。
Please enter template OS (ex: centos-5, debain-6.0, ubuntu-10.04): [centos-5]
接著會問你樣板的名稱。此處請輸入你的應用系統的名字,例如standard、moodle、dspace-dlll。預設使用custom。注意,裡面不可以包含「_」。
Please enter template name (ex: standard, moodle, dspace-dlll): [custom]
接著是版本名稱。例如5.6-1、10.04-4。預設使用1.0-0。注意,裡面必須包含「.」跟「-」。
Please enter template version (ex: 5.6-1, 10.04-4): [1.0-0]
接著問你樣板的架構,例如i386。預設也是用i386。
Please enter template arch. (ex: i386): [i386]
然後最後確定一下要轉換的項目無誤,腳本檔就會開始打包,並存放到Proxmox VE放置樣本檔的目錄中了。
轉換腳本檔 / Packager Script
我已經將轉換腳本檔openvz_CT_to_template.sh上傳到GitHub,這連結中的版本會是最新的。以下是目前腳本檔的內容,你可以從註解來看每一段程式要做的工作:
1: #!/bin/bash
2: # Program:
3: # For Proxmox VE (1~3). Convert OpenVZ Container to Template
4: # 在Proxmox VE (1到3版都可以使用)中,將OpenVZ的虛擬機器(Container)轉換成虛擬應用樣板(Template)
5: # History:
6: # 2013/07/13 Pulipuli Chen First release
7:
8: # 歡迎訊息
9: echo "========================================="
10: echo " OpenVZ Container to Template Packager"
11: echo "========================================="
12:
13: # 宣告目錄參數
14: container_dir=/var/lib/vz/private/
15: template_dir=/var/lib/vz/template/cache/
16: if [ ! -d $container_dir ] || [ ! -d $template_dir ]; then
17: echo "This script only for Proxmox VE 1~3"
18: echo "http://www.proxmox.com/downloads/category/iso-images-pve"
19: echo "Abort"
20: exit 0
21: fi
22:
23: # 請輸入要轉換的VMID
24: read -p "Please enter OpenVZ container's VMID: [100] " vmid
25: if [ -z $vmid ]; then
26: vmid=100
27: fi
28:
29: # 回傳訊息,告知使用者要轉換的VMID
30: echo "You want to package container VMID $vmid to template"
31:
32: # 宣告虛擬機器的目錄
33: ct_dir=$container_dir/$vmid
34:
35: # 檢查該VMID的虛擬機器是否存在
36: if [ -d $ct_dir ]; then
37:
38: # 如果存在的話
39:
40: # 詢問作業系統與其版本
41: read -p "Please enter template's OS and version (ex: centos-5, debain-6.0, ubuntu-10.04): [centos-5] " template_os
42: if [ -z $template_os ]; then
43: template_os=centos-5
44: fi
45: until [[ "$template_os" == *"-"* ]]; do
46: echo "Template's OS and version should include '-', ex: centos-5, debain-6.0, ubuntu-10.04. "
47: read -p "Please enter template's OS and version again : [centos-5]" template_os
48: if [ -z $template_os ]; then
49: template_os=centos-5
50: fi
51: done
52:
53: # 詢問應用系統的名字
54: read -p "Please enter template's application name (ex: standard, moodle, dspace-dlll): [custom] " name
55: if [ -z $name ]; then
56: name=custom
57: fi
58: until [[ "$name" != *"_"* ]]; do
59: echo "Template's application name should NOT include '_', ex: standard, moodle, dspace-dlll."
60: read -p "Please enter template's application name again : [custom] " name
61: if [ -z $name ]; then
62: name=custom
63: fi
64: done
65:
66: # 詢問應用系統的版本號
67: read -p "Please enter template's application version (ex: 5.6-1, 10.04-4): [1.0-0] " version
68: if [ -z $version ]; then
69: version=1.0-0
70: fi
71: until [[ "$version" == *"."*"-"* ]]; do
72: echo "Template's application version should include '.' and '-', ex: 5.6-1, 10.04-4."
73: read -p "Please enter template's application version again : [1.0-0] " version
74: if [ -z $version ]; then
75: version=1.0-0
76: fi
77: done
78:
79: # 詢問樣板的架構
80: read -p "Please enter template's architecture (arch.) (ex: i386): [i386] " template_arch
81: if [ -z $template_arch ]; then
82: template_arch=i386
83: fi
84:
85: template_tar=${template_os}-${name}_${version}_${template_arch}.tar.gz
86:
87: # 確認轉換項目
88: read -p "Do you wish to package container VMID $vmid to template $template_tar? [Y/n] " RESP
89: if [ "$RESP" = "n" ]; then
90: echo "Abort"
91: exit 0
92: fi
93:
94: # 檢查是否有同樣名稱的樣板
95: template_path=${template_dir}${template_tar}
96: if [ -d $template_path ]; then
97: read -p "${template_tar} existed. Do you wish to overwrite it? [Y/n] " overwrite
98: if [ "$overwrite" = "n" ]; then
99: echo "Abort"
100: exit 0
101: fi
102: fi
103:
104: # 停止運作中的虛擬機器
105: echo "Stop VMID $vmid..."
106: vzctl stop $vmid
107:
108: # 開始進行轉換
109: echo "Start to package VMID $vmid to template $template_tar ..."
110: cd $ct_dir
111: tar -czvf --overwrite ${template_path} ./
112:
113: # 完成訊息
114: echo "Package complete!"
115: echo "You can use template $template_tar in your Proxmox VE now."
116: echo "Template location path is $template_path"
117: else
118:
119: # 如果沒有該虛擬機器,則停止腳本檔
120: echo "VMID $vmid not exist"
121: echo "Abort"
122: fi
感謝鳥哥的Shell Scripts教學還有Adam Bellaire的萬用字元教學,這次複習了Shell Scripts很多指令,包括read、test判斷式、until,感覺又對Linux了解更多了一點。Linux的Shell Scripts真是強大,好用。
結語:還要加上系統更新功能 / Conclusion: Need System Update Function
系統整個打包成OpenVZ的虛擬應用樣板之後,我們就能夠方便地把完整的系統提供給其他人使用。這時候再加上系統更新功能,讓他能從GitHub下載最新版程式碼到虛擬機器上,再進行編譯、安裝等動作,那麼就能確保使用者手上拿到的虛擬機器會包含目前最新的程式碼。
實際上我已經做了一個DSpace-DLLL的OpenVZ虛擬應用樣板:centos-5-standard_1.0-0-dspace-dlll.tar.gz。樣板檔案有2.2GB之大,但已經比KVM版本的3.69GB還要小很多了。只要用dspace登入後輸入「./update_system.sh」,就會自動從GitHub下載程式碼、編譯並重新啟動系統喔。
我開始感覺到自己也逐漸邁入一個產品發佈的流程中。實在是很有趣。以後也會逐漸朝向把做好的系統打包成OpenVZ,再搭配GitHub更新系統的功能,然後把這樣子完整的虛擬機器發佈給要使用的人。
可是光有OpenVZ虛擬應用樣板還不購,我還還缺乏Proxmox VE的安裝教學。以後有機會再來寫吧。
修改記錄
- 20130723:將腳本下載網址從https改成http,這樣才能正常下載。而且為文章補上之前忘記加入的類別。