2015年8月22日 星期六

[ Big Data 研究 ] 02 安裝與認識 Linux Container



認識 Linux Container (LXC)
使用 Linux Container 可以不需要透過虛擬化平台 (Hypervisor) 來模擬所有的硬體裝置, 而是可以直接使用實體主機的硬體裝置, 讓虛擬化的主機能達到最大效能. Linux Container 或稱 Linux 容器系統, 也簡稱 LXC, 其本身僅提供最低程度虛擬化 (硬體) 的功能, 並利用兩個系統管理模組 "cgroup" 與 "AppArmor" 來有效管理, 控制並隔離虛擬與實體主機之間的資源運用. 另外 Linux Container 並不需要透過複雜的程序, 來解譯主機與實體主機間的 CPU 指令運算, 或是周邊裝置的虛擬化, 簡單來說 Linux Container 可以直接使用實體主機上的軟硬體資源, 而最特別的地方就是 Linux Container 與實體系統共用相同的核心與函示庫.

Linux Container 的技術是由 IBM 所開發, 除早期運用在 IBM 的大型主機上面, 也存在一些非 Linux 的系統之中, 直到 Linux 核心版本 2.6.29 之後, 才開始支援 Linux 作業系統.

安裝 LXC 核心模組
這邊使用 Ubuntu Desktop 14.04 LTS (Gnome 64bits) 作業系統, 作為後續建立 Hadoop Cluster 的 Host 系統, 系統安裝完成後請開啟終端機, 並使用下面指令進行更新:
# apt-get update // 下載最新套件清單
# apt-get upgrade // 升級已安裝套件
# uname -r // 確認核心版本
3.19.0-25-generic

接著使用下面指令開始安裝 Linux Container 核心模組:
# apt-get install lxc

安裝完畢後讓我們來確認到底 LXC 核心模組可以安裝那些作業系統. 不管是著名的 Linux 分支如 CentOS, Debian, 或是客製化的 Linux 作業系統 (例如 Busybox, sshd) 基本上都能安裝, 而 LXC 核心模組與實體主機共用相同的 Linux 核心, 因此在 LXC 核心模組中, Windows 作業系統就出局了!

LXC 虛擬主機建置範本
不過並不是所有的 Linux 延伸出來的分支都可以透過 LXC 核心模組的線上安裝模式, 安裝到實體主機之內, 我們可以使用下面指令來查詢目前版本的 LXC 核心模組內, 可以支援安裝那些 Linux 的作業系統:
# ll /usr/share/lxc/templates/
total 344
drwxr-xr-x 2 root root 4096 Aug 22 00:04 ./
drwxr-xr-x 6 root root 4096 Aug 22 00:04 ../
-rwxr-xr-x 1 root root 10847 Jul 17 09:49 lxc-alpine*
-rwxr-xr-x 1 root root 13533 Jul 17 09:49 lxc-altlinux*
-rwxr-xr-x 1 root root 10253 Jul 17 09:49 lxc-archlinux*
-rwxr-xr-x 1 root root 9897 Jul 17 09:49 lxc-busybox*
-rwxr-xr-x 1 root root 28932 Jul 17 09:49 lxc-centos*
-rwxr-xr-x 1 root root 10486 Jul 17 09:49 lxc-cirros*
-rwxr-xr-x 1 root root 15629 Jul 17 09:49 lxc-debian*
-rwxr-xr-x 1 root root 17427 Jul 17 09:49 lxc-download*
-rwxr-xr-x 1 root root 47200 Jul 17 09:49 lxc-fedora*
-rwxr-xr-x 1 root root 27812 Jul 17 09:49 lxc-gentoo*
-rwxr-xr-x 1 root root 13961 Jul 17 09:49 lxc-openmandriva*
-rwxr-xr-x 1 root root 13921 Jul 17 09:49 lxc-opensuse*
-rwxr-xr-x 1 root root 35445 Jul 17 09:49 lxc-oracle*
-rwxr-xr-x 1 root root 11868 Jul 17 09:49 lxc-plamo*
-rwxr-xr-x 1 root root 6851 Jul 17 09:49 lxc-sshd*
-rwxr-xr-x 1 root root 24284 Jul 17 09:49 lxc-ubuntu*
-rwxr-xr-x 1 root root 12401 Jul 17 09:49 lxc-ubuntu-cloud*

