一,什麼是KVMpython
KVM包括不少部件:首先,它是一個Linux內核模塊(如今包括在主線中)用於轉換處理器到一種新的用戶 (guset) 模式。用戶模式有本身的ring狀態集合,可是特權ring0的指令會陷入到管理器(hypervisor)的代碼。因爲這是一個新的處理器執行模型,代 碼不須要任何的改動。 除了處理器狀態轉換,這個內核模塊一樣處理很小一部分低層次的模擬,好比MMU註冊(用於管理VM)和一部分PCI模擬的硬件。 在可預見的將來,Qemu團隊專一於硬件模擬和可移植性,同時KVM團隊專一於內核模塊(若是某些部分確實有性能提高的話,KVM會將一小部分模擬代碼移 進來)和與剩下的用戶空間代碼的交互。 kvm-qemu可執行程序像普通Qemu同樣:分配RAM,加載代碼,不一樣於從新編譯或者調用calling KQemu,它建立了一個線程(這個很重要);這個線程調用KVM內核模塊去切換到用戶模式,而且去執行VM代碼。當遇到一個特權指令,它重新切換會 KVM內核模塊,該內核模塊在須要的時候,像Qemu線程發信號去處理大部分的硬件仿真。 這個體系結構一個比較巧妙的一個地方就是客戶代碼被模擬在一個posix線程,這容許你使用一般Linux工具管理。若是你須要一個有2或者4核的虛擬 機,kvm-qemu建立2或者4個線程,每一個線程調用KVM內核模塊並開始執行。併發性(若果你有足夠多的真實核)或者調度(若是你無論)是被通用的 Linux調度器,這個使得KVM代碼量十分的小 當一塊兒工做的時候,KVM管理CPU和MEM的訪問,QEMU仿真硬件資源(硬盤,聲卡,USB,等等)當QEMU單獨運行時,QEMU同時模擬CPU和 硬件。linux
2、KVM架構ubuntu
kvm基本結構有2個部分構成:vim
kvm 驅動,如今已是linux kernel的一個模塊了。其主要負責虛擬機的建立,虛擬內存的分配,VCPU寄存器的讀寫以及VCPU的運行。安全
另個組成是Qemu,用於模擬虛擬機的用戶空間組件,提供I/O設備模型,訪問外設的途徑。bash
3、KVM 工做原理網絡
kvm基本工做原理概述:架構
用戶模式的qemu利用libkvm經過ioctl進入內核模式,kvm模塊未虛擬機建立虛擬內存,虛擬CPU後執行VMLAUCH指令進入客戶模 式。加載Guest OS並執行。若是Guest OS 發生外部中斷或者影子頁表缺頁之類的狀況,會暫停Guest OS的執行,退出客戶模式出行異常處理,以後從新進入客戶模式,執行客戶代碼。若是發生I/O事件或者信號隊列中有信號到達,就會進入用戶模式處理。(如 下圖)併發
4、手動安裝配置KVMide
1.安裝前的準備 1.CPU支持虛擬化(Inter-VT、AMD-V) [root@localhost ~]# grep --color 'svm|vmx|lm' /proc/cpuinfo 相關CPU功能標誌包括: svm=安全虛擬機(AMD-V) vmx=虛擬機x86(Inter-VT) lm=長模式(64位支持) 2. BIOS開啓CPU虛擬化支持 1)重啓 2)按delete鍵 3) 進入BIOS開啓 2.安裝虛擬化(yum配置完畢) # yum -y install kvm python-virtinst libvirt bridge-utils virt-manager qemu-kvm-tools virt-viewer virt-v2v qemu-kvm tunctl [root@localhost ~]#vim /etc/sysconfig/selinux //關閉selinux SELINUX=disabled 3.啓動libvirtd [root@localhost ~]# /etc/init.d/libvirtd start //啓動 [root@localhost ~]# ps -e|grep libvirtd //查看是否啓動 [root@localhost ~]#chkconfig libvirtd on 註釋:永久開啓!否則系統重啓後不會自動啓動這個服務的喲~ # virsh iface-bridge eth0 br0 註釋:建立網絡橋! 驗證: ifconfig br0 註釋:觀察IP地址是否跑到了br0網卡上! 4.配置網絡橋接 root@localhost network-script]# vi ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes BOOTPROTO=none BRIDGE=br0 [root@localhost network-scripts]# vi ifcfg-br0 DEVICE=br0 TYPE=Bridge ONBOOT=yes BOOTPROTO=static IPADDR=192.168.0.100 GATEWAY=192.168.0.1 NETMASK=255.255.255.0 DNS1=192.168.0.1 DELAY=0 5.重啓網絡 [root@localhost]# service NetworkManager stop //這個關閉掉就行 中止 NetworkManager 守護進程: [肯定] 註釋:爲何關閉它呢~由於它和KVM橋接網卡衝突! #chkconfig NetworkManager off 註釋:永久關閉該服務!!!否則系統重啓後還會本身再把這個服務開啓的喲~ [root@localhost rules.d]# service network restart 6.用virt-install生成.img文件(參數含義在上一篇KVM初體驗已有註釋) # virt-install --name=ubuntu1 --ram 1024 --vcpus=1 --disk path=/root/ubuntu1.img,size=10 --accelerate --cdrom /root/redhat6.4.iso --graphics vnc,port=5920 --network bridge=br0 [root@localhost ~]# vi /etc/libvirt/qemu.conf vnc_listen = "0.0.0.0" user = "root" //去掉註釋 group = "root" //去掉註釋 dynamic_ownership = 0 //去掉註釋,把1改成0 7.啓動虛擬機 虛擬機使用方法: virsh destroy 虛擬機名 #關閉虛擬機 virsh undefine 虛擬機名 #刪除虛擬機 virsh start 虛擬機名 #開啓虛擬機 virsh list --all 顯示全部虛擬機 virsh console 虛擬機名 #鏈接虛擬機
手動安裝完畢,如今就能夠在命令行裏秀操做了。
5、自動化腳本安裝KVM
#!/bin/bash echo "[1] 配置YUM" echo "[2] 安裝KVM工具" echo "[3] 設置橋接" echo "[4] 手動安裝虛擬機" echo "[5] 查看虛擬機" echo "[6] 開啓虛擬機" echo "[7] 關閉虛擬機" echo "[8] 鏈接虛擬機" echo "[9] 自動安裝虛擬機" echo "[0] 退出" read -p "type:" NUM if [ $NUM = 0 ];then exit; elif [ $NUM = 1 ];then #配置YUM rm -rf /etc/yum.repos.d/*; cat > /etc/yum.repos.d/yum.repo << EOF [yum] name=yum enabled=1 gpgcheck=0 baseurl=ftp://192.168.0.200/rhel6.4 EOF elif [ $NUM = 2 ];then #安裝KVM工具 LANG=en yum groupinstall "Virtualization*" -y; elif [ $NUM = 3 ];then #設置橋接 chkconfig NetworkManager off; chkconfig network on; service NetworkManager stop; service network start; yum install "bridge-utils" -y; service libvirtd restart; chkconfig libvirtd on; virsh iface-bridge eth0 br0; elif [ $NUM = 4 ];then #安裝虛擬機 read -p "輸入虛擬機的名字:" NAME read -p "輸入虛擬及硬盤大小(G): " SIZE read -p "輸入虛擬機內存大小(M): " MEM ping -c 1 192.168.0.200 > /dev/null if [ $? -ne 0 ];then echo "沒法接連192.168.0.200,請檢查網絡!"; exit; fi virt-install --nographics -n $NAME --os-type=linux --os-variant=rhel6 -r $MEM --arch=x86_64 --vcpus=1 --disk path=/var/lib/libvirt/p_w_picpaths/$NAME,size=$SIZE,format=qcow2 -w bridge=br0 -l ftp://172.16.8.100/rhel6.4 -x " console=ttyS0"; elif [ $NUM = 5 ];then #查看虛擬機 virsh list --all elif [ $NUM = 6 ];then #開機 read -p "虛擬機名稱: " XNAME virsh start $XNAME; elif [ $NUM = 7 ];then #關閉 read -p "虛擬機名稱: " XNAME &> /dev/null virsh destroy $XNAME; elif [ $NUM = 8 ];then #鏈接虛擬機 read -p "虛擬機名稱: " XNAME virsh console $XNAME; elif [ $NUM = 9 ];then #自動安裝虛擬機 read -p "輸入虛擬機的名字:" NAME read -p "輸入虛擬及硬盤大小(G): " SIZE read -p "輸入虛擬機內存大小(M): " MEM ping -c 1 192.168.0.200 > /dev/null if [ $? -ne 0 ];then echo "沒法接連192.168.0.200,請檢查網絡!"; exit; fi virt-install --nographics -n $NAME --os-type=linux --os-variant=rhel6 -r $MEM --arch=x86_64 --vcpus=1 --disk path=/var/lib/libvirt/p_w_picpaths/$NAME,size=$SIZE,format=qcow2 -w bridge=br0 -l ftp://192.168.0.200/rhel6.4 -x "ks=ftp://192.168.0.200/rhel6.4.ks console=ttyS0"; else echo "請輸入:0~9數字!"; fi
注:此腳本已基本實現KVM自動化安裝的基本功能。
總結:
其實KVM的安裝和使用都很方便簡單的,你們要理解KVM各個參數的含義。最關鍵的就是KVM的網絡橋接的設置,可是如今KVM在某些方面仍是有必定的缺陷(好比建立光驅要關機等),但願會在後續版本中有所改進,在這裏你們要多看官方軟件自身的文檔,會有很大的幫助。