程式扎記: [ Big Data 研究 ] 03 管理 Linux Container 虛擬主機

標籤

2015年8月23日 星期日

[ Big Data 研究 ] 03 管理 Linux Container 虛擬主機

LXC 虛擬主機的進階使用與設定 
目前 LXC 虛擬主機只提供終端機操作介面, 並未提供圖形操作介面, 這是與其他虛擬系統相比的最大差異. 也就是說 LXC 虛擬主機所有的操控, 都是在終端機文字介面下執行. 為何 LXC 虛擬主機並沒有提供圖形操作介面呢? 要了解原因就需要了解 LXC 核心模組與其他虛擬系統的差異. 

目前大部分主流的虛擬系統, 不管事寄居架構 (Hosted Architecture, 例如 VMware Workstation, Virtual Box) 或是裸機架構 (Bare-Metal, 例如 VMware ESXi, Linux KVM), 在架構上可以明確的區分出實體主機 (Host OS) 與 虛擬主機 (Guest OS) 這兩部分, 且兩者的檔案系統相互獨立. 所有的資料的存取與異動, 都需要透過兩層檔案系統的轉換 (虛擬與實體). 即使是裸機架構, 也無法完全避免. 然而 LXC 核心模組的虛擬主機, 則與實體主機共用相同的檔案系統, 對實體主機而言, LXC 虛擬主機的存在就如同一個資料夾, 且虛擬主機與實體主機之間, 共享所有的系統資源!

LXC 虛擬主機的形成, 是以實體主機支援虛擬化的系統核心為基礎, 再以實體主機內部的硬體為資源, 依照所選用的範本, 堆疊出虛擬主機的架構. 這種虛擬主機形成的方式, 就如同 FloppyFW 這套磁片式防火牆一樣, 只需要提供一個作業系統核心, 再給予運作所需要的指令套件, 就能夠組成可以獨立運作的一套作業系統. 在這樣的條件之下, 就 FloppyFW 的虛擬主機而言, 並不需要所謂的桌面套件, 因為這不只會讓整個系統容量變大, 對於實際運作與效能, 並沒有任何助益. 

FloppyFW 的虛擬主機是利用終端機介面來操作, 在相同的概念下, LXC 虛擬主機在原生的架構下, 當然也只需利用終端機介面來操作. 不過現在問題來了, 當我們使用 "sudo lxc-start -n myUS14" 指令來啟動 myUS14 虛擬主機時, 當下的終端機視窗會直接進入虛擬主機之內. 這樣的設計會占用目前的終端機視窗, 這在某些情況下, 其實還蠻不方便的. 那麼該如何操作, 才能同時兼顧並順利的在實體主機與虛擬主機之間切換呢? 

Console 連線模式 
一般在終端機操作命令或執行程式的時候, 等待回應或結果的時間過長, 則終端機就會處於被占用的狀態. 簡單來說就是此時無法利用此終端機再進行其他的工作, 必須等待程式結束, 不然就只好另外開啟新的終端機視窗來作業, 因此比較有經驗的使用者會利用 "&" 參數將程序丟到背景來執行, 釋放此終端機的操作權, 讓使用者可以繼續執行下一命令. 

就 LXC 核心模組來說, 我們也可以使用以下指令將虛擬主機丟到終端機背景執行: 
// -d: 此參數將指定的虛擬主機於背景執行.
# lxc-start -n myUS14 -d
# ps aux | grep lxc-start
root 16625 0.2 0.1 43160 3496 ? Ss 00:22 0:00 lxc-start -n myUS14 -d

此時 myUS14 虛擬主機已經在背景中執行, 這時終端機的操作權會再實體主機上. 而丟到背景執行的程式是可以利用特定指令將其再拉回終端機前景執行. 而在系統背景執行的 myUS14虛擬主機, 也有 LXC 核心模組提供的連線模式, 讓使用者可以直接連接到背景執行的虛擬主機上的終端機. 這樣的連線模式稱為 "Console 連線模式". 

LXC 核心模組提供的 Console 連線模式, 可以讓我們直接連到系統背景中執行的 LXC 虛擬主機, 直接進行系統的設定與管理. 透過指令 lxc-console 並使用下面命令可以讓你進入背景執行的 myUS14 虛擬主機: 
// -n, --name=NAME NAME for name of the container
// -t, --tty=NUMBER console tty number
// -e, --escape=PREFIX prefix for escape command

# lxc-console -n myUS14
Connected to tty 1
Type to exit the console,  to enter Ctrl+a itself

Ubuntu 14.04.3 LTS myUS14 tty1

myUS14 login:

利用 Console 連線模式進入 LXC 虛擬主機後, 在任何情況下, 不管是否已經登出, 按下 "Ctrl+a" 的組合鍵再按下 "q" 鍵就可以脫離 Console 連線模式回到實體主機的終端視窗. 接著我們可以透過指令 lxc-ps 得知有多少 LXC 虛擬主機運行於背景中: 
 

自訂 Linux 指令 
一個完整的指令 "shutdown -h now", 對熟悉 Linux 的人來說, 或啥沒什麼. 但對一般使用者要記住這些繁雜的指令與參數, 就非常不容易. 為了操作與管理上的方便性, 這時就可以使用 "alias" 來簡化需多常用指令與參數組合. "alias" 又成別名, 簡單來說就是利用 alias 設定一個自訂指令, 來替代並簡化原本一長串參數的指令列. 如果是個別使用者設定, 可以將 alias 設置於 /home/<user>/.bashrc 裡面 ( 為個別使用者名稱); 如果是全域的設定, 則可以設定到 /etc/profile 中. 底下是後面範例會使用的別名設定: 
  1. alias ping='ping -c 4'  
  2. alias bye='sudo shutdown -h now'  
