當前的虛擬化產品有 vmware vsphere ,Hyper-v,xen,kvm。vmware的虛擬化所佔的市場有目共睹,Hyper-V是windows平臺下的虛擬化,而Xen就屬於一個半虛擬化產品。kvm就是咱們今天所介紹的對象。css
(kvm是kernel virtual module的簡寫)kvm是紅帽公司5.4版本後所推出的最新虛擬化技術產品。它和vpc,virtual box都屬於徹底虛擬化產品,而Xen是屬於半虛擬化產品。python
雖然說kvm是徹底虛擬化,但在關鍵的硬盤和網卡上支持半虛擬化virtio,在很大程度上提升了性能,kvm是輕量級虛擬化的表明,也須要硬件vt技術的支持,另外從操做界面上看,xen和kvm都是用virt-manager工具,差異不是很大,但不能夠在同一臺機器上同時安裝且運行Xen和KVM;另外kvm在只能運行在紅帽企業版64位系統上,同時須要關閉selinux。linux
KVM是指基於 Linux 內核的虛擬機(Kernel-based Virtual Machine)。增長 KVM 到 Linux 內核是Linux 發展的一個重要里程碑,這也是第一個整合到 Linux 主線內核的虛擬化技術。編程
KVM所使用的方法是經過簡單地加載內核模塊而將 Linux 內核轉換爲一個系統管理程序。這個內核模塊導出了一個名爲 /dev/kvm 的設備,它能夠啓用內核的客戶模式(除了傳統的內核模式和用戶模式)。有了 /dev/kvm 設備,VM 使本身的地址空間獨立於內核或運行着的任何其餘 VM 的地址空間。設備樹(/dev)中的設備對於全部用戶空間進程來講都是通用的。可是每一個打開 /dev/kvm 的進程看到的是不一樣的映射(爲了支持 VM 間的隔離)。KVM安裝 KVM 以後,您能夠在用戶空間啓動客戶操做系統。每一個客戶操做系統都是主機操做系統(或系統管理程序)的一個單個進程。windows
1、KVM 虛擬機的管理工具api
準確來講,KVM僅是Linux 內核中的一個模塊。管理和建立完的 KVM 虛擬機,須要更多的輔助工具。QEMU-KVM:在 Linux 系統中,首先咱們能夠用 modprobe 命令加載 KVM 模塊,若是用 RPM 安裝 KVM 軟件包,系統會在啓動時自動加載模塊。加載了模塊後,才能進一步經過其餘工具建立虛擬機。但僅有 KVM 模塊是遠遠不夠的,由於用戶沒法直接控制內核模塊去作事情,還必須有一個用戶空間的工具。關於用戶空間的工具,KVM 的開發者選擇了已經成型的開源虛擬化軟件 QEMU。QEMU 是一個強大的虛擬化軟件,它能夠虛擬不一樣的 CPU 構架。好比說在 x86 的 CPU 上虛擬一個Power的CPU,並利用它編譯出可運行在 Power 上的程序。KVM使用了QEMU的基於 x86 的部分,並稍加改造,造成可控制 KVM 內核模塊的用戶空間工具QEMU-KVM。因此 Linux 發行版中分爲 內核部分的 KVM 內核模塊和 QEMU-KVM 工具。這就是 KVM 和 QEMU 的關係。 Libvirt、virsh、virt-manager:儘管 QEMU-KVM 工具能夠建立和管理 KVM 虛擬機,RedHat 爲 KVM 開發了更多的輔助工具,好比 libvirt、libguestfs 等。緣由是 QEMU 工具效率不高,不易於使用。Libvirt 是一套提供了多種語言接口的 API,爲各類虛擬化工具提供一套方便、可靠的編程接口,不只支持 KVM,並且支持 Xen 等其餘虛擬機。使用 libvirt,你只須要經過 libvirt 提供的函數鏈接到 KVM 或 Xen 宿主機,即可以用一樣的命令控制不一樣的虛擬機了。Libvirt 不只提供了 API,還自帶一套基於文本的管理虛擬機的命令 virsh,你能夠經過使用 virsh 命令來使用 libvirt 的所有功能。但最終用戶更渴望的是圖形用戶界面,這就是 virt-manager。他是一套用 python 編寫的虛擬機管理圖形界面,用戶能夠經過它直觀地操做不一樣的虛擬機。Virt-manager 就是利用 libvirt 的 API 實現的。安全
2、kvm虛擬機的安裝網絡
(一)安裝以前先要開啓cpu的虛擬化功能,若是是物理機直接進入BIOS中就該虛擬化選項開啓,若是是架構
vmware worksation 如圖:app
若是是vSphere 的話也是在設置中找到cpu的設置去開啓虛擬化支持。
設置好以後檢查虛擬化是否成功支持:
#egrep "(vmx|svm)" /proc/cpuinfo
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov patpse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc uparch_perfmon pebs bts xtopology tsc_reliable nonstop_tsc aperfmperfunfair_spinlock pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnttsc_deadline_timer xsave avx hypervisor lahf_lm arat epb pln pts dts tpr_shadowvnmi ept vpid
(二)kvm軟件的安裝
# yum install qemu-kvm qemu-kvm-tools virt-manager libvirt -y
# service libvirtd start
# service libvirtd status
libvirtd (pid 1818) ...
# chkconfig libvirtd on
說明:
kvm爲linux內核的一個模塊,模塊不須要安裝,只須要加載
virt-manageer 爲kvm的管理包
libvirt 爲建立虛擬機的工具包
qemu:虛擬化軟件,能夠虛擬不一樣的CPU,支持異構(x86的架構能夠虛擬化出不是x86架構的)
qemu-kvm:用戶態管理kvm,網卡,聲卡,PCI設備等都是qemu來管理的
(三)檢查模塊的正確安裝
使用lsmod來檢查模塊安裝
# lsmod | grep kvm
kvm_intel 55656 0
kvm 345460 1 kvm_intel
(四)檢查KVM是否成功安裝
#virsh -c qemu:///system list
備註:初次安裝橫線下面沒有屬於正常。另外若是報錯的話檢查上面的服務是否正常啓動。
3、kvm的網絡配置
一種是default,它支持主機與虛擬機的互訪,同時也支持虛擬機訪問互聯網,但不支持外界訪問虛擬機。
默認的網絡鏈接是virbr0,它的配置文件在
#cat /var/lib/libvirt/network/default.xml
<!--
OVERWRITTEN AND LOST. Changes to thisxml configuration
should be made using:
virsh net-edit default
or other application using thelibvirt API.
-->
<network>
<name>default</name>
<uuid>36ec31bf-a7fa-4b61-90a8-2b46aed90518</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0' />
<mac address='52:54:00:B7:F4:66'/>
<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>
另一種方式是bridge方式,可使用虛擬機成爲網絡中具備獨立IP的主機。
我這裏是使用第二種網絡配置:
#vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
#BROADCAST=10.0.0.255
HWADDR=00:0C:29:92:B5:37
#IPADDR=10.0.0.61
#NETMASK=255.255.255.0
#GATEWAY=10.0.0.254
ONBOOT=yes
BRIDGE="br0"
#vi /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
BOOTRPOTO=static
IPADDR=10.0.0.85
NETMASK=255.255.255.0
GATEWAY=10.0.0.254
ONBOOT=yes
#service network restart
說明:
如今使用10.0.0.85鏈接宿主機
#ifconfig
br0 Link encap:Ethernet HWaddr 00:0C:29:92:B5:37
inet addr:10.0.0.85 Bcast:10.0.0.255 Mask:255.255.255.0
inet6 addr:fe80::20c:29ff:fe92:b537/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:420 errors:0 dropped:0overruns:0 frame:0
TX packets:235 errors:0 dropped:0overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:33439 (32.6 KiB) TX bytes:29623 (28.9 KiB)
eth0 Link encap:Ethernet HWaddr 00:0C:29:92:B5:37
inet6 addr:fe80::20c:29ff:fe92:b537/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4299 errors:0 dropped:0overruns:0 frame:0
TX packets:2822 errors:0 dropped:0overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:384854 (375.8 KiB) TX bytes:300481 (293.4 KiB)
eth1 Link encap:Ethernet HWaddr 00:0C:29:92:B5:41
inet addr:192.168.3.150 Bcast:192.168.3.255 Mask:255.255.255.0
inet6 addr:fe80::20c:29ff:fe92:b541/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1175 errors:0 dropped:0overruns:0 frame:0
TX packets:304 errors:0 dropped:0overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:76602 (74.8 KiB) TX bytes:22635 (22.1 KiB)
Interrupt:16 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:618 errors:0 dropped:0overruns:0 frame:0
TX packets:618 errors:0 dropped:0overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:73375 (71.6 KiB) TX bytes:73375 (71.6 KiB)
virbr0 Link encap:Ethernet HWaddr 92:66:C3:69:F0:D9
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
inet6 addr:fe80::9066:c3ff:fe69:f0d9/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0overruns:0 frame:0
TX packets:81 errors:0 dropped:0overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:12603 (12.3 KiB)
注:網橋模式須要在真機eth0配置文件中添加 BRIDGE="br0",不然真機與虛擬機沒法互通.
配置完畢後eth0口則不會顯示地址信息,新配置的br0口會代替eth0口成爲真機網口,裝好的虛擬機eth0口將於真機br0口互通.
4、建立虛擬機
(一)使用virt-manager創建一個KVM虛擬機
virt-manager是基於libvirt的圖像化虛擬機管理軟件,請注意不一樣的發行版上 virt-manager的版本可能不一樣,圖形界面和操做方法也可能不一樣。本文使用了紅帽6企業版的virt-manager-0.9.0-31。建立KVM虛擬機最簡單的方法是經過virt-manager接口。從控制檯窗口啓動這個工具,從root身份輸入virt-manager命令,點擊file菜單的"新建"選項virt-manager接口界面
#virt-manager //圖形化界面安裝虛擬機
(二)使用virt-install命令建立虛擬機
//本文重點介紹virt-install命令建立虛擬機
#yum groupinstall "Virtualization tools" -y //安裝脫機虛擬機鏡像管理工具
#virt-install --help
Usage: virt-install --name NAME --ramRAM STORAGE INSTALL [options]
Options:
--version showprogram's version number and exit
-h, --help show thishelp message and exit
--connect=URI Connect tohypervisor with libvirt URI
通用選項:
-n NAME, --name=NAME
客戶端事件名稱
-r MEMORY, --ram=MEMORY
以 MB 爲單位爲客戶端事件分配的內存
--vcpus=VCPUS 配置來賓帳戶的虛擬 CPU(vcpu) 數量,如:
--vcpus 5
--vcpus 5, maxcpus=10
--vcpussocket=2,cores=4,threads=2
--cpuset=CPUSET Set which physical CPUs domain can use.
--cpu=CPU CPU型號及功能,如:--cpu coreduo,+x2apic
--description=DESCRIPTION
在生成的 XML 中保存的可讀 VM 描述。
--security=SECURITY
設定域安全驅動器配置。
--numatune=NUMATUNE
爲域進程調整 NUMA 策略。
安裝方法選項:
-c CDROM, --cdrom=CDROM
光驅安裝介質
-l LOCATION, --location=LOCATION
安裝源(例如:nfs:host:/path、http://host/path ://host/path)
--pxe 使用 PXE 協議從網絡引導
--import 在磁盤映像中構建客體
--init=INIT 爲容器虛擬機啓動二進制的路基該您。例
如:
--init /path/to/app(包含應用程序)
--init /sbin/init(用於全部 OS 容器)
--livecd 將光驅介質視爲 Live CD
-x EXTRA, --extra-args=EXTRA
附加到使用 --location 引導的內核的參數
--initrd-inject=INITRD_INJECTIONS
使用 --location 爲 initrd 的 root
添加給定文件
--os-type=DISTRO_TYPE
要安裝的操做系統類型,例如:'linux'、'u
nix'、'windows'
--os-variant=DISTRO_VARIANT
The OS variant beinginstalled guests, e.g. 'fedora6',
'rhel5', 'solaris10', 'win2k'
--boot=BOOTOPTS 自選配置後安裝引導順序、菜單、永久
kernel 引導,等等。
存儲配置:
--disk=DISKOPTS Specifystorage with various options. Ex.
--diskpath=/my/existing/disk
--disk path=/my/new/disk,size=5(in gigabytes)
--diskvol=poolname:volname,device=cdrom,bus=scsi,...
--nodisks 不要爲該客戶端設置任何磁盤。
--filesystem=FILESYSTEMS
將主機目錄傳遞給虛擬機。例如:
--filesystem/my/source/dir,/dir/in/guest
--filesystemtemplate_name,/,type=template
聯網配置:
-w NETWORK, --network=NETWORK
Configure a guestnetwork interface. Ex:
--network bridge=mybr0
--networknetwork=my_libvirt_virtual_net
--networknetwork=mynet,model=virtio,mac=00:11...
--nonetworks 不要爲該客體建立網絡接口。
圖形配置:
--graphics=GRAPHICS
配置虛擬機顯示設置。例如:
--graphics vnc
--graphicsspice,port=5901,tlsport=5902
--graphics none
--graphicsvnc,password=foobar,port=5910,keymap=ja
--noautoconsole 不要自動嘗試鏈接到客戶端控制檯
設備選項:
--serial=SERIALS 配置虛擬機串口設備
--parallel=PARALLELS
配置虛擬機並口設備
--channel=CHANNELS 配置虛擬機溝通頻道
--console=CONSOLES 配置虛擬機與主機之間的文本控制檯鏈接
--host-device=HOSTDEVS
Configure physical hostdevices attached to the guest
--soundhw=SOUNDHW Configureguest sound device emulation
--watchdog=WATCHDOG
配置虛擬機 watchdog 設備
--video=VIDEO 配置虛擬機視頻硬件。
--smartcard=SMARTCARD
配置虛擬機智能卡設備。例如:
--smartcardmode=passthrough
--redirdev=REDIRDEV
Configure a guestredirection device. Ex:
--redirdevusb,type=tcp,server=192.168.1.1:4000
--panic=PANIC Configure a guest panic device. Ex:
--panic default
虛擬化平臺選項:
-v, --hvm 客戶端應該是一個全虛擬客戶端
-p, --paravirt 這個客戶端一個是一個半虛擬客戶端
--container This guestshould be a container guest
--virt-type=HV_TYPE
要使用的管理程序名稱(kvm、qemu、xen等等)
--arch=ARCH 模擬的 CPU 構架
--machine=MACHINE The machinetype to emulate
--noapic 爲全虛擬客戶端禁用 APIC(在 os-type/os-
variant db 中覆蓋數值)
--noacpi 爲全虛擬客戶端禁用 ACPI(在 os-type/os-
variant db 中覆蓋數值)
-u UUID, --uuid=UUID
客戶端 UUID。
其它選項:
--autostart 引導主機時自動啓動域。
--print-xml 輸出所生成域的
XML,而不是定義虛擬機。
--print-step=XMLSTEP
輸出具體安裝步驟(1,2,3,all)的
XML。
--noreboot 完成安裝後不要引導虛擬機。
--wait=WAIT 要等待的時間(以分鐘爲單位)
--dry-run 完成安裝步驟,但不要建立設備或者定義
虛擬機。
--force 對任意應用程序提示強制回答‘yes’,終止左右其它提示
-q, --quiet 禁止無錯誤輸出
--prompt 要求用戶爲模糊狀況或者須要的選項輸入。
-d, --debug 輸入故障排除信息
# virt-install --connectqemu:///system --name kvm4 --ram 500 --disk path=/dev/sdb5 --network bridge=br0--arch x86_64 --graphics sdl --location=/tmp/CentOS-7-x86_64-Minimal-1511.iso
開始安裝......
搜索文件.treeinfo...... |2.2 kB 00:00 ...
搜索文件vmlinuz...... | 9.8 MB 00:00 ...
搜索文件initrd.img...... | 73 MB 00:00 ...
ERROR No DISPLAY environment variable set. //出錯,解決方法以下:
# export DISPLAY=guilinuxbox:0.0
# virt-install --connect qemu:///system --name kvm4 --ram 500 --diskpath=/dev/sdb5 --network bridge=br0 --arch x86_64 --graphics sdl--location=/tmp/CentOS-7-x86_64-Minimal-1511.iso
開始安裝......
搜索文件.treeinfo...... |2.2 kB 00:00 ...
搜索文件vmlinuz...... | 9.8 MB 00:00 ...
搜索文件initrd.img...... | 73 MB 00:00 ...
ERROR unsupported configuration: sdl notsupported by '/usr/libexec/qemu-kvm'
Domain installation does not appearto have been successful.
If it was, you can restart yourdomain by running:
virsh --connect qemu:///system start kvm1
otherwise, please restart yourinstallation. //出錯,提示qemu-kvm沒有sdl接口,所以咱們換成vnc來鏈接虛擬機界面。解決方法以下:
# yum-y install virt-viewer
# virt-install --name CentOS-7_x86_64 --virt-type kvm --ram 1024 --disk path=/dev/sdb5 --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole --location=/tmp/CentOS-7-x86_64-Minimal-1511.iso --force
開始安裝......
搜索文件.treeinfo...... |2.2 kB 00:00 ...
搜索文件vmlinuz...... |9.8 MB 00:04 ...
搜索文件 initrd.img...... | 73 MB 00:15 ...
建立域...... | 0 B 00:19
'virt-viewer --help'
域安裝仍在進行。您能夠從新鏈接
到控制檯以便完成安裝進程。
# virsh list --all
Id
----------------------------------------------------
8 CentOS-7_x86_64 running
# netstat -tunlp|grep kvm
tcp 0 0 127.0.0.1:5900 0.0.0.0:* LISTEN 5149/qemu-kvm
生成kvm虛擬機:virt-install
查看在運行的虛擬機:virsh list
查看全部虛擬機:virsh list –all
查看kvm虛擬機配置文件:virsh dumpxml name
啓動kvm虛擬機:virsh start name
正常關機:virsh shutdown name
非正常關機(至關於物理機直接拔掉電源):virsh destroy name
刪除:virsh undefine name(完全刪除,找不回來了,若是想找回來,須要備份/etc/libvirt/qemu的xml文件)
根據配置文件定義虛擬機:virsh define file-name.xml
掛起,終止:virsh suspend name
恢復掛起狀態:virsh resumed name
編輯kvm的xml文件,更改虛擬機CPU配置
#virsh edit CentOS-7_x86_64
<vcpu placement='static'>1</vcpu> //當前爲1,自動擴容,最大爲4