上面就是目前 LXC 核心模組可以安裝的 Linux 作業系統, 那麼這些範本是什麼? 簡單的說就是安裝對應的 Linux 作業系統所需要的建置指令, 由 Bash Script 撰寫. 內容就是安裝此作業系統的相關設定與所需下載的檔案. 換句話說就是如果可以了解整個設定檔的內容, 那要創造一個自訂的 Linux 作業系統範本也是可以辦到的.

建立 LXC 虛擬主機
接下來我們就實際透過 LXC 核心模組的指令, 來安裝 Ubuntu 系統上的虛擬主機, 首先在實體主機的終端輸入命令如下:
// -t, --template=t Template to use to setup container
// -n, --name=NAME NAME for name of the container

# lxc-create -t ubuntu -n myUS14
Checking cache download in /var/cache/lxc/trusty/rootfs-amd64 ...
Installing packages in template: ssh,vim,language-pack-en
Downloading ubuntu trusty minimal ...
...

上面是簡易的安裝模式, 選擇了與實體主機相同的作業系統範本來建立 LXC 虛擬主機. 如果實體主機是 x86_64 的系統, 則安裝的 LXC 虛擬主機也會是 x86_64. 當然若是加入適當的參數如 "lxc-create -t ubuntu -n lpdev -r lucid -a i386", 這個指令明確的指定要安裝的 Ubuntu 版本為 lucid; 與 i386 的 CPU. 若要安裝名稱為 "myUS12"; 作業系統為 Ubuntu 12.04 64bits 位元的 LXC 虛擬主機, 可以參考下面命令:
# lxc-create -t download -n myUS12 -- --dist ubuntu --release precise --arch amd64

作業系統安裝的時間長短, 幾乎取決於網路的速度, 因為大部分所需要的套件, 都需要經過網路下載後再安裝, 等待安裝完成之後會有如下畫面:


圖中註解符號 (#) 內的訊息就是登入 myUS14 虛擬主機的預設使用者帳號及密碼, 以安裝 Ubuntu 模板的虛擬主機來說, 預設的帳號密碼都是 'ubuntu'. 那安裝好的系統到底在哪裡呢? 這個時候我們就需要使用到 "tree" 這個指令, 以樹狀的方式顯示目錄內容:


在主要的檔案結構中, "config" 就是虛擬主機的設定檔案, 而虛擬主機的系統目錄則是在 "rootfs" 之中.

啟動與使用 LXC 虛擬主機
安裝好虛擬機之後, 只需要利用以下指令就可以啟動該虛擬機, 並以終端機連線模式進入虛擬機的登入畫面:
# lxc-start --help
Usage: lxc-start --name=NAME -- COMMAND

lxc-start start COMMAND in specified container NAME

Options :
-n, --name=NAME NAME for name of the container
-d, --daemon Daemonize the container
-F, --foreground Start with the current tty attached to /dev/console (default)
-p, --pidfile=FILE Create a file with the process id
-f, --rcfile=FILE Load configuration file FILE
-c, --console=FILE Use specified FILE for the container console
-L, --console-log=FILE Log container console output to FILE
-C, --close-all-fds If any fds are inherited, close them
If not specified, exit with failure instead
Note: --daemon implies --close-all-fds
-s, --define KEY=VAL Assign VAL to configuration variable KEY
--share-[net|ipc|uts]=NAME Share a namespace with another container or pid
...

# lxc-start -n myUS14
...
 

myUS14 虛擬機啟動後會停留在載入系統的狀態, 必須先按下 Enter 鍵, 接著輸入帳號密碼 (ubuntu/ubuntu) 便可以成功登入虛擬機. 登入之後如同一般新裝好的系統, 接下來就是系統套件版本的檢查更新與升級, 以 Ubuntu 系統來說可以使用下面命令完成:
$ sudo apt-get update
$ sudo apt-get upgrade

LXC 虛擬主機上的操作與指令完全跟實體主機一模一樣, 不僅如此還可以發現系統整體的反應速度幾乎跟實體主機相同, 光這點就可以強過使用 Hypervisor 的其他虛擬技術.

關閉 LXC 虛擬主機
關閉啟動的虛擬主機有兩個方法:
1. 直接在 LXC 虛擬主機終端機輸入 "sudo shutdown -h now" 命令, 就可以關閉 LXC 虛擬主機並回到實體主機視窗.
2. 在實體主機終端, 利用 LXC 核心模組的系統指令 "lxc-stop" 來關閉 LXC 虛擬主機, 例如 "sudo lxc-stop -n myUS14"

複製與刪除 LXC 虛擬主機
LXC 核心模組有提供複製虛擬主機的指令 lxc-clone, 來直接複製現有的 LXC 虛擬主機, 我們可以使用下面命令來複製 myUS14 虛擬主機:
// -o myUS14: 指定要複製的 LXC 虛擬主機名稱, 此虛擬主機存在於 /var/lib/lxc 路徑內
// -n myUS14_Backup: 指定新的 LXC 虛擬主機名稱, 複製出來的虛擬主機會存放在 /var/lib/lxc 路徑內

# lxc-clone -o myUS14 -n myUS14_Backup
lxc_container: lxccontainer.c: lxcapi_clone: 2673 error: Original container (myUS14) is running
clone failed
// 停止虛擬機 myUS14
# lxc-clone -o myUS14 -n myUS14_Backup
Created container myUS14_Backup as copy of myUS14
# lxc-start -n myUS14_Backup // Double check 複製的虛擬機能被啟動

複製的虛擬主機跟 myUS14 虛擬主機都會放在 /var/lib/lxc 目錄下. 既然可以複製 LXC 虛擬主機, 當然也可以刪除 LXC 虛擬主機. 使用命令 lxc-destroy 如下:
# lxc-destroy -n myUS14_Backup
# lxc-start -n myUS14_Backup // 確認虛擬機 myUS14_Backup 已經被刪除
lxc-start: lxc_start.c: main: 296 Executing '/sbin/init' with no configuration file may crash the host

建立 CentOS 虛擬主機

建立 CentOS 虛擬主機
目前版本的 LXC 核心模組, 可以透過現有的範本, 安裝需多熱門的 Linux 分支系統, 像是 CentOS, 就是許多人或是公司企業會安裝的 Linux 作業系統之一. 原因之一就是 CentOS 與 RedHat 具有相同的系統架構, 卻又擁有如同 Fedora 的擴充性與自由度, 所以安裝的使用者相當多.

這邊我們接著介紹如何在 Ubuntu 系統的實體主機上面, 利用 LXC 核心模組來安裝 CentOS 系統的虛擬主機. 不過安裝前必須了解一件事, 雖然 Ubuntu 與 CentOS 都是 Linux 系統, 也都可能擁有相同的核心版本, 但是撇除操作介面的差異不說, 兩者最大的差別就是套件的安裝與管理方式. 簡單的來說 Ubuntu 是透過 "apt-get", 以線上的方式來進行套件的安裝, 移除與升級; 而 CentOS 是透過 "yum". 不過在我們的實體主機, 也就是安裝 LXC 核心模組的 Ubuntu 系統內, 實際上並存在 "yum" 這一個管理套件, 且實際安裝 CentOS 虛擬主機時, 也需要用到 "yum" 的指令, 所以要安裝 CentOS 虛擬主機就必須先在實體主機內安裝 "yum" 這一個套件. 安裝指令如下:
# apt-get install yum

套件安裝完畢後, 就可以利用 LXC 核心模組的指令 lxc-create 來建立一台名為 "myCentOS" 的 CentOS 虛擬主機:
# lxc-create -t centos -n myCentOS

在安裝好 myCentOS 虛擬主機之後, 系統會提示該虛擬主機預設的帳號密碼. 接著下面透過命令 chroot 變更該虛擬機的 root 密碼:
# chroot /var/lib/lxc/myCentOS/rootfs/ passwd
Changing password for user root.
New password:
 // 輸入 root 的密碼
Retype new password: // 再次輸入 root 的密碼
passwd: all authentication tokens updated successfully.

啟動 CentOS 虛擬主機
接著使用 LXC 核心模組指令 lxc-start 啟動剛剛建立的 CentOS 虛擬主機:
# lxc-start -n myCentOS
...
Starting sshd: [ OK ]

login:
 root
Password: // 輸入 root 的 password
[root@myCentOS ~]#

剛建立的 myCentOS 虛擬主機初期只會有 root 這一個帳號, 所以第一次登入只能使用 root 登入.

認識 CentOS 虛擬主機的檔案結構
理論上在 LXC 核心模組內, 利用範本所安裝的各種虛擬主機, 在檔案結構上應該都是相同的, 但事實上並不然. 先讓我們利用前面使用過的 "tree" 指令來比較一下安裝 Ubuntu 系統的虛擬主機與安裝 CentOS 系統的虛擬主機在檔案結構上的差異:


由上可以發現安裝 Ubuntu 系統的虛擬主機 (myUS14) 與安裝 CentOS 系統的虛擬主機 (myCentOS), 最大的差別在於 CentOS 虛擬主機目錄下並無檔案 "fstab". 不過有無該檔案對於 LXC 核心模組的虛擬主機而言, 到底有何差異? 其實差別就在於虛擬主機有無權限可以使用實體主機的檔案儲存設備 (或資料夾) 的資源! "fstab" 這個檔案的內容就是在控制實體主機的檔案儲存設備的讀取權限, 簡單來說有了這個檔案, LXC 虛擬主機就可以讀取實體主機的外接儲存裝置, 相關的設定會在後續章節介紹.

設定 CentOS 虛擬主機的固定 IP 
後續會介紹如何建立並連結多台虛擬主機, 以組成 Hadoop 分散式運算平台, 而虛擬主機預設都是由 LXC 核心模組的 DHCP Server 直接派發 IP 位址給虛擬主機並使用預設的網路區段為 "10.0.3.x" 如下所示:


若虛擬主機都使用浮動的 IP 位址, 在連結多台虛擬主機上, 將會造成很大的困擾, 為了管理與後續操作上的方便, 我們可以先來了解如何設定虛擬主機使用固定 IP 位址. 在設定之前, 為了後續編輯檔案上的直覺與便利性, 我將使用 "vim" 這套文字編輯器進行設定檔的編輯. 在 CentOS 中可以如下安裝設置:
[root@myCentOS ~]# yum install vim

接著使用下面命令來編輯 "虛擬主機網路卡設定檔":
# vim /etc/sysconfig/network-scripts/ifcfg-eth0 // 設定虛擬機使用固定 IP=10.0.3.88/24
  1. DEVICE=eth0  
  2. #BOOTPROTO=dhcp  
  3. BOOTPROTO=none  
  4. ONBOOT=yes  
  5. HOSTNAME=  
  6. NM_CONTROLLED=no  
  7. TYPE=Ethernet  
  8. MTU=  
  9. DHCP_HOSTNAME=myCentOS  
  10. IPADDR=10.0.3.88  
  11. NETMASK=255.255.255.0  
  12. GATEWAY=10.0.3.1  
  13. DNS1=168.95.1.1  
  14. DNS2=8.8.8.8  
# service network restart // 重啟網路
# ifconfig -a // 檢視網路設定生效
eth0 Link encap:Ethernet HWaddr FE:3D:B7:72:3F:50
inet addr:10.0.3.88 Bcast:10.0.3.255 Mask:255.255.255.0
...

# ping -c 3 www.google.com.tw // 確定虛擬機可以連到 Internet
PING www.google.com.tw (64.233.187.94) 56(84) bytes of data.
64 bytes from tj-in-f94.1e100.net (64.233.187.94): icmp_seq=1 ttl=127 time=61.1 ms
64 bytes from tj-in-f94.1e100.net (64.233.187.94): icmp_seq=2 ttl=127 time=72.1 ms
64 bytes from tj-in-f94.1e100.net (64.233.187.94): icmp_seq=3 ttl=127 time=76.4 ms


Supplement
03 管理 Linux Container 虛擬主機 
LXC container libvirt on CentOS 7
Introduction to Containers on Linux using LXC
In this episode, I wanted to give you an Introduction to Containers on Linux using LXC. We will look at what Containers are as a concept, why they are useful, and then move onto a live demo of what a Container looks like on a real system using LXC...

CentOS6 使用 LXC
How To Install Java on Ubuntu with Apt-Get
# sudo apt-get install default-jre
Or 
# sudo apt-get install default-jdk

This message was edited 43 times. Last update was at 22/08/2015 22:44:19

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...