Linux 虛擬主機系統中文化 
安裝的 LXC 虛擬主機預設為英文語系, 若想支援中文顯示, 可以安裝中文語系的套件包, 使用下面指令來安裝: 
# apt-get install language-pack-zh-hant
...
Generating locales...
zh_HK.UTF-8... done
zh_TW.UTF-8... done
Generation complete.

安裝完成之後, 還需要再 /etc/profile 檔案內指定以中文語系為主: 
  1. export LANG=zh_TW.UTF-8  
  2. export LANGUAGE=zh_TW.UTF-8  
設定完畢後, 使用指令 'exit' 登出系統後再重新登入才能使設定生效. 

管理多部 LXC 虛擬主機 (終端機分頁) 
當 LXC 虛擬主機的數量只有少數幾台時, 以 Console 連線模式來管理還算可行, 但是虛擬主機的數量一多起來, 就不太適合這種在單一終端機下的連線模式. 一般的終端機視窗, 一次只能連線到一台虛擬主機, 且也只能看到單一虛擬主機的運作狀況, 想要一次管理多台虛擬主機, 較直覺的方式大概就是連續開啟多個終端機視窗, 並連接到不同的虛擬主機. 但最大的缺點就是這些連續開啟的終端機視窗會將螢幕佔的滿滿的, 非常不方便. 面對這種情況, 若要簡化終端機管理的頁面, 就需要利用到終端機視窗的分頁模式. 

所謂的分頁模式, 就是在單一終端機視窗內, 產生多個頁面, 就像是瀏覽器開啟多個分頁瀏覽網頁一樣. 而這樣的好處就是可以節省桌面被占用的空間, 在管理上也可以比較直覺且不容易搞混. 另外啟動分頁時, 也可以附加執行特定的指令, 只需要撰寫客製化的 "Bash Script", 就可以再啟動分頁時一併執行. 

在實體主機目前的使用者家目錄中, 使用下面指令, 建立名稱為 "srvlxc" 的 Bash Script 程式, 而程式的名稱可依讀者需求自行設定, 接著輸入以下程式內容: 
- srvlxc 
  1. #!/bin/sh  
  2. "$#" != "1" ] && echo "srv.sh lxc-system" && exit 1  
  3.   
  4. p=$(ps aux)  
  5. echo $p | grep "lxc-start .n $1 .d" &>/dev/null  
  6.   
  7. if [ "$?" == "0" ]; then  
  8.     echo -n "Press a to connect; c to close:"  
  9.     read ans  
  10.     if [ "$ans" == "a" ]; then  
  11.         sudo lxc-console -n $1  
  12.     elif [ "$ans" == "c" ]; then  
  13.         sudo lxc-stop -n $1  
  14.     fi  
  15. else  
  16.     echo -n "$1 starting..."  
  17.     sudo lxc-start -n $1 -d &>/dev/null  
  18.     p=$(ps aux)  
  19.     echo $p | grep "lxc-start .n $1 .d" &>/dev/null  
  20.     [ "$?" != "0" ] && echo "Fail!" && exit 1  
  21.     sleep 6  
  22.     echo "Success!"  
  23.     lxc-console -n $1  
  24. fi  
程式輸入完畢後, 使用下面指令賦予此程式執行權限: 
# chmod +x srvlxc

接著來設定終端機分頁, 點選終端機上的 "檔案" -> "新增設定組合", 此時系統會跳出 "新增設定組合" 的視窗, 在 "設定組合名稱" 的欄位上, 填入自訂的的終端機分頁名稱, 而此分頁名稱也是執行 "srvlxc" 程式所需要的輸入參數, 也就是我們要啟動的虛擬主機名稱: 
 

接著點選 "建立", 就會跳出 "正在編輯設定組合 myUS14" 的視窗, 請按照下面步驟完成設定: 
 
(上面的 /home/root/srvlxc 路徑改為你自己的路徑, 並加上 sudo 確保沒有權限問題

設定完成點擊 "關閉/Close" 來關閉設定視窗. 接著回到終端機視窗, 從上方工具列點選 "檔案" -> "開啟分頁" 並點選 "myUS14" 選項: 
 

執行後可以發現新的分頁 "myUS14" 如下: 
 

批次啟動及關閉終端機分頁 
若每次都需要啟動多台虛擬主機, 則可以使用下面指令建立批次啟動終端機分頁的程式 "startMultiCant" 
# vi startMultiCant
  1. #!/bin/sh  
  2. gnome-terminal --geometry 90x45 --tab-with-profile=myUS14 --tab-with-profile=myCentOS  

接著可以使用 "chmod +x startMultiCant" 讓該 Bash Script 具備執行權限, 並執行該 Bash Script 確認 "myUS14" 與 "myCentOS" 虛擬主機有同時在不同分頁被啟動: 
$ lxc-ls // 檢視現有啟動的虛擬主機
$ ./startMultiCant // 同時啟動虛擬主機 "myUS14" 與 "myCentOS"



Supplement 
04 管理 Linux Container 虛擬網路 - Part1
04 管理 Linux Container 虛擬網路 - Part2

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!