1、前言
目前正在涉足雲計算IaaS工作,虛擬化是IaaS的重要部分,因此這段時間對各個虛擬機化技術和工具進行研究,研究的目的不僅僅是為了會使用這個工具,而是通過研究了解技術的實現機制和原理,即知其然也要知其所以然,本文主要算是本人進入這個技術領域的入門的開始,在記錄自己的進展的同時,希望對有類似追求的同仁有所幫助。為了更明晰各個步驟,安裝步驟不采用圖形方式。
KVM(不是鍵盤、顯示器、鼠標)是一個基於Linux內核的虛擬化工具,具體的原理正在研究。
閑話少說,言歸正傳:
2、試驗環境
硬件:Dell PowerEdge 2CPU 8G MEM
操作系統:Centos 5.5
hypervisor:kvm(Kenerl-based virtulization machine)
3、安裝步驟
3.1 操作系統安裝
這個步驟就不多說了,需要注意的是在安裝過程中,選擇定制功能,在Virtualization下選擇kvm,因為在centos5.5下,虛擬化默認支持xen,安裝完成后,建立虛擬化所需要的包如kvm、kvm-qemu、libvirt、Python等,會自動安裝。
安裝完成后,可以使用virsh命令檢查一下虛擬化環境是否正常,具體命令如下:
virsh -c qemu:///system list
如果顯示一個空列表,說明運行正常。
注:virsh命令是libvirt庫提供的一個命令行工具,可以用來管理虛擬機。libvirt是什么?呵呵,這個可是個重要的東東,我將專門用一篇文章進行說明。
3.2 網絡配置
操作系統安裝完成支持虛擬化相關包后,會自動建立一個名稱為virbr0的虛擬網橋,在多網卡情況下,此網橋默認與eth1網卡綁定。為了向虛擬機提供聯網功能,KVM使用virbr0作為默認網絡設備,因此在實際應用中,需要將virbr0與連接到實際網絡的網卡綁定,例如我的是eth0。
具體方法是修改/etc/sysconfig/network-scripts目錄下的網卡配置文件,如綁定etho,則修改ifcfg-eth0 和ifcfg-virbr0
修改后的配置文件內容如下:
1)ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=virbr0
BOOTPROTO=dhcp
TYPE=Ethernet
2)ifcfg-virbr0
DEVICE=virbr0
TYPE=Bridge
ONBOOT=yes
DELAY=0
BOOTPROTO=none
IPADDR=10.100.0.3
NETMASK=255.255.255.0
GATEWAY=10.100.0.254
修改完成后,重新啟動網絡服務:service network restart
默認的virbr0設置保存在/etc/libvirt/qemu/networks目錄下,里面有一個default.xml文件,里面是virbr0的默認配置。
注:虛擬網橋由bridge-utils包中的brctl工具建立,這個包在安裝虛擬化相關的包后自動安裝, 使用brctl addbr 網橋名稱可以增加網橋,使用brctl show顯示已有網橋
3.3 建立虛擬機使用的文件
服務器上建立虛擬機的機制與在PC機上使用VMware Workstation、VirtualBox建立虛擬機類似,每個虛擬機均使用一個物理文件保存其安裝的系統,模擬成磁盤,用來安裝guest 操作系統,此文件可以先建好並格式化為一個專門的虛擬化文件格式(如qcow2),也可以在建立虛擬機的過程中指定,由虛擬機構建程序自動生成。
虛擬機使用的文件可以先以qemu-img命令先建好,也可以在通過使用virt-manager 、 virt-install建立虛擬機時建立,下面是使用qemu-img的語法:
qemu-img create -f qcow2 win7.img 20G <---建立一個格式為qcow2、大小為20G的文件
建立完成后,顯示:Formatting 'win7.img', fmt=qcow2, size=20971520 kB
可以使用下面的命令檢查文件格式: A、file win7.img Win7.img: x86 boot sector; partition 1: ID=0x7, active, starthead 32, startsector 2048, 204800 sectors; partition 2: ID=0x7, starthead 223, startsector 206848, 40751104 sectors B、qemu-img info win7.img image: VM-Win7-1.img file format: raw virtual size: 20G (20971520000 bytes) disk size: 20G
備注:虛擬文件的格式有許多種,將在獨立的文章中說明和分析。
3.4 建立虛擬機
完成上述的准備后,可以建立虛擬機了,這里使用virt-install命令完成本項工作。命令如下:
virt-install --name VM-Win7-2 \ --hvm \ --ram 512 \ --vcpus 2 \ --disk path=/opt/images/win7.img,size=20 \ --network network:default --accelerate \ --vnc --vncport=5911 \ --os-variant rhel5.4 \ --cdrom /opt/ISO/windows7.iso -d 各個參數的意義如下 : --name 虛擬機名稱 --hvm 使用全虛擬化(與para-irtualization向對),如果在一個主機上para和full virtulization均可用,連接到沒有硬件虛擬化支持的機器的xen hypervisor,這個 參數無效,這個參數意味着連接到基於qemu的hypervisor --ram 虛擬機內存大小 --vcpus 虛擬機虛擬CPU個數 --disk 虛擬機使用的磁盤(文件)的路徑,本例中使用第3步中建立的文件,文件放置在/opt/images目錄下 --network 網絡設置,使用默認設置即可,默認設置為使用第1步中說明的virbr0網橋 --vnc 設置連接桌面環境的vnc端口,本例是5911 --os-variant 指示為一個特定的操作系統變體(或版本)進一步優化客戶機(guest)配置 --cdrom 設置光驅獲取虛擬光驅文件的路徑 -d 指示從光驅啟動( -c 指示從硬盤啟動)
上面命令執行后,顯示一連串提示,主要是建立虛擬機的進度和根據命令參數形成的虛擬機配置,虛擬機配置文件用xml文件存儲,通過查看這個過程,能夠對建立虛擬機過程有個比較直觀的了解,下面是上述命令的的輸出:
Thu, 17 Nov 2011 18:19:49 DEBUG Requesting libvirt URI default 說明:請求連接默認URI,基於kvm hypervisor URI為 qemu:///system Thu, 17 Nov 2011 18:19:49 DEBUG Received libvirt URI 'qemu:///system' Thu, 17 Nov 2011 18:19:49 DEBUG Requesting virt method 'hvm' 說明:使用full虛擬化 Thu, 17 Nov 2011 18:19:49 DEBUG Received virt method 'hvm' Thu, 17 Nov 2011 18:19:49 DEBUG Hypervisor name is 'kvm' Thu, 17 Nov 2011 18:19:49 DEBUG parse_disk: returning ('/opt/images/win7.img', None, None, 'disk', None, False, False, 20.0, True, None) Thu, 17 Nov 2011 18:19:49 DEBUG Setting os type to 'linux' for variant 'rhel5.4' 說明:設置基於rhel linux變體進行優化 Thu, 17 Nov 2011 18:19:49 DEBUG DistroInstaller location is a local file/path: /opt/ISO/windows7.iso Thu, 17 Nov 2011 18:19:49 DEBUG Setting size for existing storage to '2.38835525513' Thu, 17 Nov 2011 18:19:49 DEBUG Detected storage as type 'file' Starting install... Thu, 17 Nov 2011 18:19:49 DEBUG Setting size for existing storage to '2.38835525513' Thu, 17 Nov 2011 18:19:49 DEBUG Detected storage as type 'file' Creating storage file... | 20 GB 00:00 Thu, 17 Nov 2011 18:19:49 DEBUG Creating guest from: <domain type='kvm'> --說明:以下是虛擬機的配置文件,術語“domain”指虛擬機 <name>VM-Win7-2</name> <currentMemory>524288</currentMemory> <memory>524288</memory> <uuid>8da64796-97aa-a6ae-5ecb-30a312139c19</uuid> <os> <type arch='x86_64'>hvm</type> <boot dev='cdrom'/> </os> <features> <acpi/><apic/><pae/> </features> <clock offset="utc"/> <on_poweroff>destroy</on_poweroff> <on_reboot>destroy</on_reboot> <on_crash>destroy</on_crash> <vcpu>2</vcpu> <devices> <emulator>/usr/libexec/qemu-kvm</emulator> <console type='pty'/> <disk type='file' device='disk'> <driver name='qemu' cache='none'/> <source file='/opt/images/win7.img'/> <target dev='vda' bus='virtio'/> </disk> <disk type='file' device='cdrom'> <source file='/opt/ISO/windows7.iso'/> <target dev='hdc' bus='ide'/> <readonly/> </disk> <interface type='network'> <source network='default'/> <mac address='54:52:00:1b:bc:d0'/> <model type='virtio'/> </interface> <input type='mouse' bus='ps2'/> <graphics type='vnc' port='5911' keymap='en-us'/> </devices> </domain> Creating domain... | 0 B 00:01 Thu, 17 Nov 2011 18:19:50 DEBUG Created guest, looking to see if it is running 說明:建立完成guest,查看其是否正在運行 Thu, 17 Nov 2011 18:19:50 DEBUG Launching console callback Thu, 17 Nov 2011 18:19:50 DEBUG Saving XML boot config: <domain type='kvm'> <name>VM-Win7-2</name> <currentMemory>524288</currentMemory> <memory>524288</memory> <uuid>8da64796-97aa-a6ae-5ecb-30a312139c19</uuid> <os> <type arch='x86_64'>hvm</type> <boot dev='hd'/> </os> <features> <acpi/><apic/><pae/> </features> <clock offset="utc"/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>restart</on_crash> <vcpu>2</vcpu> <devices> <emulator>/usr/libexec/qemu-kvm</emulator> <console type='pty'/> <disk type='file' device='disk'> <driver name='qemu' cache='none'/> <source file='/opt/images/win7.img'/> <target dev='vda' bus='virtio'/> </disk> <disk type='file' device='cdrom'> <target dev='hdc' bus='ide'/> <readonly/> </disk> <interface type='network'> <source network='default'/> <mac address='54:52:00:1b:bc:d0'/> <model type='virtio'/> </interface> <input type='mouse' bus='ps2'/> <graphics type='vnc' port='5911' keymap='en-us'/> </devices> </domain> (virt-viewer:10164): Gtk-WARNING **: cannot open display: Thu, 17 Nov 2011 18:19:53 DEBUG Domain state after install: 1 Domain installation still in progress. You can reconnect to the console to complete the installation process.
后面的錯誤指示virt-viewer 不能通過 5911連接vnc,這與vnc的設置有關,但是這不影響虛擬機繼續安裝操作系統和運行,通過這個錯誤可以看到virt-install在生產虛擬機的最后調用virt-viewer打開虛擬機圖形界面,進行操作系統的安裝,可以通過vnc或者virt-manager打開虛擬機圖形界面,繼續完成guest操作系統的安裝即可,vnc可以安裝realVNC。
通過vnc客戶端或者virt-manager連接到新建立的虛擬機,繼續進行虛擬機內操作系統的安裝,安裝過程與在物理機上安裝相同,不在贅述。安裝完操作系統后,就像擁有了另一台機器一樣,通過VNC遠程連接(如果裝的是Windows操作系統,也可以使用RDP進行連接,就windows那個遠程桌面連接)可以進行相關操作了。
4、總結
在配置虛擬機的過程中
1)上述工作,在virt-manager中可以通過圖形向導界面也可以完成,virt-manager可以通過在終端中輸入virt-manager或者從菜單應用程序->系統工具中打開
2)使用qemu-kvm 命令也可以建立虛擬機【libvirt api中應該也提供了類似的函數,openstack、eucalyptus之類的虛擬機管理(也稱為雲計算管理)工具調用這個函數建立虛擬機】
命令如下:
qemu-kvm -m 1024 -localtime -M pc -smp 1 -drive file=/opt/images/Win7.img,cache=writeback,boot=on -net nic,macaddr=52:54:00:12:34:80 -net tap -cdrom /opt/ISO/Windows7.iso -boot d -name win7,process=kvm-win7 -vnc :2 -usb -usbdevice tablet
參數說明如下:
-m 1024 設置虛擬系統內存1024MB
-localtime 使虛擬系統與宿主系統時間一致
-M pc 虛擬系統類型為pc
-smp 1 1個CPU
-drive file=Windows7_x86.img,cache=writeback,boot=on
硬盤選項,虛擬磁盤是Windows7_x86.img,cache方式為writeback,可引導型磁盤。
-net nic,macaddr=52:54:00:12:34:80 網卡選項,手工指定mac地址。
-net tap tap類型網絡,相當於“橋模式”
-cdrom Windows7.iso 光驅
-boot d 啟動順序。d代表光驅。
-name kvm-win7,process=kvm-win7 為虛擬機取名,便於識別
-vnc :2 這里是通過vnc連接控制窗口,這里是在5902端口。
-usb -usbdevice tablet 啟用usb設備中的tablet功能。開啟該功能可使虛擬機內外的鼠標同步
參數與virt-install基本相同。
在安裝了磁盤和網卡的半虛擬化驅動后,可以在-drive中加入if=virtio使用磁盤半虛擬化,在-net nic中加入model=virtio使用網卡半虛擬化驅動。virio在kenerl 2.6.24以上版本才能更好的發揮效用。
3)其實無論用哪種方法建立的基於kvm的虛擬機,都由qemu-kvm進行啟動和管理,下面是查看liunx進程顯示的一個虛擬機進程:
qemu-kvm -S -M rhel5.4.0 -m 1024 -smp 2 -name VM-win7 -uuid 71c4020b-ca54-20f2-780c-ec9fa070aa84 -no-kvm-pit-reinjection -monitor pty -pidfile /var/run/libvirt/qemu//VM-ubuntu-1104.pid -boot c -drive file=/opt/images/ubuntu-11.04-desktp.img,if=virtio,index=0,boot=on,cache=none -drive file=,if=ide,media=cdrom,index=2 -net nic,macaddr=54:52:00:0a:55:05,vlan=0,model=virtio -net tap,fd=17,script=,vlan=0,ifname=vnet0 -serial pty -parallel none -usb -vnc 0.0.0.0:11 -k en-us
一個虛擬機占用一個進程,可以通過進程管理和控制虛擬機。
4)虛擬機個相關配置保存在一個配置文件中,因此可以手工可以編寫一個配置文件,然后通過virsh命令行構建虛擬機,已建好的虛擬機,配置文件更改后,需要用virsh define重新定義后才能生效。
5)基於KVM建立的虛擬機相關文件默認存放位置
kvm虛擬機配置文件位置/etc/libvirt/qemu/ <---都是xml文件
kvm虛擬機文件位置:var/lib/libvirt/images/ <---可以在建立虛擬機時指定
6)建立的虛擬機在運行時相關文件及存放位置
在虛擬機運行時,會在/var/run/libvirt/qemu目錄下存放虛擬機的pid文件和配置文件,配置文件與/etc/libvirt/qemu目錄下對應的虛擬機文件相同,pid文件保存有此虛擬機進程號。虛擬機的日志文件存放在/var/log/libvirt/qemu目錄下,每個虛擬機一個,文件名稱為:虛擬機名稱(或UUID)+“.log”
7)qemu不使用linux下的vncserver提供vnc服務,因此在此服務沒有啟動的情況下,也能通過vnc客戶端連接到虛擬機。
通過上面的配置驗證,說明在服務器上的虛擬化與桌面上的虛擬化在原來上基本相同,都是通過相關配置構建一個虛擬機,這個虛擬機的各類外設如磁盤、內存、CPU、網卡等通過都是對物理資源虛擬而獲得,形成一個邏輯上的計算機,並通過一個文件進行保存。區別是桌面上的虛擬化采用的是軟件模擬,服務器上則實現機制很多,由不依賴與操作系統(bare metal)的VMware ESX、Microsoft Hyper-V,也有與操作系統集成的kvm,還有同時提供bare metal機制,又需要一個操作系統對虛擬機進行管理的xen等,這些東西都稱之為hypervisor。其實對於用戶來說都是透明的,他們不需要知道其使用的虛擬機是采用何種方式實現的。
http://blog.csdn.net/starshine/article/details/6990599