KVM是红帽5.4发行版中推出的最新虚拟化技术,严格上说它是完全虚拟化的产品,VMware和vpc,virtualbox等也都是完全虚拟化 的产品,而xen则是半虚拟化的产品,半虚拟化从性能上说要比完全虚拟化快很多,但xen有个缺点,它是重量级的虚拟机,修改了大量的内核源代码,它的 guest机器必须理解xen化的硬件,也就是说xen上面只能运行红帽5以后的系统,后来红帽修改了发行版4中的一个版本,使其也能支持xen,而且 Xen的完全虚拟化需要借助硬件CPU的VT技术,这个在inter cpu上叫vmx,在AMD cpu中叫svm, xen的完全虚拟化可以说是个失败品,运行效率甚至赶不上VMware,而且操作界面相当不友好,但这不能否认xen在半虚拟化世界的霸主地位,kvm是 kernel virtual module的简写,其实kvm借鉴了xen在半虚拟化上的很多成就,虽然kvm是完全虚拟化的产品,但在关键的硬盘和网卡上支持半虚拟化virtio, 在很大程度上提高了性能,kvm是轻量级虚拟化的代表,也需要硬件vt技术的支持,另外从操作界面上看,xen和kvm都是用virt-manager工 具,差别不是很大,但不可以在同一台机器上同时安装且运行Xen和KVM;另外kvm在只能运行在红帽企业版5.4 64位系统上,同时需要关闭selinux …
現在要開始建立我們的 virtual Macine 了,方式可以透過 virt-manager 或是文字模式的
virt-install.這邊先針對 virt-manager 的使用來做說明, virt-install 的使用請參考
[root@benjr ~]# virt-manager
在選單的最下方可以看到 "New" 這就是新增 Virtual Machine.主要新增 Virtual Machine 需
要幾個步驟
1.name
2.Virtualization Method
3.Installation Method
4.virtual machine sotrage
5.Network
6.Memory and CPU
1.name
第一步就是為你的 virtual machine 命個名稱,除了英文大小寫或是數字以及'_' , '.' 或是
'-' 其他符號皆不可使用.
在設定 Virtual Machine 前先來說明什麼是 Virtual Machine 和 Guest OS.虛擬機器 virtual machine.Host(主系統) 提供了一個虛擬化的環境給 Guest(客系統) 一個可以執行不 同於 Host(主系統) 的作業系統環境,凡是提供虛擬化環境平台的系統稱為 Host(主系統) 虛擬 出來的作業系統都稱為 Guest(客系統).通常 Host 與 Guest 為不相同的作業系統環境. 2.Virtualization Method CPU architecture 可以選擇 i686 或是 x86_64 可以依據你作業系統的版本來選擇,但是在 Hypervisor 選擇上除了 KVM 外還可以選擇 QEMU 試用的感覺上是 QEMU 的 User mode emulation 模式效能上很差就不建議來使用了. 3.Installation Method 1.Local install media(ISO p_w_picpath or CD-ROM) 2.Network install tree (HTTP, FTP , or NFS) 3.Network boot (PXE) 剛剛選擇的是 ISO p_w_picpath or CDROM 可以在選擇是由 ISO p_w_picpath 或是 CDROM 來安裝 Guest OS 了
當我們在做 RHEL 5 update 4 KVM 的虛擬化時 Virtual machine 只能選擇 FV,如果你在建立 virtual machine 遇到不能建立 FV(Fully Virtualized),首先檢查系統的 CPU 是否有支援,目前有支援的 CPU 包括了 AMD-V Pacifica (Flag 是 svm) ,Intel VT (flag 是 vmx) ,再來檢查 BIOS 對於 CPU virtualization 是否有支援
Virtual Machine 安裝媒體的選擇有三種
• ISO
最方便的方式就是由 ISO 來安裝 Guest OS,可以一次同時安裝多個作業系統不會受到系統上光
碟機 (CD-ROM 或是 DVD-ROM) 的限制..不過在不同的作業系統有不同的方式可以進行光碟內容
轉換成 ISO 檔的方式.
Linux System:
1. Linux 系統下的 dd 就可以處理將光碟內容轉換成 ISO 檔不過光碟不能在掛載的情況下做
轉換.使用指令 #mount 先確定一下光碟是否在掛載的情況下.如果是則用 #umount 指令將光碟
移除掛載
[root@benjr ~]# dd if=/dev/cdrom of=/path/cdimg_filename.iso
if : 這邊指定的是光碟機裝置
of : 這就是輸出的 ISO 名稱
Windows System:
Windows 並沒有可以建立 ISO 檔的工具這邊提供一隻常用的 winp_w_picpath 可以在官方網站下載
http://www.winp_w_picpath.com/ WinImage 的選項 Disk ->Create CD-ROM ISO p_w_picpath... 選擇你
要的檔名就會開始將光碟內容轉換成 ISO 檔.
Windows System:
Windows 並沒有可以建立 ISO 檔的工具這邊提供一隻常用的 winp_w_picpath 可以在官方網站下載
http://www.winp_w_picpath.com/ WinImage 的選項 Disk ->Create CD-ROM ISO p_w_picpath... 選擇你
要的檔名就會開始將光碟內容轉換成 ISO 檔.
• 得到的 ISO 就可以讓 Guest OS 安裝使用.
• CD-ROM or DVD
如果你 Host 系統本機上有 CD-ROM 或是 DVD 我們可以直接將作業系統的安裝光碟放在 Host
的光碟機供 Virtual Machine 來存取.
• Network install tree (HTTP, FTP , or NFS)
o Install Media URL
o Kickstart URL
o Kernel parameters
在 Installation Source 這一部分最主要的就是設定安裝媒體(Install Media URL)的來源以
及 Kickstart URL 的檔案, 核心參數 Kernel parameters
o Install Media URL 通常可以透過三種不同的網路服務來安裝 nfs,http 或是 ftp
都可以.指定方法如下:
NFS: nfs://server:/path
HTTP: http://server/path
FTP: ftp://server/path
我們可以當然要安裝的 Guest OS 安裝光碟內容也必須存在 Server 上.我習慣是放在
/var/ftp 目錄下,這樣不管是 nfs,http 或是 ftp 都可以存取.
1.複製 OS 光碟所有的內容.
2.由 FTP 來安裝
請確定 ftp 的服務已經開啟
[root@benjr ~]# chkconfig vsftpd on
[root@benjr ~]# service vsftpd restart
3.由 NFS 來安裝
編輯 "/etc/exports" 並將 "/var/ftp/" 目錄分享(因為我們將把光碟內的檔案放在此目錄下,
此為FTP預設的分享目錄)
[root@benjr ~]# vi /etc/exports
/var/ftp/ 192.8.1.*(ro,all_squash)
並確定 NFS 的服務已經開啟
[root@benjr ~]# chkconfig nfs on
[root@benjr ~]# service nfs start
4.由 HTTP 來安裝
編輯 "/etc/httpd/conf/httpd.conf" 並將 Document 設為 /var/ftp(因為我們將把光碟內的
檔案放在此目錄下,此為FTP預設的分享目錄)
[root@benjr ~]# vi /etc/httpd/conf/httpd.conf
Document Root "/var/ftp"
並確定 HTTP 的服務已經開啟
[root@benjr ~]# chkconfig httpd on
[root@benjr ~]# service httpd restart
o Kickstart URL
kickstart 主要應用在當我們需要大量安裝伺服器時所採取的一種方式,其原理模式就是將安裝
的選項寫在一個檔案內.通常我們安裝完 RHEL 時你會在 /root/ 目錄下面可以發現一個檔案
anaconda-ks.cfg,這個檔案內容紀錄了我們當時在安裝時所選的選項設定值,內容大至如下
# Kickstart file automatically generated by anaconda.
install
nfs --server=192.8.1.1 --dir=/var/ftp/rhel5-u3-64
key 49af-8941-4d14-7589
lang en_US.UTF-8
keyboard us
xconfig --startxonboot
network --device eth0 --bootproto dhcp
rootpw --iscrypted $1$LRtPcttF$wzXIrullYgP0rrNtOSzL81
..略...
不過不是很建議自己手動去編輯,RedHat 提供了一隻工具(#system-config-kickstart)可以讓
我們透過勾選選單的方式來設定安裝時的設定值.
和安裝媒體一樣你可以透過 nfs,http 或是 ftp 都可以.也可以指定
o kernel parameters
通常我們從光碟或是 PXE 開機時會出現 Boot: 讓我們可以鍵入 Kernel parameters 核心參數
但是在 Xen 的虛擬化 Guest OS 並不會有 Boot: 讓我們可以加入核心參數. 我們必須在這裡
來加入. Kernel parameters 核心參數有哪些可以使用請參考:
http://www.kernel.org/pub/linux/kern...n_pdf/ch09.pdf
• Network PXE boot
這一項是讓 FV-Virtual machine 由 PXE(Preboot eXecution Environment) 網路開機,如果我
們要安裝的 Guest OS 為 Linux base 時網路環境必須搭配 PXE + DHCP Service(通常需要另
外一台 Linux Server 來擔當這項工作) 就可以讓 FV-Virtual machine 由網路開機,Linux
PXE 的設定請自行參考 http://benjr.tw/?q=node/30.
但是如果你要安裝的 Guest OS 為 windows base 時就需要使用一台 Windows 架一個
Microsoft® Windows® Remote Installation Services(RIS) 或是 Deployment Services
(WDS) 的服務.可以讓 FV-Virtual machine 由 PXE 開機.
以目前KVM FV-Fully Virtualized 支援的 Guest OS 幾乎是包含了市面常用的作業系統.
• Linux 有 Debian , Fedora , Red Hat Enterprise Linux 以及 Suse Linux
Enterprise Server.
• Windows 有個人電腦使用的 XP , Vista 以及伺服器用的版本有 2000 , 2003 , 2008
• 其他像是 MS-DOS , Novell Netware ,Free BSD , Open BSD 以及 Sun Solaris
4.virtual machine sotrage
在新增 virtual machine 時虛擬磁碟的選擇有三種.每個都有優缺點你可以依據需求來做不同
的選擇.
• virtual disk - disk partition
每個磁區 partition 都可以當成一個虛擬磁碟,最大的好處是效能最佳.但缺點就是要佔用一個
partition.
• virtual disk - nonsparse p_w_picpath
不需要何外切割 partition ,以 檔案(p_w_picpaths) 的方式來當成虛擬磁碟.但是相對的效能比不上
partition 的好.
· virtual disk - sparse p_w_picpath 優點是檔案(p_w_picpaths) 的大小是動態成長,一開始不會佔用所要求的空間,有多少才會要求多少!但是它的效能卻是最差的.但要注意系統的空間是否足夠, Linux 下提供一個工具 "lomount" 可以讓我們 mount Virtual machine p_w_picpaths(並不是只能針 對 p_w_picpath 的檔案,也可以應用在 partition 上面),方法很簡單如下: 不行.所以以上的條件只有 partition 2 可以使用.接下來使用下面的指令指定 partition 就 可以讀取 Virtual machine p_w_picpath 的 partition 分割區內的資料. 5.Network network 2.Shared physical device 但預設的只有 Virtual network. 先來看看在 RHEL5 update 4 KVM 的環境預設會建立一個 bridge,由 QEMU 所提供出的 virbr0 預設安裝 Virtual machine 時網路卡的選擇也就是這種 Virtual network . 而已,他是一個 NAT + DHCP 的架構,所有的 Virtual machine 都會透過 virbr0 來指派一個私 人網域 (private IP).預設為 192.168.122.2 ~ 192.168.122.254 (在他的設定檔中可以定義 其 DHCP 可指定的 IP 範圍). 擬機器的封包都必須透過這 NAT 去連結到其他的網路. 外部不能直接連接到 Virtual Machine 虛擬機器上. 這一個是由 Qemu 所產生所以設定檔存放在 /etc/libvirt/qemu/networks/default.xm • Shared physical device Virtual machine 的網路裝置就會像是串接在一個 Hub 或是 Switch 上,只要是同區段的 IP 都可以互通. 在 Linux 下網路的模式有一個東西叫做 Bridge mode,有點像將多個 NIC Adapter ports 透過一個虛擬出來的 Bridge(Switch) 全部串在一起,再透過一個虛擬出來的網 路裝置出去,這就像是把 Linux 當成一個 switch 來使用了. 要的 Bridge 裝置出來.下面的圖示你可以很清楚的看出來虛擬 NIC 和實體 NIC 是如何透過 bridge 模式串接在一起. 1.目標是用 eth0 來產生一個 bridge(bri0) /etc/rc.local,讓他在開機時候就會生效. 重新載入設定. 注意:一下是实践证明可行 a:启动libvirtd服务,并保证下次自动启动 b:桥接器的生成,这个在安装xen后,会自动创建桥接网络xenbr0,kvm在这点上似乎不够友好 c:重启网络,测试网络连通性 • Set fixed MAC address for your virtual system mac 他是有一個規則性的. mac :XY:XX:XX:XX:XX:XX ,mac 使用16進制來顯示 X 可為任何的16 進制(0~9,A,B,C,D,E,F), Y 則只能使用 2, 6, A 或 E. 6.Memory and CPU CPU: 給,Virtual machine 幾個 CPU ,不過在這裡我們無法針對Virtual machine 的 vcpu 對應到哪 一個實體 CPU 必須在安裝完成之後透過 "#xm" 指令才能再去指派. 不足時 Virtual machine 是無法開啟的.在虛擬記憶體的設定選項有兩種,VM Max Memory 以及 VM Startup Memory 憶體,一開始是要看 VM Startup Memory 大小.我們可以透過修改 VM Startup Memory 的大小 來讓 Virtual machine 線上變大縮小記憶體,最大就是不能超過 VM Max Memory 的大小.當然 VM Max Memory 也不能大於實際記憶體大小.記憶體設定大小單位為 MBytes virt-manager 的介面來修改,下次開機才會保留設定值.
當空間不足讓 sparse p_w_picpath 動態成長時, Guest 可能會損毀
先看看目前有 Virtual machine p_w_picpath 的 partition 分割.
[root@benjr ~]#lomount -diskp_w_picpath /PATH/TO/Image.file
Please specify a partition number. Table is:
Num Start - End OS Bootable
1: 32256 - 106928128: 83 80
2: 106928640 - 10479006208: 8e 0
不過這個工具不是萬能的他有很多狀況下是無法使用的.
partition ID(83) - ext2/ext3 可以但是 refeies 不行. partition ID(8e) - LVM 也是一樣
[root@benjr ~]#lomount -diskp_w_picpath /PATH/TO/Image.file -partition n /mnt
在 Guest OS 要開機前不要忘記 umount.
[root@benjr ~]#umount /mnt
在 RHEL5 update4 KVM 下設定 Virtual machine 時 Network 有兩種選項. 1.Virtual
• Virtual network - virbr0
1.QEMU 會在你的 Linux 產生一個 bridge 虛擬裝置 "virbr0" .virbr0 不只是個單純的 NAT
2.其預設的 default gateway 為 192.168.122.1/24 ,所有在這架構下的 Virtual Machine 虛
3. 如同一般的 NAT 所有的 Virtual Machine 虛擬機器都是被隱藏在 private 私人網域,所以
<network>
<name>default</name>
<uuid>49a0ceb-5662-4a61-8149-98ea750d393b</uuid>
<bridge name="virbr0" />
<forward/>
<ip address="192.168.122.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.122.2" end="192.168.122.254" />
</dhcp>
</ip>
</network>
其中的 ip address 是 default gateway IP,range 則是DHCP clients 所能使用的範圍,都可以依據需求做改變.
如果要使用第二種 "Shared physical device" 時需要經過手動設定才能使用.此時所有的
在一般的 Linux 環境下的方法也很簡單:我們也可以透過下面幾個簡單的指令來產生自己所需
[root@benjr ~]# ifconfig eth0 0.0.0.0
[root@benjr ~]# brctl addbr bri0
[root@benjr ~]# brctl addif bri0 eth0
2.看這一些 eth 是在哪一個 bridge 上.
[root@benjr ~]# brctl show
bridge name bridge id STP enabled interfaces
bri0 8000.001517785dd6 no eth0
virbr0 8000.000000000000 yes
3.設定一組 IP ,方便遠端管理使用.
[root@benjr ~]# ifconfig bri0 192.8.1.3
[root@benjr ~]# ifconfig bri0
bri0 Link encap:Ethernet HWaddr 00:15:17:78:5D:D6
inet addr:192.8.1.3 Bcast:192.8.1.255 Mask:255.255.255.0
inet6 addr: fe80::215:17ff:fe78:5dd6/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:14767 errors:0 dropped:0 overruns:0 frame:0
TX packets:34 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:679328 (663.4 KiB) TX bytes:9626 (9.4 KiB)
4.最後 Allow IP forwarding
[root@benjr ~]# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@benjr ~]#sysctl –p
之後所有設定在 eth0(bri0) 的 Virtual Machine 都可以互通了!!可以將剛剛的步驟寫在
5.reload libvirt
[root@benjr ~]# service libvirtd reload
如果要讓 Virtual Machine 可以立即選擇 "Shared physical device" 需將 libvirtd 的服務
[root@jsb-ylw-5052 ~]# service libvirtd start
Starting libvirtd daemon: [ 确定 ]
[root@jsb-ylw-5052 ~]# chkconfig libvirtd on
[root@jsb-ylw-5052 ~]# cd /etc/sysconfig/network-scripts/
[root@jsb-ylw-5052 network-scripts]# cp ifcfg-eth0 ifcfg-br0
[root@jsb-ylw-5052 network-scripts]# cat ifcfg-eth0
# nVidia Corporation MCP77 Ethernet
DEVICE=eth0
BOOTPROTO=static
HWADDR=90:E6:BA:70:B2:28
IPADDR=192.168.50.24
NETMASK=255.255.255.0
ONBOOT=yes
BRIDGE=br0 //将eth0桥接到br0
[root@jsb-ylw-5052 network-scripts]# cat ifcfg-br0
# nVidia Corporation MCP77 Ethernet
DEVICE=br0
BOOTPROTO=static
HWADDR=90:E6:BA:70:B2:28
IPADDR=192.168.50.24
NETMASK=255.255.255.0
ONBOOT=yes
TYPE=Bridge //br0为桥接
[root@jsb-ylw-5052 network-scripts]# service network restart
[root@jsb-ylw-5052 network-scripts]# ifconfig
br0 Link encap:Ethernet HWaddr 90:E6:BA:70:B2:28
inet addr:192.168.50.24 Bcast:192.168.50.255 Mask:255.255.255.0
eth0 Link encap:Ethernet HWaddr 90:E6:BA:70:B2:28
inet6 addr: fe80::92e6:baff:fe70:b228/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
virbr0 Link encap:Ethernet HWaddr 00:00:00:00:00:00
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
另外最後的一個選項是我們自己指派給虛擬網卡一個 MAC address ,要設定虛擬網路裝置的
這裡主要就是設定 Virtual machine 的 Memory 以及 CPU 的多寡
CPU 的設定比較簡單除了你可以看到目前系統邏輯 CPU 的數量外另一個選項即是你要指派
Memory:
一開始系統就會告訴你目前有多少的記憶體 "Total memory on host machine",當系統記憶體
1.VM Max Memory
這裡設定 Virtual machine 的記憶體最大可以用到多少,但是一開始並不會真的佔用這麼多記
不過所有使用 #xm mem-set / mem-max 都是暫時性的,需要修改 /etc/xen/ 設定檔.或是使用
2. VM Startup Memory
設定 Virtual machine 記憶體目前容量大小,設定單位為 MBytes
7.1,如果你使用的内核是kernel xen 重启自动引导虚拟机 额外补充
[root@lab auto]# ln -s /etc/xen/rhel54 /etc/xen/auto/rhel54
[root@lab auto]# ls -l
總計 4
lrwxrwxrwx 1 root root 15 4月 15 23:12 rhel54 -> /etc/xen/rhel54
[root@lab auto]# pwd
/etc/xen/auto
# 手工啟動 rhel54 的設定檔案
[root@lab xen]# /etc/init.d/xendomains restart
Shutting down Xen domains:Restoring Xen domains: rhel54.
Starting auto Xen domains: rhel54(skip)[root@lab xen]#
# 預設開機啟動 xendomains 服務
[root@lab xen]# chkconfig xendomains on
7.2如果先用的内核是kvm
Automtically starting guests
This section covers how to make virtualized guests start automatically during the host system's boot phase.
This example uses virsh to set a guest, TestServer, to automatically start when the host boots.
# virsh autostart TestServer
Domain TestServer marked as autostarted
The guest now automatically starts with the host.
To stop a guest automatically booting use the --disable parameter
# virsh autostart --disable TestServer
Domain TestServer unmarked as autostarted
The guest no longer automatically starts with the host.
8,移植
移植虚拟机到其他服务器上
拷贝/etc/xen/xxx.img 和 /kvm/xxx.img
(我的虚拟机的镜像文件在/kvm/xxx.img)