利用 Xen 設計虛擬機器

reference: 鳥哥 http://linux.vbird.org/linux_enterprise/xen.php
感謝鳥哥詳細說明:
所需要的 Xen 套件與核心:
需要安裝的套件主要有:
kernel-xen:修改的 Linux 核心,使可以跑 Xen 的環境;
xen:主要的 xen 套件,包括設定檔、啟動腳本、所需的基本函式庫等;
xen-libs:Xen 所需要的函式庫等;
python-virtinst:提供終端機安裝的軟體;
virt-manager:為一個圖形使用者介面軟體,可在圖形介面管理 xen 喔!
在 CentOS 5.x 的環境下,妳可以使用 yum 直接來安裝這幾個套件。安裝完畢後請務必使用新的核心開機!
然後重新啟動這部 Linux 主機喔!啟動完成後,應該再次的確認一下是否為 xen 的核心才行!
[root@linux ~]# uname -r
[root@linux ~]# chkconfig --list | grep xen

xend        0:off  1:off  2:on   3:on  4:on  5:on  6:off
xendomains  0:off  1:off  2:off  3:on  4:on  5:on  6:off
[root@linux ~]# pstree -p | grep xen

|            |-xenbus(10)
        |            `-xenwatch(9)
        |-xenconsoled(2348)---{xenconsoled}(2349)
        |-xenstored(2340)

xm list
Name                  ID Mem(MiB) VCPUs State   Time(s)
Domain-0               0      462     1 r-----     49.2
xen 的套件結構:
我們前面談到過, Xen 在 domain-0 是由一個 xend 的服務所管理的,他可以用來啟動、關閉與連結到其他的 domain-U 當中。此外, Xen 亦提供許多的指令來讓系統管理員管理他們的 domain-U 啊!這些重要的啟動執行檔為:

/usr/sbin/xend:就是 xend 的啟動腳本,使用 python 程式語言寫成的;
/usr/sbin/xm:重要的管理 xen 的指令,可輸入 xm help 查詢用法。
至於與 xen 有關的設定檔,包括一些模擬元件的啟動腳本都在 /etc/xen 底下,在這個目錄下的許多資料為:

/etc/xen/xend-config.sxp: 是 xend 的設定檔!內容包括 domain-0 的類型、網路的連結方式、 domain-0 的記憶體與CPU等資源配置、是否使用 vnc 作為 domain-U 的連線方式等等。
/etc/xen/:裡面含有數個 domain-U 的設定檔範本,包括:xmexample1, xmexample.hvm。 其中,那個 xmexample.hvm 可作為完整模擬的參考範本喔!
/etc/xen/auto:如果妳想要在系統開機時就自動啟動某個 domain-U 的話,可以將該設定檔指定連結到這個目錄中。
/etc/xen/scripts:這目錄有趣了!包括虛擬設備的啟動、虛擬網路的啟動、 虛擬橋接器的啟動等等,都是透過這目錄底下的所有檔案來達成的!
第一個泛用實例
在主機上的所有 Linux OS 都需要自己能夠開機, 而開機流程通常是這樣的:(註8)
step 1: 按下電源,主機開始讀取 BIOS 資料;
step 2: 取得開機的裝置順序,並由 MBR 取得開機選單與開機管理程式;
step 3: 由開機管理程式載入 Linux kernel 及虛擬磁碟 (initrd);
step 4: Kernel 偵測硬體載入適當的驅動程式,並掛載根目錄以讀取核心模組;
step 5: 開始由 /sbin/init 程式設定主機的環境。

由上述的動作,我們可以知道 Linux 開機的重點在於 1. 核心 2. 虛擬磁碟 (initrd) 及 3. 根目錄 (/) 了。 雖然核心與虛擬磁碟我們的 CentOS 5 已經提供了,但是預設的虛擬磁碟好像並未主動的加入 Xen 的某些驅動程式, 因此我們得需要針對虛擬磁碟進行設定才好。此外,每個 Xen domain 的根目錄也很傷腦筋的!因為根目錄需要很多資料,而且還需要掛載類似 /sys, /proc, /dev, /selinux 等特殊的檔案系統哩! 那該如何處理根目錄呢?底下就讓我們來處理處理:

根目錄所需磁碟槽

範例:建立一個 5GB 的大檔案
[root@linux ~]# mkdir -p /disk2/xen
# 因為鳥哥的 /disk2 為一顆額外的硬碟,所以容量比較大啦!

[root@linux ~]# cd /disk2/xen
[root@linux xen]# dd if=/dev/zero of=xen.img bs=1M count=5000
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB) copied,178.482 秒,29.4 MB/s
# 這個時候會開始創造一個 5GB 左右的檔案,由於硬碟速度快慢的關係,
# 這個動作可能會消耗數分鐘到數十分鐘不等。

[root@linux xen]# ll /disk2/xen
-rw-r--r-- 1 root root 5242880000 Oct 10 00:30 xen.img
檔案是建立起來了,不過如果你的 Linux 有啟動 SELinux 的話,還需要一些類型的改變才可以! 其實動作也不難,這樣做就對了!

[root@linux xen]# chcon -t xen_image_t -R /disk2/xen
[root@linux xen]# ll -aZ /disk2
drwxr-xr-x  root root user_u:object_r:xen_image_t      .
drwxr-xr-x  root root system_u:object_r:file_t         ..
-rw-r--r--  root root user_u:object_r:xen_image_t      xen.img
# 如果妳有啟動 SELinux 才需要這麼做,否則就略過。
# 反正你要記得 Xen 的檔案必須要是 xen_image_t 的安全內容類型
檔案建立起來後,就需要進行格式化囉~格式化的方法為:

[root@linux xen]# mke2fs -j /disk2/xen/xen.img
mke2fs 1.39 (29-May-2006)
/disk2/xen/xen.img is not a block special device.
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
....底下省略....
由於這是檔案不是磁碟分割槽,所以會有上述的警告訊息,妳按下『y』就對啦!
複製或安裝根目錄

[root@linux ~]# mount -o loop /disk2/xen/xen.img /mnt
# 先將剛剛製作出來的資料給他掛載起來,這是特殊掛載法喔!

[root@linux ~]# cp -ax /{root,dev,var,etc,usr,bin,sbin,lib} /mnt
# 這幾個目錄的資料是一定需要複製的!粉重要!。

[root@linux ~]# mkdir /mnt/{proc,sys,home,tmp,selinux}
# 這幾個目錄與虛擬檔案系統有關,包括程序、核心資料等目錄,所以要先建立

[root@linux ~]# vi /mnt/etc/fstab
/dev/sda1  /         ext3    defaults        1 1
devpts     /dev/pts  devpts  gid=5,mode=620  0 0
tmpfs      /dev/shm  tmpfs   defaults        0 0
proc       /proc     proc    defaults        0 0
sysfs      /sys      sysfs   defaults        0 0
# 我這裡假設我的根目錄所在磁碟槽為 SATA 硬碟的第一個分割槽,
# 所以是 /dev/sda1 。此外,其他的檔案系統如 proc, sysfs 都必須要寫入!
# 至於原本在 domain-0 的其他裝置,就給他拿掉吧!

[root@linux ~]# vi /mnt/etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=xen.test.hostname
# 這裡設定一下妳的主機名稱啦!

[root@linux ~]# vi /mnt/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
IPADDR=192.168.0.123
NETMASK=255.255.255.0
ONBOOT=yes
# 建議將 IP 也設好。但是要注意那個 HWADDR 最好能夠拿掉不設定!

[root@linux ~]# umount /mnt
# 記得將掛載的資料給他卸載掉

設定虛擬磁碟映象檔以及終端機介面
由於預設的 CentOS 虛擬磁碟 (Initial Ram Disk) 並不包含一些 Xen 的相關驅動程式, 因此搞了老半天也是無法驅動 Xen 的 domain-U ,給他氣死! 所以,我們得先就 initrd 來進行一些額外的設定才行。 這個地方非常的重要!因為鳥哥卡在這裡好幾天~最後才發現原來是 initrd 的問題啊~


[root@linux ~]# mount -o loop /disk2/xen/xen.img /mnt
[root@linux ~]# cd /boot
[root@linux boot]#  mkinitrd -v -f --fstab /mnt/etc/fstab --with xenblk \
> --with xennet --preload xenblk --preload xennet \
> initrd-2.6.18-8.1.14.el5xen.vbird.img `uname -r`
[root@linux boot]# umount /mnt
# 詳細的各項參數請 man mkinitrd ,上述的範例僅是利用 /etc/fstab 的裝置來設定,
# 並且加上一些 xen 相關的驅動程式而已。這個過程非常的重要!
# 最終會製作出一個 initrd-2.6.18-8.1.14.el5xen.vbird.img 檔案

除了這個虛擬磁碟之外,為了要方便我們登入 domain-U 的環境,我們需要產生一個終端機介面才行。 因為每個 domain-U 會使用到終端介面,然而我們知道 tty1 ~ tty7 預設給 domain-0 使用掉了。 為此,我們必須得要製作出一個虛擬的終端介面,那就是 xvc0 這個終端介面囉。如何產生呢? 簡單的流程是這樣:


[root@linux ~]# vi /etc/inittab
# 大約在第 51 行的地方加入底下特殊字體的部分:
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
co:2345:respawn:/sbin/agetty xvc0 9600 vt100-nav
# 意思是使用 agetty 建立 xvc0

[root@linux ~]# init q
# init q 這個指令可以讓 /etc/inittab  的設定立刻生效而不需要重新開機!

[root@linux ~]# ln -s /dev/console /dev/xvc0
# 如果 xvc0 沒有主動建立的話,我們需要手動來建立連結才可以喔!

[root@linux ~]# init q
# init q 這個指令可以讓 /etc/inittab  的設定立刻生效而不需要重新開機!

[root@linux ~]# ln -s /dev/console /dev/xvc0
# 如果 xvc0 沒有主動建立的話,我們需要手動來建立連結才可以喔!


編輯 xen 虛擬資料的設定檔
接下來就是重頭戲啦!因為我們必須要指定 domain-U 的相關虛擬設定值,包括使用幾顆 CPU 、使用多少記憶體容量, 以及所使用的核心與根目錄的所在等等。如前所述,這些設定檔主要都在 /etc/xen 底下, 尤其裡面的 xmexample1, xmexample2 等檔案就是很好的說明文件檔,很有參考價值

[root@linux ~]# vi /etc/xen/centos5
# 這個檔案的檔名可以隨便你取,不過設定檔最好是在 /etc/xen 這個目錄下才好!
name    = "centos5"
kernel  = "/boot/vmlinuz-2.6.18-8.1.14.el5xen"
ramdisk = "/boot/initrd-2.6.18-8.1.14.el5xen.vbird.img"
memory  = "128"
vcpus   = 1
vif     = [ '' ]
disk    = [ 'tap:aio:/disk2/xen/xen.img,sda1,w' ]
root    = "/dev/sda1 ro "
# name:  只是一個顯示的名稱,一般建議與檔名相同即可;
# kernel: 在 domain-0 上面的檔案,用來進行 domain-U 的開機!非常重要!
# ramdisk: 就是 initrd 那個檔案囉~剛剛我們才做出來的檔名
# memory: 分配給這個 domain-U 的記憶體有多少?如果沒有圖形,96 MB 也可以!
# vcpus: 使用多少顆 CPU 的意思;
# vif:  是否需要網路卡,如果需要網路卡,至少要有設定!但內容可用預設!
# disk:  用來作為根目錄的是那個磁碟,這個最重要啦!語法為:
# tap:aio:/完整/路徑/檔名,設計為domain-U的磁碟代號,可否寫入
#  以我們這個例子來說,我將之前建立的大檔案模擬成為 domain-U 的
#  /dev/sda1 ,並且該 partition 為可寫入 (w)。
特別特別留意的是,上面的設定檔當中的 kernel, ramdisk 以及 disk 都是以原本的主機 (domain-0) 的角度來思考的, 也就是說,實際上我們是以 domain-0 的核心檔案來進行 domain-U 的開機,因此妳會發現在 domain-U 當中並不存在 /boot 這個目錄喔!因為實際上用來開機的是 domain-0 的檔案嘛!

至於另一個重點就是那個 disk 參數。我們可以使用模擬的方式也可以使用實際的 partition 來給予設定。 如果是『用檔案來模擬成為 partition』時,使用兩個逗號 (,) 隔開成為三個欄位,分別為:

tap:aio:/完整路徑/檔案的名稱,裝置代號名稱,寫入與否
[tap:aio:]:為較新的檔案處理模式,舊的方式為使用:[file:]
[裝置代號名稱]:就是模擬的裝置,請與 domain-U 內的 fstab 對應起來喔!
[w]:就是設定可否寫入,若唯讀則為[r]
如果使用實體 partition 來模擬的話,那麼開頭的部分會以『phy:』來取代。舉例來說,如果我們以 /dev/hda5 來作為 domain-U 的 /dev/sda1 的話,那就會變成:
disk = [ 'phy:/dev/hda5,sda1,w' ]
如果一切都搞定之後,接下來讓我們來啟動 Xen 的 domain-U 吧!
利用 xm 指令啟動與管理 domain-1
在 domain-0 可以使用 xm 這個指令來啟動、關閉、刪除某個 domain-U , xm 的指令用法是這樣的:

[root@linux ~]# xm [動作] [設定檔名] [-c]
參數:
[動作]:要某個設定檔內的 domain-U 作何動作之意,常見的動作有:
   create   :啟動這個 domain-U 的意思,例如啟動 centos5 這個設定檔時,使用:
              xm create centos5
   destroy  :立即由記憶體中,將這個 domain-U 給刪除,常用於 domain-U 出問題時
   list     :將目前已經啟動的 domain 都列出來之意;
   console  :若有已建立的 domain-U 時,可用 console 來取得 domain-U 的終端介面
   shutdown :關閉某個已啟動的 domain。如果想要關閉全部的 domain-U ,可用
              xm shutdown -a
[設定檔名]:亦即在 /etc/xen/ 目錄下的檔名囉;
-c :同時建立到該設定檔的終端介面 (console)
如果想要啟動我們剛剛建立的 centos5 這個設定檔內的 domain 時,妳可以使用『xm create -c centos5 』即可。 那個 -c 的作用是可以讓妳直接取得 domain-U 的終端機介面。
現在,請跳回 domain-0 的地方,或者是利用另外一條 pietty 的連線連入 domain-0 ,我們使用 xm list 來察看一下各個 domain 的狀況吧!

[root@linux ~]# xm list
Name             ID Mem(MiB) VCPUs State   Time(s)
Domain-0          0      366     1 r-----    735.2
centos5          42      127     1 ------     52.4
# 妳會發現多了一個 domain 出現!名稱為 centos5 啦!
# 妳也會發現有個 State 吧!那個 State 的意義是這樣的:
# r :該 domain 正在使用 CPU 資源在運作中;
# b :這個 domain 目前被懸置(blockded),很可能由於這個 domain 在等待較長時間
#     的輸入輸出 (I/O) 之故。
# p :該 domain 處於暫停的狀態,通常由於管理員使用 xm pause 之故。
#     當 domain 在此狀態時, Xen 的監督器將不會處理該 domain 的動作;
# s :這個 domain 正在關機當中
# c :這個 domain 已經 crash 了,但是卻沒有自動的關掉。通常是因為沒有設定
#     on_crash 的相關動作所致。
# d :該 domain 正在死亡中...因為該 domain 無法正確的 shutdown/crashed 之故。

留言

這個網誌中的熱門文章

Json概述以及python對json的相關操作

Docker容器日誌查看與清理

遠程控制管理工具ipmitool