目前正在涉足雲計算IaaS工做,虛擬化是IaaS的重要部分,所以這段時間對各個虛擬機化技術和工具進行研究,研究的目的不只僅是爲了會使用這個工具,而是經過研究瞭解技術的實現機制和原理,即知其然也要知其因此然,本文主要算是本人進入這個技術領域的入門的開始,在記錄本身的進展的同時,但願對有相似追求的同仁有所幫助。爲了更明晰各個步驟,安裝步驟不採用圖形方式。linux
KVM(不是鍵盤、顯示器、鼠標)是一個基於Linux內核的虛擬化工具,具體的原理正在研究。ubuntu
閒話少說,言歸正傳:windows
硬件:Dell PowerEdge 2CPU 8G MEMcentos
操做系統:Centos 5.5api
hypervisor:kvm(Kenerl-based virtulization machine)服務器
這個步驟就很少說了,須要注意的是在安裝過程當中,選擇定製功能,在Virtualization下選擇kvm,由於在centos5.5下,虛擬化默認支持xen,安裝完成後,創建虛擬化所須要的包如kvm、kvm-qemu、libvirt、Python等,會自動安裝。網絡
安裝完成後,可使用virsh命令檢查一下虛擬化環境是否正常,具體命令以下:dom
virsh -c qemu:///system listide
若是顯示一個空列表,說明運行正常。函數
注:virsh命令是libvirt庫提供的一個命令行工具,能夠用來管理虛擬機。libvirt是什麼?呵呵,這個但是個重要的東東,我將專門用一篇文章進行說明。
操做系統安裝完成支持虛擬化相關包後,會自動創建一個名稱爲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顯示已有網橋
服務器上創建虛擬機的機制與在PC機上使用VMware Workstation、VirtualBox創建虛擬機相似,每一個虛擬機均使用一個物理文件保存其安裝的系統,模擬成磁盤,用來安裝guest 操做系統,此文件能夠先建好並格式化爲一個專門的虛擬化文件格式(如qcow2),也能夠在創建虛擬機的過程當中指定,由虛擬機構建程序自動生成。
虛擬機使用的文件能夠先以qemu-img命令先建好,也能夠在經過使用virt-manager 、 virt-install創建虛擬機時創建,下面是使用qemu-img的語法:
qemu-img create -f qcow2 win7.img 20G <---創建一個格式爲qcow二、大小爲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
備註:虛擬文件的格式有許多種,將在獨立的文章中說明和分析。
完成上述的準備後,能夠創建虛擬機了,這裏使用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那個遠程桌面鏈接)能夠進行相關操做了。
在配置虛擬機的過程當中
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