關於kvm輕度使用的一些總結
-
關於kvm和qemu和virt-tools、libvirt
-
如何安裝虛擬機和簡單使用
-
trouble-shooting
1. 關於kvm、qemu、virt-tools、libvirt
什麼是 KVM ?
kVM 是指基於 Linux 內核的虛擬機(Kernel-based Virtual Machine)。 2006 年 10 月,由以色列的Qumranet 組織開發的一種新的“虛擬機”實現方案。 2007 年 2 月發佈的 Linux 2.6.20 內核第一次包含了 KVM 。增加 KVM 到 Linux 內核是 Linux 發展的一個重要里程碑,這也是第一個整合到 Linux 主線內核的虛擬化技術。
KVM 在標準的 Linux 內核中增加了虛擬技術,從而我們可以通過優化的內核來使用虛擬技術。在 KVM 模型中,每一個虛擬機都是一個由 Linux 調度程序管理的標準進程,你可以在用戶空間啓動客戶機操作系統。一個普通的 Linux 進程有兩種運行模式:內核和用戶。 KVM 增加了第三種模式:客戶模式(有自己的內核和用戶模式)。
什麼是libvirt?
Libvirt是庫,是一種實現 Linux 虛擬化功能的 Linux® API,它支持各種虛擬機監控程序,包括 Xen 和 KVM,以及 QEMU 和用於其他操作系統的一些虛擬產品。
他提供一個命令和一個穩定的層來管理node上的域,甚至乎遠程管理。 libvirt提供所有API來做管理,例如提供,創建,修改,監控,控制,遷移,和停止域。
他的構成是這樣的:
- a node is a single physical machine
- an hypervisor is a layer of software allowing to virtualize a node in a set of virtual machines with possibly different configurations than the node itself
- a domain is an instance of an operating system (or subsystem in the case of container virtualization) running on a virtualized machine provided by the hypervisor
libvirt把物理機叫節點node,將虛擬客戶機比作域domain,還有一個hypervisor的軟件負責虛擬化的(負責通訊和處理api請求等)
其實他的架構師這樣的:
從另外一個層面來看是這樣的
引用參考:
- http://www.ibm.com/developerworks/cn/linux/l-libvirt/
- http://en.wikipedia.org/wiki/Libvirt
- http://libvirt.org/goals.html
什麼是qemu
表格一解釋了qemu就是面向各種架構的平臺仿真器.
QEMU是一套由Fabrice Bellard所編寫的模擬處理器的自由軟件。它與Bochs,PearPC近似,但其具有某些後兩者所不具備的特性,如高速度及跨平臺的特性。經由kqemu這個開源的加速器,QEMU能模擬至接近真實電腦的速度。
進一步理解的話,kvm只能虛擬x86平臺的虛擬機,而qemu就可以虛擬arm,mips平臺的虛擬機,這就是他們最大的區別。
引用參考:
什麼是virt-tools
virt-tools是管理libvirt的工具,例如virt-install virsh等工具
引用參考:
表格一是列出各種不同的虛擬機程序的區別:
虛擬機監控程序 | 描述 |
---|---|
Xen | 面向 IA-32,IA-64 和 PowerPC 970 架構的虛擬機監控程序 |
QEMU | 面向各種架構的平臺仿真器 |
Kernel-based Virtual Machine (KVM) | Linux 平臺仿真器 |
Linux Containers(LXC) | 用於操作系統虛擬化的 Linux(輕量級)容器 |
OpenVZ | 基於 Linux 內核的操作系統級虛擬化 |
VirtualBox | x86 虛擬化虛擬機監控程序 |
User Mode Linux | 面向各種架構的 Linux 平臺仿真器 |
Test | 面向僞虛擬機監控程序的測試驅動器 |
Storage | 存儲池驅動器(本地磁盤,網絡磁盤,iSCSI 卷) |
2. 如何安裝虛擬機和簡單使用
CentOS6.5 x64上安裝KVM功能模塊步驟
操作都以root用戶進行。
-
檢查CPU信息
KVM 需要有 CPU 的支持(Intel VT 或 AMD SVM),在安裝 KVM 之前檢查一下 CPU 是否提供了虛擬技術的支持。 基於 Intel 處理器的系統,運行 grep vmx /proc/cpuinfo 查找 CPU flags 是否包括 vmx 關鍵詞。
Shell
# grep vmx /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr lahf_lm ida flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr lahf_lm ida
# grep vmx /proc/cpuinfo
flags : fpu vme de pse tsc msr pae mce
cx8 apic sep mtrr pge mca cmov pat
pse36 clflush dts acpi mmx
fxsr sse sse2 ss ht tm pbe syscall nx lm
constant_tsc arch_perfmon pebs bts
rep_good pni monitor ds_cpl
vmx est tm2 ssse3 cx16 xtpr lahf_lm ida
flags : fpu vme de pse tsc msr pae mce
cx8 apic sep mtrr pge mca cmov pat
pse36 clflush dts acpi mmx fxsr sse sse2
ss ht tm pbe syscall nx lm constant_tsc
arch_perfmon pebs bts rep_good pni
monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr lahf_lm ida
基於 AMD 處理器的系統,運行 grep svm /proc/cpuinfo 查找 CPU flags 是否包括 svm 關鍵詞
Shell
# grep svm /proc/cpuinfo
# grep svm /proc/cpuinfo
注 : 一些廠商禁止了機器 BIOS 中的 VT 選項 , 這種方式下 VT 不能被重新打開。 注意:/proc/cpuinfo 僅從 Linux 2.6.15(Intel) 和 Linux 2.6.16(AMD) 開始顯示虛擬化方面的信息。請使用 uname -r 命令查詢您的內核版本。如有疑問,請聯繫硬件廠商。
-
檢查BIOS,確保BIOS裏開啓VT選項:
Intel(R) Virtualization Tech [Enabled] 如有必要,還需在BIOS中開啓VT並重啓機器。
-
關掉networkmanager,因爲這個會導致虛擬網卡配置衝突
Shell
service NetworkManager stop chkconfig --del NetworkManager
service NetworkManager stop
chkconfig -- del NetworkManager
-
關掉selinux
Shell
修改/etc/selinux/config 文件 將SELINUX=enforcing改爲SELINUX=disabled setenforce 0
修改 / etc / selinux / config 文件
將 SELINUX = enforcing 改爲 SELINUX = disabled
setenforce 0
-
安裝軟件 其中一種安裝都可以
Shell
yum -y install kvm python-virtinst libvirt tunctl bridge-utils virt-manager qemu-kvm-tools virt-viewer virt-v2v
yum - y install kvm python - virtinst libvirt tunctl bridge - utils virt - manager qemu- kvm - tools virt - viewer virt - v2v
Shell
yum install kvm virt-* libvirt
yum install kvm virt - * libvirt
Shell
yum groupinstall Virtualization 'Virtualization Client' yum install libvirt
yum groupinstall Virtualization 'Virtualization Client'
yum install libvirt
安裝完成後需要重啓服務器
Shell
service libvirtd start chkconfig --level 3 libvirtd on
service libvirtd start
chkconfig -- level 3 libvirtd on
檢查是否可以使用kvm模塊
Shell
lsmod | grep kvm kvm_intel 54285 9 kvm 333172 1 kvm_intel
lsmod | grep kvm
kvm _ intel 54285 9
kvm 333172 1 kvm _ intel
-
配置網卡
進入網卡配置目錄
Shell
cd /etc/sysconfig/network-scripts/ cp ifcfg-eth0 ifcfg-br0
cd / etc / sysconfig / network - scripts /
cp ifcfg - eth0 ifcfg - br0
將eth0的網卡配置和br0的網卡配置修改爲如下內容:
Shell
[root@test02 network-scripts]# cat ifcfg-eth0 DEVICE=eth0 HWADDR=BC:EE:7B:9A:5E:91 TYPE=Ethernet UUID=a257d75d-072c-4eac-8daa-b131324fff52 ONBOOT=yes NM_CONTROLLED=yes #BOOTPROTO=static #IPADDR=192.168.0.12 #NETMASK=255.255.255.0 #GATEWAY=192.168.0.1 DNS1=8.8.8.8 BRIDGE=br0 [root@test02 network-scripts]# cat ifcfg-br0 DEVICE=br0 HWADDR=BC:EE:7B:9A:5E:91 UUID=a257d75d-072c-4eac-8daa-b131324fff52 ONBOOT=yes TYPE=Bridge NM_CONTROLLED=yes BOOTPROTO=static IPADDR=192.168.0.12 NETMASK=255.255.255.0 GATEWAY=192.168.0.1 DNS1=8.8.8.8
[ root @ test02 network - scripts ] # cat ifcfg-eth0
DEVICE = eth0
HWADDR = BC : EE : 7B : 9A : 5E : 91
TYPE = Ethernet
UUID = a257d75d - 072c - 4eac - 8daa - b131324fff52
ONBOOT = yes
NM_CONTROLLED = yes
#BOOTPROTO=static
#IPADDR=192.168.0.12
#NETMASK=255.255.255.0
#GATEWAY=192.168.0.1
DNS1 = 8.8.8.8
BRIDGE = br0
[ root @ test02 network - scripts ] # cat ifcfg-br0
DEVICE = br0
HWADDR = BC : EE : 7B : 9A : 5E : 91
UUID = a257d75d - 072c - 4eac - 8daa - b131324fff52
ONBOOT = yes
TYPE = Bridge
NM_CONTROLLED = yes
BOOTPROTO = static
IPADDR = 192.168.0.12
NETMASK = 255.255.255.0
GATEWAY = 192.168.0.1
DNS1 = 8.8.8.8
配置完成後 執行
service network restart 即可看到效果
評論:
- DNS服務器配置隨意
- br0是虛擬網卡,
libvirt
是安裝這個軟件後出來的 - 實體網卡去掉相關ip屬性,如
BOOTPROTO
IPADDR
NETMASK
GATEWAY
,虛擬網卡將這些屬性補充到自己的網卡配置文件裏面去,但其他配置一律不變動,相當於br0變成實體網卡了,但只是相當於而已。 - 虛擬網卡需要將TYPE改爲Bridge,證明是使用橋接模式。
安裝虛擬機
-
創建虛擬機磁盤鏡像文件
創建磁盤文件不能太小,不然會coredump。
qcow2格式是kvm支持的標準格式,raw格式爲虛擬磁盤文件通用格式。有測試數據表明raw格式的I/O性能略高於qcow2格式,但是在加密,容量,快照方面qcow2格式有優勢
Shell
qemu-img create -f qcow2 test.qcow2 20G //建立qcow2格式磁盤文件 qemu-img create -f raw test.raw 20G //建立raw格式磁盤文件 qemu-img info test.qcow2 //查看已經創建的虛擬磁盤文件
qemu - img create - f qcow2 test .qcow2 20G / / 建立 qcow2 格式磁盤文件
qemu - img create - f raw test .raw 20G / / 建立 raw 格式磁盤文件
qemu - img info test .qcow2 / / 查看已經創建的虛擬磁盤文件
-
創建並安裝虛擬機 以下是ubuntu爲例,ubuntu 14
Shell
cat vir_ubuntu.sh #!/bin/bash virt-install --name ubuntu \ --boot network,cdrom,menu=on \ --ram 512 --vcpus=1 \ --os-variant=generic \ --cdrom=/app/ftp_data/team/public/system_iso/ubuntu-14.04-desktop-i386.iso \ --disk path=/app/kvm/images/centos.qcow2,size=10,format=qcow2,bus=virtio \ --bridge=br0,model=virtio --keymap=en-us \ --vnc --vncport=5910 --vnclisten=0.0.0.0
cat vir_ubuntu .sh
#!/bin/bash
virt - install -- name ubuntu \
-- boot network , cdrom , menu = on \
-- ram 512 -- vcpus = 1 \
-- os - variant = generic \
-- cdrom = / app / ftp_data / team / public / system_iso / ubuntu - 14.04 - desktop- i386 .iso \
-- disk path = / app / kvm / images / centos .qcow2 , size = 10 , format = qcow2 ,bus = virtio \
-- bridge = br0 , model = virtio -- keymap = en - us \
-- vnc -- vncport = 5910 -- vnclisten = 0.0.0.0
以下是centos 6.5爲例
Shell
cat vir_centos.sh #!/bin/bash virt-install --name centos6.5x64 \ --boot network,cdrom,menu=on \ --ram 512 --vcpus=1 \ --os-variant=generic \ --cdrom=/app/ftp_data/team/public/system_iso/CentOS-6.5-x86_64-bin-DVD1.iso \ --disk path=/app/ftp_data/team/public/system_iso/another_CentOS-6.5-x86_64-bin-DVD1.iso,device=cdrom \ --disk path=/app/kvm/images/centos.qcow2,size=10,format=qcow2,bus=virtio \ --bridge=br0,model=virtio --keymap=en-us \ --vnc --vncport=5911 --vnclisten=0.0.0.0
cat vir_centos .sh
#!/bin/bash
virt - install -- name centos6 . 5x64 \
-- boot network , cdrom , menu = on \
-- ram 512 -- vcpus = 1 \
-- os - variant = generic \
-- cdrom = / app / ftp_data / team / public / system_iso / CentOS - 6.5 - x86_64 -bin - DVD1 .iso \
-- disk path = / app / ftp_data / team / public / system_iso / another_CentOS - 6.5- x86_64 - bin - DVD1 .iso , device = cdrom \
-- disk path = / app / kvm / images / centos .qcow2 , size = 10 , format = qcow2 ,bus = virtio \
-- bridge = br0 , model = virtio -- keymap = en - us \
-- vnc -- vncport = 5911 -- vnclisten = 0.0.0.0
評論:
- os-variant是指支持什麼虛擬機,以下是支持的類型,按需選擇即可
~~~
win7 : Microsoft Windows 7
vista : Microsoft Windows Vista
winxp64 : Microsoft Windows XP (x86_64)
winxp : Microsoft Windows XP
win2k8 : Microsoft Windows Server 2008
win2k3 : Microsoft Windows Server 2003
freebsd8 : FreeBSD 8.x
generic : Generic
debiansqueeze : Debian Squeeze
debianlenny : Debian Lenny
fedora16 : Fedora 16
fedora15 : Fedora 15
fedora14 : Fedora 14
mes5.1 : Mandriva Enterprise Server 5.1 and later
mandriva2010 : Mandriva Linux 2010 and later
rhel6 : Red Hat Enterprise Linux 6
rhel5.4 : Red Hat Enterprise Linux 5.4 or later
rhel4 : Red Hat Enterprise Linux 4
sles11 : Suse Linux Enterprise Server 11
sles10 : Suse Linux Enterprise Server
ubuntuoneiric : Ubuntu 11.10 (Oneiric Ocelot)
ubuntunatty : Ubuntu 11.04 (Natty Narwhal)
ubuntumaverick : Ubuntu 10.10 (Maverick Meerkat)
ubuntulucid : Ubuntu 10.04 (Lucid Lynx)
ubuntuhardy : Ubuntu 8.04 LTS (Hardy Heron)
~~~ - disk屬性就是指虛擬機使用哪一個磁盤鏡像文件作爲存儲地方,指定剛纔創建的鏡像文件位置即可,size=10,format=qcow2,bus=virtio分別是指大小,格式(跟鏡像格式一致),磁盤總線類型(指Value can be ’ide’, ’scsi’, ’usb’, ’virtio’ or ’xen’,virtio是專門爲kvm制定的bus,比較常用),大小需要比鏡像文件大小要小,相當於鏡像是容器,這個disk是裏面的水,水太多就溢出了。
- bridge=br0,model=virtio –keymap=en-us分別指網卡使用,網卡模式即驅動模式,和鍵盤制式,橋接模式都使用br0,而虛擬機需要使用virtio這個驅動才能使用虛擬網卡,這個虛擬網卡驅動在linux下支持很好,在windows下支持一般,鍵盤制式如果不指定的話會出現鍵位錯亂的情況,一般我們使用英式
- 安裝centos6.5的時候我使用了2次disk,原因是因爲centos6.5的安裝盤啓動引導安裝有問題,會出現無法查找到安裝源的情況,所以特地加載多一個iso,一個作爲啓動使用,一個作爲安裝源使用,作爲安裝源使用的時候是使用磁盤格式存儲
- vnc相關配置,這個vnc如果配置了的話是virt-tools組件自帶的,無需要額外安裝vnc服務端,默認綁定127.0.0.1,這裏將其改爲 0.0.0.0 以便可以通過外部連接,每一臺的虛擬機的端口都不能一致,一致就會衝突而造成無法啓動安裝。
- 如果無須使用圖形界面安裝,virt-install默認是支持文本模式安裝的。
- os-variant是指支持什麼虛擬機,以下是支持的類型,按需選擇即可
3. trouble-shooting
- 默認情況下virsh工具不能對linux虛擬機進行關機操作,linux操作系統需要開啓與啓動acpid服務。在安裝KVM linux虛擬機必須配置此服務。
Shell
# chkconfig acpid on # service acpid restart
# chkconfig acpid on # service acpid restart |
- 關於安裝windows虛擬機問題
xp是可以安裝成功的,但win2008r2安裝失敗,我提了http://stackoverflow.com/questions/25662436/can-not-install-windows-2008-r2-in-kvm 和 http://segmentfault.com/q/1010000000659199 但依然沒有高手能幫忙到,不過在安裝winxp的過程中我總結了一下經驗:
- kvm其實對windows系列支持並不是太好,雖然補充了兼容windows的磁盤驅動和網卡驅動,但給我的感覺並不大氣,不過我也想了一下,其實也沒有必要使用kvm去虛擬windows,也有vmware這種大鱷可以做,而且服務器一般是linux,所以其實用的不多。
- windowsxp的安裝樣例我也給出來,可以做實驗之用。
Shell
cat vir_xp2.sh virt-install \ --name=xp2 \ --ram 256 \ --vcpus=1 \ --disk path=/app/kvm/images/xp2.img,size=10 \ --cdrom=/app/ftp_data/team/public/system_iso/zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_vl_x14-74070.iso \ --vnc --vncport=5913 --vnclisten=0.0.0.0 \ --network bridge=br0,model=virtio \ --noautoconsole \ --os-variant=winxp \ --keymap=en-us
cat vir_xp2 .sh virt - install \ -- name = xp2 \ -- ram 256 \ -- vcpus = 1 \ -- disk path = / app / kvm / images / xp2 .img , size = 10 \ -- cdrom = / app / ftp_data / team / public / system_iso / zh -hans_windows_xp_professional_with_service_pack_3_x86_cd_vl_x14 - 74070.iso \ -- vnc -- vncport = 5913 -- vnclisten = 0.0.0.0 \ -- network bridge = br0 , model = virtio \ -- noautoconsole \ -- os - variant = winxp \ -- keymap = en - us |
需要注意的是安裝磁盤驅動是在安裝程序出現尋找磁盤時選擇加載驅動
網卡驅動安裝參考:
http://lvii.github.io/system/2013/11/15/xp-sp3-kvm-network-virtio-install-failed
官方磁盤和網卡驅動下載:
http://alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin/
-
關於磁盤在線擴容和熱插拔
磁盤在線擴容和熱插拔磁盤的時候會報錯
Shell
error: this function is not supported by the hypervisor: disk bus 'ide' cannot be hotplugged.
error: Requested operation is not valid: cannot attach device on inactive domain
error: Failed to attach device from /gfs1/disk2tovm2.xml
error: this function is not supported by the hypervisor: disk bus 'ide' cannot be hotplugged
error : this function is not supported by the hypervisor : disk bus 'ide' cannot behotplugged . error : Requested operation is not valid : cannot attach device on inactive domain error : Failed to attach device from / gfs1 / disk2tovm2 .xml error : this function is not supported by the hypervisor : disk bus 'ide' cannot behotplugged |
原因是ide驅動的磁盤不支持熱插拔,需要使用 SCSI