:::

將OpenVZ架設的虛擬機器轉換為虛擬應用樣板的作法 / Package OpenVZ Container to Template

將OpenVZ架設的虛擬機器轉換為虛擬應用樣板的作法 / Package OpenVZ Container to Template

800px-OpenVZ-logo

使用Proxmox VEOpenVZ建立好虛擬機器(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

image

要使用OpenVZ,Proxmox VE絕對是目前的首選。這篇的指令也是基於Proxmox VE 3來測試。但是因為Proxmox VE 1跟2的目錄結構都一樣,所以也一樣可以使用這篇文章的教學來製作虛擬應用樣板。至於其他的OpenVZ系統,我就不敢保證了。

因為我們要把既有的虛擬機器轉換成虛擬應用樣板,所以Proxmox VE裡面必須要有一台以OpenVZ架設的虛擬機器。在此我用VMID (虛擬機器的ID編號) 100的ownCloud作為轉換的對象。

image

打包的動作是要用指令列來操作,而且必須要有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,這樣才能正常下載。而且為文章補上之前忘記加入的類別。
(more...)

Sublime Text 2取消更新通知的方法 / Disable Sublime Text 2 “Update Available” notification

布丁布丁吃布丁

Sublime Text 2取消更新通知的方法 / Disable Sublime Text 2 “Update Available” notification

image

文字編輯器中的神器Sublime Text 2最近推出更新版本了,而編輯器在每次開啟時都會跳出提醒視窗叫你更新。如果沒有堅持要更新的話,以下我將介紹關閉Sublime Text 2通知更新的方法。

Sublime Text 2's new version comes up recently. If you don't want to upgrade Sublime Text 2, you can turn off the upgrade notification by modifying the configuration. Following is the guide to modify the configuration.


更新通知 / Update Available

image

最近因為Sublime Text 2推出了新版本,所以每次開啟Sublime Text 2的時候,它都會跳出更新通知:

Update Available

A new version of Sublime Text 2 is available, download now?

我用現在版本用得好好的,沒特別想更新,就覺得這個更新通知真是擾人,真想關掉它。

開啟Settings-User / Open Settings-User

image

首先是開啟工具列上的「Preferences」,然後進入「Settings-User」(設定 - 使用者)。因為我的Sublime Text 2被我設定過中文化了,所以這裡顯示的是「設定 - 使用者」。

加入設定"update_check": false / Add Configuration: "update_check": false

image

Settings – User的內容是一個JSON設定檔。

Sublime Text 2就是全部都以這種設定檔來調整系統的功能,跟傳統Windows軟體上透過GUI來操作設定的方式有很大的差異,一開始會有點不習慣。而在這裡也不會顯示所有參數,如果要關閉更新的話,我們需要額外加入「"update_check": false」的設定。

上圖加入設定之後會變成以下。注意紅字的地方,還有一個逗號:

{
"color_scheme": "Packages/Color Scheme - Default/Slush & Poppies.tmTheme",
"font_size": 14,
"ignored_packages":
[
"Vintage"
],
"update_check": false
}

改完之後會變成下圖,直接儲存就可以了。

image

這樣子以後開啟Sublime Text 2的時候,它就不會再跳出要你更新的通知囉。


資料來源 / Solution From Sublime Forum

以上的解法來自於Sublime Forum中的討論串「Disable "Update Available" pop up?」,感謝NikKlaus的解說。

更新記錄

  • 2013/7/14 當初這篇寫得有點匆促,現在多補一些介紹,讓整篇看起來有頭有尾比較完整。
(more...)

Zentyal 3.0動手做模組入門 / Zentyal 3.0 Module Development

Zentyal 3.0動手做模組入門 / Zentyal 3.0 Module Development

image

Zentyal是一個強大的路由器套裝軟體,他也提供了客製化製作模組的功能。我參考Zentyal的說明建立了一個修改SSH連接埠的功能,並記錄一下製作模組時的一些步驟。

Zentyal is a powerful Router and could install custom module. Base on Zentyal module development tutorial, I created a SSH module for modifying SSH port. Following is my create steps.


安裝Zentyal / Install Zentyal & Configuration

image

我安裝的是zentyal-3.0-2-amd64.iso,Zentyal 3.0 64位元版本。安裝在VirtualBox上,並配置兩張網卡:eth0為Host-only,設定為內網;eth1為NAT,作為外網。

我將預設帳號設為Linux的root群組,以省去每次都要sudo的困擾。所以下指令我都不用sudo,因為已經假設是root權限了。

然後我也關閉了Zentyal的桌面功能,作法參考這篇,語法是:

sudo mv /etc/init/lxdm.conf /etc/init/lxdm.conf.nostart

最後我安裝了pound作為後續研究的需要,語法是:

apt-get install pound

Zentyal雖然不難裝,但是也有些稜稜角角的小細節需要額外下指令去克服。詳細安裝細節此處就省略。

Zentyal模組開發教學 / Zentyal module development tutorial

Zentyal已經提供了模組開發教學的網頁文件。我大致上是照著這個步驟來操作,不過有遇到一些問題,此篇一一記錄細節。

安裝開發環境 / Development Environment

要開發Zentyal的模組需要安裝很多東西,以下列出我安裝的東西:

apt-get install build-essential gcc zbuildtools fakeroot

然後在家目錄中下載Zentyal的鷹架工具skel,並調整鷹架工具的權限:

wget https://raw.github.com/Zentyal/zentyal/master/extra/scripts/zentyal-module-skel
chmod +x zentyal-module-skel

這樣就準備好可以開發了。

建立SSH模組鷹架 / SSH Module Scaffolding

我們可以用鷹架工具skel來建立SSH模組鷹架。現在位置是在家目錄(cd ~)底下,指令為:

./zentyal-module-skel SSH ssh

然後就冒出一個空的模組啦。這到這邊為止的進度是教學中的Scaffolding

修改SSH模組 / Revise SSH Module

鷹架模組無法正常運作,所以我們要進行修改。修改的方式教學中寫得很清楚,請看這個網頁。修改之後的結果請看我上傳到GitHub的程式碼

主要修改的程式為:

跟教學文件相比,修改的差異在於設定檔是SSH的/etc/ssh/sshd_config,而參數的樣板service.conf.mas也差異很大。

必須特別要說明的是在參數樣板中要加入#開頭的註解文件時,必須要用以下語法來加入:

% print "# the setting of \"PermitRootLogin without-password\".\n";

注意雙引號""中間要記得脫逸,還有最後要加上\n表示換行。

編譯並安裝SSH模組 / Compile & Install SSH Module

編譯的方法是先移動到模組目錄,然後輸入zentyal-package指令:

cd ~/ssh
zentyal-package

編譯成功的話,模組目錄底下會冒出debs_ppa,裡面是可以安裝的檔案。再來就是安裝編譯好的檔案:

dpkg -i ~/ssh/debs-ppa/zentyal-ssh_3.0_all.deb

如果安裝時沒有特別的錯誤,那就是安裝完成了。我猜這個安裝檔應該可以轉給其他Zentyal系統,讓他們也能安裝你自己製作的模組。

啟用SSH模組 / Enable SSH Module

image

安裝好SSH模組之後,導覽列Core底下會出現SSH。但是它目前還沒啟動,要先到Module Status中,在SSH的Status裡打勾,然後再右上角Sava changes。

這樣就之後就可以正常使用SSH模組了。


結語:只是開始 / Conclusion: Just Begin…

摸了一整天總算搞懂怎麼修改Zentyal。意外地發現它的工具寫得很好用,也不難理解。只是一些細節它沒有說明,讓我試誤了好一陣子。這些細節解決之後,我想要開發新功能應該是得心應手吧。

我目前想要做一個整合pound反向代理伺服器的功能。然後再做一個DNS + NAT Port Forwarding + Reverse Proxy綜合控制的介面,讓管理者可以一口氣在一個介面設定這些東西。

不過目前進度到這邊得暫停來做一下開會的準備了orz

(more...)

Windows用工作排程器設定開機啟動軟體的關閉方式 / Disable Auto Startup Programs in Window Task Scheduler

布丁布丁吃布丁

Windows用工作排程器設定開機啟動軟體的關閉方式 / Disable Auto Startup Programs in Window Task Scheduler

image

如果你想要調校Windows作業系統,Windows開機程式的管理是非常關鍵的調校項目。但是在Windows Vista之後,有些開機時自動執行的程式居然跑到「工作排程器」去了,讓我找老半天都找不到。這篇以AsusSetup遇到的問題,來跟大家說明如何關閉工作排程器當中它自動啟動的項目。

If you want to tune your Windows better, it's very important to manage Windows' auto startup programs. Since Windows Vista, some programs set their auto startup configuration in Task Scheduler. Following I will show you how to disable programs' auto startup in Task Scheduler.


開機時自動跑出的錯誤:Asus Setup / Auto Startup Error Message

image

我的電腦是使用Asus主機板。裝了Asus的驅動程式之後,它在不知道什麼時候開始就常常跑出這個訊息:

AsusSetup

Can’t find target.ini:

E:\Drivers\Chipset\Win7_XP\Driver\Chipset\AsusSetup_hotfix.ini

找了好久,最後才在ASUS主機板論壇找到工作排程器(Task Scheduler)的解決方法

傳統的開機管理程式:msconfig / Traditional Startup Management: msconfig

image

在「執行」中輸入「msconfig」就會出現「系統設定」對話視窗,在這邊的「啟動」頁面中會列出幾乎所有Windows會啟動的項目。一般來說,如果要關閉開機時自動啟動的程式,就在msconfig這邊處理就好。但是在這邊卻找不到這次遇到的Asus Setup問題。

工作排程器 / Task Scheduler

從Windows Vista開始,Windows引入了比Window XP那時候「排定的工作」還要完整的「工作排程器」。也不知道是不是從這時候開始,居然有些程式會把開機執行的項目放到工作排程器當中,像是這次的AsusSetup。

image

工作排程器的位置在「所有程式」 > 「附屬應用程式」> 「系統工具」 > 「工作排程器」當中。

image

很快我們就可以在左邊找到「ASUS」,然後發現他底下有兩個工作都是「當任何使用者登入時執行」,就是它們了。

image

按右鍵「停用」它們吧。這樣它們下次開機就不會再啟動了。


結語:希望有更完整的開機管理工具 / Conclusion: We Need Comprehensive Startup Management Tzool

image

雖然Windows的開機管理程式已經很多了,最近大家都在講的就是WhatInStartup,我自己常常用的是Code Stuff Starter(上圖)。不過這些軟體目前都無法管到工作排程器,這是開機管理程式中的漏網之魚。希望未來會有更好用的工具可以連工作排程器一起管理啊。

(more...)