什麼是KVM?node
KVM是開源軟件,全稱是Kernel-Based Virtual Machine(基於內核級虛擬機)技術;
是一種用於Linux內核中的虛擬化基礎設施,能夠將Linux內核轉化爲一個hypervisor;
KVM在07年2月被導入Linux 2.6.20核心中,以可加載核心模塊的方式被移植到FreeBSD及illumos上;
KVM在具有Intel VT或AMD-V功能的x86平臺上運行。它也被移植到S/390,PowerPC與IA-64平臺上。在Linux內核3.9版中,加入ARM架構的支持;
KVM目前由Red Hat等廠商開發,對CentOS/Fedora/RHEL等Red Hat系發行版支持極佳; (摘自wikipedia)vim
什麼又是」虛擬化」?bash
在計算機技術中,虛擬化(技術)或虛擬技術(英語:Virtualization)是一種資源管理技術,是將計算機的各類實體資源(CPU、內存、磁盤空間、網絡適配器等),予以抽象、轉換後呈現出來並可供分區、組合爲一個或多個電腦配置環境。由此打破實體結構間的不可切割的障礙,使用戶能夠比本來的配置更好的方式來應用這些電腦硬件資源(其實就是虛擬整個PC硬件)。這些資源的新虛擬部分是不受現有資源的架設方式,地域或物理配置所限制。通常所指的虛擬化資源包括計算能力和數據存儲。(摘自wikipedia)服務器
「Hypervisor」和主機虛擬化網絡
Hypervisor:
Hypervisor又稱虛擬機器監視器(英語:virtual machine monitor,縮寫爲 VMM)是用來創建與執行虛擬機器的部分電腦軟件,固件或是硬件。被Hypervisor用來執行一個或多個虛擬機器的電腦被稱爲主體機器(host machine),這些虛擬機器,則稱爲客體機器(guest machine)。hypervisor能夠用一個客體操做系統(guest operating systems)的外貌出現,提供虛擬的做業平臺,負責管理其餘客體操做系統的運做。在它之上運做的多個操做系統,共同分享了虛擬化以後的硬件資源。(摘自wikipedia)
能夠簡單理解Hypervisor爲超級管理員:這種超級管理分別運行在不一樣虛擬機上其功能是不同的;
Hypervisor功能是建立,管理,加載,分配,虛擬出物理機器的有效硬件資源給虛擬客戶機使用;
主機虛擬化:
經常使用的兩類虛擬化技術
1型虛擬化:在硬件上跑的不是宿主機(直接跑的是虛擬化軟件,需驅動底層硬件)所建立每一個主機都是虛擬機;
特色:
須要硬件支持
虛擬機監視器做爲主操做系統
運行效率高
2型虛擬化:在硬件安裝操做系統(操做系統安裝虛擬軟件vmware,virtualbox);
特色:
虛擬機監視器做爲應用程序運行在主操做系統環境內
運行效率通常較類型I低架構
徹底虛擬化與半虛擬化dom
徹底虛擬化:用軟件輔助並運行在物理機上,由軟件發起指令,內核捕獲;ssh
半虛擬化:Guest_OS明確知道本身運行在虛擬機上,向物理機發起特權指令調用;tcp
CPU虛擬化通常分兩種:(模擬,虛擬)編輯器
模擬與虛擬在於,虛擬(性能)比模擬(需靠軟件轉換)好;
CPU虛擬化
CPU虛擬化須要自己對硬件所支持,需修改內核;
x86 操做系統是直接運行於裸硬件設備,所以它自認爲徹底佔有計算機硬件,而處理及訪問應用程序和硬件設備是x86處理器底層四個特權級別來實現(環0,1,2,3);
環0:運行特權指令,只有操做系統纔能有權限(內核);
環1-2:因爲歷史緣由未使用;
環3:放的是一些非特權指令,可進程使用(一但調用就會觸發CPU異常,CPU軟中斷指令);
現有基於x86處理器的操做系統,多數UNIX、Linux以及Windows系列大都只用了環0和環3兩個特權級別;
沒有對比就沒有差別—>(Xen、KVM)
Xen: hypervisor(超級管理員),直接運行在硬件上,只驅動CPU內存,各類IO不驅動; 裝完後趕忙提供一個虛擬機(與xen一體),改內核重啓當即建立虛擬機把原宿主機改爲了虛擬機,之後就不啓動宿主機直接啓動Xen; 虛擬機命名:dom(原宿主機叫dom0管理其它虛擬機,I/O由它來驅動); kvm: 悄悄並腐蝕了寄生在內核宿主機之上的hypervisor,kvm是模塊若是要使用直接裝載就能夠; 若是裝載了kvm模塊內核當即變爲殭屍並變成了hypervisor,用戶空間變爲了其中一臺虛擬機的管理控制檯,徹底寄生不驅動任何驅動管理程序; 可虛擬CPU,內存,不能虛擬出來I/O設備,模擬I/O 需藉助外部組件qemu; qemu:存軟件實現的模擬器,性能很差。可虛擬CPU,內存,I/O,大小1M左右; qemu的加速器:qemu-accelerator(從模擬器變成虛擬機,需與架構一致); 組織方式: qemu去模擬I/O,需安裝在控制檯處dom0; kvm去虛擬化CPU,內存;
KVM的安裝和有關知識
安裝前提:
一、實現環境:CentOS7.2_x86_64
二、KVM依賴於HVM機制(interl是VT-X,AMD是amd-v);
三、查看系統是否支持虛擬化,確保內核編譯提供了kvm模塊; ~]# egrep 'vmx|svm' /proc/cpuinfo
四、KVM主要運行在x86機器上(核心模塊:kvm)
五、驗證檢測kvm模塊被正確裝載 ~]# modprobe kvm
~]# lsmod |grep kvm
~]# ls -l /dev | grep kvm
kvm模塊載入後系統的運行模式:
內核模式:形象描述爲,GuestOS執行I/O類操做或其它特殊指令操做,稱爲‘來賓-內核-模式’;
用戶模式:形象描述爲,表明GuestOS請求I/O類操做;
來賓模式:形象描述爲,GuestOS的非I/O模式,即‘來賓-用戶-模式’;
內核形象描述爲,kvm hypervisor
kvm的組件:
/dev/kvm:
工做於hypervisor在用戶空間可經過loctl()系統調用來完成vm的管理工做,且是一個字符設備;
功能:建立vm,爲vm分配內存,讀寫vcpu的寄存器向vcpu注入中斷運行vcpu等;
qemu進程:工做於用戶空間,主要用於實現模擬vm的I/O設備;
kvm的特性:
內存管理、存儲、等……
內存管理: 將分配給vm的內存交換至swap; 支持使用huge page; 支持使用intel_EPT或amd_RVI技術完成內在地址映射; GVA-->GPA-->HPA,GVA--HPA 支持KSM(kernel same-page merging) 硬件支持: 取決於Linux內核 存儲支持: 本地存儲 網絡附加存儲 存儲區域網絡 分佈式存儲(GlusterFS) 支持實時遷移: live migration(需使用共享存儲) 支持的GuestOS: Linux,Windows,OpenBSD,FreeBSD,OpenSolaris 設備驅動: IO設備的徹底虛擬化,實現模擬硬件 IO設備的半虛擬化,實現virtio virtio-blk,net,pci,console,balion(氣球膨脹擴展內存)
kvm的管理工具: qemu:
quem-kvm
qemu-img
libvirt:
kvm hypervsior:libvirtd
管理接口:
GUI:virt-manager,virt-viewer
CLI:virt-install,virsh
安裝管理工具: ~]# yum install -y libvirt
(大量依賴程序包,安裝前配置好yum環境) ~]# systemctl start libvirtd.service
(啓動libvirt守護進程) ~]# ifconfig
(查看虛擬的virbr0-橋設備,提供nat類型網絡)
安裝啓動虛擬機: ~]# yum install virt-manager virt-viewer virt-install
virt工具包的安裝 ~]# yum install qemu-kvm
圖形測試鏈接 ~]# virt-manager
若是系統是最小化安裝的,記得安裝此包(xorg-x11-xauth) ,否則在使用ssh鏈接主機時圖形沒法支持;
查看守護進程文件類型: ~]# rpm -ql libvirtd-daemon
配置文件 /etc/libvirt/libvirtd.conf
Unite file /usr/lib/systemd/system/libvirtd.service
相關術語: node:物理服務器
hypervisor:支持虛擬機運行的環境
domain:虛擬機
dom0:prilileged,特權域
domU:非特權域
hypervisor的訪問路徑:
本地及遠程URL
本地URL: driver[+transport]:///[PATH][?extra-param] driver:驅動名稱,例如qemu,xen,lxc; transport:傳輸方式 kvm使用qemu驅動,格式qemu:///system 遠程URL: driver[+transport]:///[user@][host][:port]/[PATH][?extra-param] 示例: qemu:///172.16.5.40/system qemu+ssh://root@172.16.5.40/system
建立網橋:
與物理網絡鏈接直接通訊,需建立網橋把物理網卡當’橋’來使用
手動配置方法
~]# cd /etc/sysconfig/network-scripts/
~]# vim ifcfg-eno16777736 (當’橋’用)
刪除IP地址
增長BRIDGE=’br0’
~]# cp ifcfg-eno16777736 if-br0
~]# vim if-br0
DEVICE=br0
TYPE=Bridge
name去掉,重啓就ok
使用virsh命令配置方法
注意:若是使用橋接接口,不能啓用NetworkManager服務
~]# virsh help iface-bridge
~]# virsh iface-list
~]# virsh iface-bridge eno16777736 br0 –no-stp
建立虛擬機:
此安裝方法略過…特別容易,記得選擇橋接接口就能夠,安裝方式pxe等;
virsh的經常使用命令
virsh help:獲取幫助
virsh keyword list:列出域 示例: ~]# virsh vcpuinfo rhel6.6 (列出虛擬CPU信息) ~]# virsh dumpxml rhel6.6 >/tmp/mytemplate.xml (基於已有虛擬機導出配置文件實現批量虛擬機實例) crate:建立並啓動域; define:建立域; domid:獲取域ID; domuuid:獲取域的uuid; dominfo:域信息; reboot:重啓域; destory:關閉域; shutdown:關閉域; undfine:刪除域; save:保存狀態至文件中; restore:從保存文件中恢復域狀態; pause:暫停域; resume:恢復暫停的域;
管理’域’資源的命令:
virsh help setmem:
setmem:更改域的內存大小(不可超出最大值)
~]# virsh setmem rhel6.6 768m –current
setmaxmem:設定內存最大值;
setvcpus:修改CPU數量;
~]# virsh setvcpus rhel6.6 1 –current
~]# virsh help vcpupin 能夠綁定在哪些CPU上
vcpuinfo:獲取域的vcpu信息;
~]# virsh vcpuinfo rhel6.6
domblkstart:顯示域塊設備相關信息;
~]# virsh domblkstart rhel6.6
domiflist:顯示域的接口列表
~]# virsh domiflist rhel6.6
~]# virsh domifstat rhel6.6 vnet0
ifacelist:獲取物理設備網絡信息
~]# virsh iface-list
動態增刪disk: qemu-img create virsh attach-disk virsh detach-disk 動態增刪interface virsh attach-interface type:bridge source:某橋的名稱 virsh detach-interface –mac MAC
附加磁盤設備,必須常見磁盤設備
包管理工具:yum install -y qemu-img
示例:qem-img create -f qcow2 -o ? /tmp/test.qcow2
~]# qem-img create -f qcow2 -o preallocation=metadata /tmp/test.qcow2 250G 支持稀疏格式
~]# ls lh /tmp/test.qcow2(顯示原始大小)
~]# qem-img resize /tmp/test.qcow2 調整空間大小
把映像文件附加到虛擬機上
~]# virsh help attach-disk 幫助
~]# virsh attach-disk rhel6.6 /tmp/test.img vdb 附加
~]# virsh domblklist rhel6.6 查看附加的
~]# fdisk -l 查看磁盤
拆出磁盤
~]# virsh help detach-disk
~]# virsh detach-disk rhel6.6 vdb
附加網絡接口,必須建立網絡接口
ip link add無用功,不須要手動添加會幫咱們自動添加
~]# ip link help
~]# ip link add name veth1.0 type veth peer veth1.1 建立一對網卡,一半1.0一半1.1
~]# ip link show
向虛擬機動態添加網卡
~]# brctl show (橋控制命令)
~]# ip link add veth1.0 type veth peer name veth1.1
~]# ip link show
向橋添加接口
~]# brctl addif virbr0 veth1.0
~]# brctl show
把另外一個接口添加到虛擬機上
~]# virsh help attach-interface
~]# virsh dumpxml rhel6.6
~]# virsh attach-interface rhel6.6 bridge virbr0
~]# virsh domiflist rhel6.6
~]# ifconfig -a
拆出網絡接口
~]# virsh help detach-interface
~]# virsh detach-interface rhel6.6 bridge –mac 52:54:00:4e:ca:4e
~]# virsh domiflist rhel6.6
~]# brctl show
使用qemu-kvm手動建立虛擬機
注意:qemu跟virsh沒有關係,不是virsh家族的,因此用virsh看不到運行中的虛擬機;
包管理工具
~]# yum install -y qemu-kvm ~]# rpm -ql qemu-kvm ~]# ln -sv /usr/libexec/qemu-kvm /usr/bin ~]# qemu-kvm -h 幫助 ~]# qemu-kvm -machine help 指定要模擬的主機類型 ~]# qemu-kvm -cpu ? 支持的CPU類型
建立虛擬機
~]# mkdir /vms/p_w_picpaths/test -pv ~]# cp cirros-0.3.0-x86_64-disk.img /vms/p_w_picpaths/test/test-0.qcow2 ~]# qemu-kvm -name test -m 64 -smp 2 -drive file=/vms/p_w_picpaths/test/test-0.qcow2,media=disk,if=virtio,format=qcow2,-net none,-nographic ~]# sudo su - 切換管理員帳號 ~]# help 獲取命令幫助 ~]# Ctrl+a+c 切換監控界面
啓用vnc功能在本機鏈接並支持圖形窗口界面接口
~]# qemu-kvm -name test -m 64 -smp 2 -drive file=/vms/p_w_picpaths/test/test-0.qcow2,media=disk,if=virtio,format=qcow2,-net none,-vnc:1 ~]# yum install -y tigervnc ~]# vncviewer:1
使用添加-net支持網絡功能以便加入到某個橋上,並快速激活此接口
激活接口可以使用腳本,僅適用於物理橋;
~]# vim /etc/qemu-ifup bridge=br0 if [-n "$1"];then ip link set $1 up sleep 1 brctl addif $bridge $1 else echo "error.no interface specified." exit 1 fi 在粘貼到vi編輯器內把刪除以行首開頭的空白行 全文搜索刪除行首空白行:(:%s/*[[:space:]]*//g)
~]# brctl show
~]# vim /etc/qemu-ifdown bridge=br0 if [-n "$1"];then ip link set $1 down sleep 1 brctl addif $bridge $1 else echo "error.no interface specified." exit 0 fi
啓動虛擬機測試
~]# qemu-kvm -name test -m 64 -smp 2 -drive file=/vms/p_w_picpaths/test/test-0.qcow2,media=disk,if=virtio,format=qcow2,-net nic,model=virtio,macaddr=52:54:00:00:01,-net tap,ifname=veth1 -vnc:1 ~]# vncviewer :1 ~]# sudo su - ~]# ifconfig -a
建立兩個網橋接口,讓兩臺虛擬機相互通訊(僅主機通訊)
包工具:
~]# yum install bridge-utils
~]# which brctl
~]# rpm -qf /usr/sbin/brctl
~]# brctl 獲取幫助
~]# brctl addbr mybr0 添加橋後非活動
~]# ip link set mybr0 up
啓動兩臺虛擬機,並橋接到mybr0網卡上
~]# cp /etc/qemu-ifup-mybr0 bridge=mybr0 ~]# cp /etc/qemu-ifdown-mybr0 bridge=mybr0 ~]# qemu-kvm -name test -m 64 -smp 2 -drive file=/vms/p_w_picpaths/test/test-0.qcow2,media=disk,if=virtio,format=qcow2,-net nic,model=virtio,macaddr=52:54:00:00:01,-net tap,ifname=veth1,script=/etc/qemu-ifup-mybr0,downscript=/etc/qemu-ifup-mybr0,-vnc:1 -daemonize ~]# mkdir /vms/p_w_picpaths/test1/ ~]# cp ./cirros-0.3.0-x86_64-disk.img /vms/p_w_picpaths/test1/test-1.qcow2 ~]# qemu-kvm -name test -m 64 -smp 2 -drive file=/vms/p_w_picpaths/test1/test-1.qcow2,media=disk,if=virtio,format=qcow2,-net nic,model=virtio,macaddr=52:54:00:00:02,-net tap,ifname=veth2,script=/etc/qemu-ifup-mybr0,downscript=/etc/qemu-ifup-mybr0,-vnc:1 -daemonize ~]# brctl show (確保兩個都被橋到物理橋上)
啓動兩臺虛擬機並配置網卡地址
~]# vncviewer :1
~]# ifconfig eth0 10.1.0.50/16 up
~]# vncviewer :2
~]# ifconfig eth0 10.1.0.60/16 up
~]# ping兩臺機器
啓動兩臺虛擬機並配置網卡地址後與物理機通訊
~]# ifconfig mybr0 10.1.0.254/16 up
~]# 去ping各虛擬機和物理機
讓兩臺虛擬機實現(nat通訊)
~]# route add default gw 10.1.0.254 在vnc1上添加路由
~]# cat /proc/sys/net/ipv4/ip_forward 在物理機上開網卡間轉發功能
~]# tcpdump -i eno16777736 -nn -icmp 抓包看下
~]# 這時物理機能ping出去,可是從vncping的包進不來
~]# 此時在物理機器上加入源地址轉發策略
~]# iptables -t nat -A POSTROUTING -s 10.0.0.0/16 -j SNAT --to-source 172.16.5.40
~]# 再次在物理機上發出ping請求,這時包就能夠到達物理機上了
讓兩臺虛擬機實現與外部網卡地址通訊
在物理機上br0上加入子接口
~]# ifconfig br0:0 172.16.5.70/16
~]# iptables -t nat -vnL --line-numbers
~]# iptables -t nat -A POSTROUTING -s 10.0.0.0/16 -j SNAT --to-source 172.16.5.70
~]# iptables -t nat -A PREROUTING -d 172.16.5.70 -j DNAT --to-destination 10.1.0.50
~]# ping 172.16.5.70 在vnc1上發出ping請求
~]# tcpdump -i mybr0 -nn -icmp 在物理機上抓包
使用網絡名稱地址空間虛擬路由器
~]# ip netns add route1 ~]# ip netns list ~]# ip netns exec route1 tcpdump -i eth0 -nn -icmp ~]# ip netns exec route1 bash 打開虛擬路由環境route1的bash窗口 ~]# exit 退出此虛擬環境
done......