kvm簡介
node
Linux Kernel-based Virtual Machine (KVM) 是一款開源的虛擬化軟件,是徹底虛擬化的一種實現,KVM的虛擬化須要有硬件的支持,且其只能運行於64位系統上。其實KVM僅是內核的一個模塊,宿主機的內核加載了kvm的模塊後就可使用工具建立虛擬機,該模塊在Linux2.6.20以後就集成在Linux的的各個主要發行版中。python
kvm的相關模塊:vim
[root@node1 ~]# lsmod | grep kvm kvm_intel 54285 0 kvm 333172 1 kvm_intel
kvm的架構圖:centos
其實kvm模塊僅負責CPU與內存的虛擬化管理,其自身不會虛擬I/O設備,須要藉助於qemu來實現管理用戶空間和模擬I/O等相關功能。只是qemu是經過徹底模擬的形式來建立I/O設備,性能低下,爲了提升性能,I/O設備儘可能使用半虛擬化設備virtio,virtio驅動在2.6.25以後直接整合進了Linux內核,部署的虛擬機可以直接驅動對應設備。bash
在部署虛擬機以前首先須要檢查當前的服務器硬件是否支持硬件虛擬化技術,查看輸出的cpu信息中flags這一項裏是否有vmx(Intel的cpu),amd的cpu爲svm。若是沒有這一項,就表示cpu不支持硬件虛擬化,kvm則不能使用。服務器
[root@node1 ~]# grep --color=auto -Ei "vmx|svm" /proc/cpuinfo
使用qemu-kvm部署虛擬機網絡
安裝對應的軟件包。
架構
[root@node1 ~]# yum install -y qemu-kvm qemu-kvm-tools
在RHEL6上,qemu-kvm命令位於/usr/libexec目錄中。因爲此目錄不屬於PATH環境變量,故沒法直接使用,經過建立一個/usr/bin/目錄下的連接來解決該問題。dom
[root@node1 ~]# ln -sv /usr/libexec/qemu-kvm /usr/bin/qemu-kvm `/usr/bin/qemu-kvm' -> `/usr/libexec/qemu-kvm'
配置網橋tcp
橋設備不支持使用NetworkManager來管理,使用network來管理。簡單起見,能夠安裝橋設備管理程序包brctl-utils,經過命令來完成建立。正真橋功能的實現是內核中的某一模塊,因此不使用brctl-utils的功能,手動配置的方式也能夠實現。
[root@node1 ~]# service NetworkManager stop [root@node1 ~]# chkconfig NetworkManager off
[root@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0 DEVICE=br0 TYPE=Bridge ONBOOT=yes NM_CONTROLLED=no BOOTPROTO=none IPADDR=192.168.1.106 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 STP=on DNS1=61.153.81.74 DNS1=202.96.104.27 USERCTL=no #防止網絡環路
eth0設備當作交換機使用:
[root@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=no BOOTPROTO=none BRIDGE=br0 USERCTL=no
配置完成後,重啓網卡。
[root@node1 ~]# service network restart [root@node1 ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000c293331f2 yes eth0
在啓動虛擬機時,使用script=file指定腳本(默認爲/etc/qemu-ifup)來配置當前網絡接口,並使用downscript=file指定的腳本(默認爲/etc/qemu-ifdown)在虛擬機關閉時撤消接口配置;使用script=no和downscript=no可分別用來禁止執行腳本。
編輯/etc/qemu-ifup:
vim /etc/qemu-ifup #!/bin/bash # switch=br0 if [ -n "$1" ]; then ip link set $1 up sleep 0.5s brctl addif $switch $1 exit 0 else echo "Error:no specifed Interface." exit 1 fi
該腳本中的$1(第一個參數)爲ifname指定的tap設備,配置完成後爲腳本添加執行權限:
[root@node1 ~]# chmod u+x /etc/qemu-ifup
建立磁盤鏡像文件
[root@node1 ~]# qemu-img create -f qcow2 -o size=30G /vm/img/centOS_1.qcow2 Formatting '/vm/img/centOS_1.qcow2', fmt=qcow2 size=32212254720 encryption=off cluster_size=65536
安裝系統
這裏使用pxe的方式安裝操做系統,最多見的方式是在虛擬機啓動時直接導入鏡像文件。
[root@node1 ~]# qemu-kvm -name "centOS_1" -m 1024 -cpu host -smp 1 -drive file=/vm/i mg/centOS_1.qcow2,if=virtio,index=0,media=disk,format=qcow2 -boot order=nc -net nic,m odel=virtio -net tap,ifname=vnet0,script=/etc/qemu-ifup,downscript=no VNC server running on `::1:5900'
-boot order=nc #指定引導次序,先經過網絡方式引導,而後是磁盤。
這裏使用的磁盤接口是virtio(經過半虛擬化的方式實現),virtio的磁盤設備在虛擬機中體現的文件爲「vda」,須要將ks文件中的sda設備改成vda。以上命令的各個選項能夠經過man文檔查看。
虛擬機啓動以後,圖形信息默認輸出至VNC會話,該服務監聽在本地的5900端口,也能夠經過-vnc選項動態指定。
使用vncviewer查看:
[root@node1 ~]# vncviewer :5900
啓動安裝過程,
在使用vncviewer查看以前,須要使宿主機支持顯示圖形界面:
[root@node1 ~]# yum groupinstall "X Window System" [root@node1 ~]# yum groupinstall Desktop [root@node1 ~]# yum install tigervnc-server [root@node1 ~]# yum install tigervnc
圖形界面的顯示比較佔用帶寬,能夠在啓動虛擬機時指定-nographic選項,在當前命令行中直接輸出虛擬機的字符界面。這須要在虛擬機上的/etc/grub.conf文件中添加內核參數「console=ttyS0「,貌似在建立虛擬機時沒法直接向內核注入參數,使用virt-install建立時就能夠。
使用qemu進行實時遷移
實驗環境:
192.168.1.106 -->192.168.1.127
在192.168.1.127上配置好環境(例如網橋,磁盤鏡像...),遷移過程只是遷移內存中的數據,若是遷移過程當中,虛擬機實例內存的改變量超出了網絡帶寬的傳輸能力,這個遷移將沒法完成。
將192.168.1.106上將磁盤鏡像文件同步至192.168.1.127,固然最好是使用共享存儲:
[root@node1 ~]# scp /vm/img/centOS_1.qcow2 192.168.1.127:/vm/img/
同步虛擬機啓動時建立網絡設備的腳本文件:
[root@node1 ~]# scp /etc/qemu-ifup 192.168.1.127:/etc/
在192.168.1.106上啓動虛擬機,併爲虛擬機配置好網絡。
[root@node1 ~]# qemu-kvm -name "centOS_1" -m 1024 -cpu host -smp 1 -drive file=/vm/i mg/centOS_1.qcow2,if=virtio,index=0,media=disk,format=qcow2,cache=writeback -boot ord er=cn -net nic,model=virtio -net tap,ifname=vnet0,script=/etc/qemu-ifup,downscript=no -nographic
在192.168.1.127上使用一樣的鏡像文件啓動虛擬機,啓動時使用-incoming選項,實例不會啓動而是等待來自其餘主機的遷移請求。
[root@node3 ~]# qemu-kvm -name "centOS_1" -m 1024 -cpu host -smp 1 -drive file=/vm/i mg/centOS_1.qcow2,if=virtio,index=0,media=disk,format=qcow2,cache=writeback -boot ord er=cn -net nic,model=virtio -net tap,ifname=vnet0,script=/etc/qemu-ifup,downscript=no -incoming tcp:0:5678 VNC server running on `::1:5900'
進入monitor端查看虛擬機狀態(用vnc打開圖形界面後,使用Ctrl+Alt+2進入monitor端,Ctrl+Alt+1切換回文本行界面):
在192.168.1.106上開始遷移過程:
(qemu) info status VM status: running (qemu) migrate tcp:192.168.1.127:5678 (qemu) info status VM status: paused (post-migrate)
在192.168.1.127上查看虛擬機狀態,能夠看到虛擬機相對於遷移以前已經處於運行狀態。
在遷移過程當中,對被遷移的虛擬機發起ping請求,僅其中一個響應時間較長。
使用libvirt部署虛擬機
libvirt這套工具是對qemu工具的二次封裝,具備更好的用戶體驗,且適用於管理不一樣架構上的虛擬化技術,也支持遠程鏈接,libvirt具備更強大的功能且更通用。
使用libvirt須要安裝的包,並須要啓動libvirtd服務。
[root@node1 ~]# yum install -y libvirt virt-manager virt-viewer python-virtinst [root@node1 ~]# service libvirtd start Starting libvirtd daemon: [ OK ]
建立橋設備:
[root@node1 ~]# virsh iface-bridge eth0 br0 Created bridge br0 with attached device eth0 Bridge interface br0 started [root@node1 ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000c293331f2 yes eth0 virbr0 8000.52540046a8b2 yes virbr0-nic
建立磁盤鏡像文件:
[root@node1 ~]# qemu-img create -f qcow2 -o size=30G /vm/img/centOS_1.qcow2 Formatting '/vm/img/centOS_1.qcow2', fmt=qcow2 size=32212254720 encryption=off cluster_size=65536
使用virt-install啓動虛擬機,並安裝操做系統。
[root@node1 ~]# virt-install --connect qemu:///system --virt-type kvm --name centOS6.5_1 --vcpus 1 --ram 1024 --disk path=/vm/img/centOS_1.qcow2,size=30,bus=virtio,sparse,forma t=qcow2 --network bridge=br0,model=virtio --location r/centos-6.5-x86_64/ --extra-args "ks=http://192.168.3.10/cobbler/ks.cfg console=ttyS0 seri al" --force --noautoconsole --nographics
--location #指定安裝源
--extra-args #指定額外的參數,ks指定安裝過程所用的ks文件,console=ttyS0爲注入的內核參數。
這個與qemu-kvm建立的虛擬機相似,默認虛擬機的顯示類型爲vnc,且監聽在本地的5900端口,若在建立虛擬機時,指定--nographics,虛擬機的顯示經過文本界面輸出。這時須要爲虛擬機的內核添加參數console=ttyS0,最好是在建立虛擬機時指定(--extra-args "kconsole=ttyS0")。而後在宿主機上能夠經過「virsh console domainName」進入虛擬機的終端。使用」Ctrl+]「退出虛擬機的終端。以下圖:
若已經存在鏡像文件,建立虛擬機時直接導入:
[root@node1 ~]# virt-install --connect qemu:///system --virt-type kvm --name centOS6.5_1 --vcpus 1 --ram 1024 --disk path=/vm/img/centOS_1.qcow2,size=30,bus=virtio,sparse,forma t=qcow2 --network bridge=br0,model=virtio --import --force --noautoconsole
虛擬機建立完成後,其配置信息保存在/etc/libvirt/qemu目錄中,文件名與虛擬機相同,格式爲XML。因此虛擬機在建立時指定的名稱(--name)必須惟一。
對於已經建立好的虛擬機可經過virsh命令來管理,簡單介紹幾個經常使用的子命令:
查看本機上的全部已啓動的虛擬機:
[root@node1 ~]# virsh list Id Name State ---------------------------------------------------- 2 centOS6.5_1 running
啓動關閉某個虛擬機:
[root@node1 ~]# virsh start centOS6.5_1 [root@node1 ~]# virsh shutdown centOS6.5_1
刪除一個虛擬機:
[root@node1 ~]# virsh undefine centOS6.5_1
導出虛擬機的配置信息;根據定義好的配置信息建立虛擬機(不啓動)
[root@node1 ~]# virsh dumpxml centOS6.5_1 > /tmp/centOS6.5_2.xml [root@node1 ~]# virsh define /tmp/centOS6.5_2.xml
關於更具體說明查看「virsh help」.................^_^