一 什么是kvm
KVM 全稱 Kernel-Based Virtual Machine。也就是說 KVM 是基於 Linux 內核實現的,這就使得linux內核本身就相當於一個Hypervisor。
Hypervisor即vmm,主要功能就是用來控制生成vm,並管理多個vm的運行,不同的vm中可以安裝不同的操作系統,這些操作系統共用一台硬件主機,
因為直接使用linux內核的調度器進行管理,所以比xen的代碼少很多
二 為何要用kvm
虛擬化是雲計算的基礎之一,而無論是在部署,還是在研發、測試方面,kvm都是排在第一位的Hypervisor(即vmm)。
kvm以高性能,可擴展性、高安全性,以及低成本而深受用戶喜愛,這一切也與他基於linux內核實現有關。
三 kvm的功能
kvm用一個個進程來運行虛擬機。
最主要的功能:
- 基於kvm,可以執行熱遷移,將一個運行的虛擬機從一個運行vm從一台物理機移動到另外一台物理主機,而vm里的運行不受影響(幾台部署kvm虛擬化的物理機共享一個存儲,存儲內存放虛擬機的xml文件,這樣在另外一台主機啟一個虛擬機的進程是很快的,然后關聯上待遷移主機的xml文件,就實現了熱遷移);
- 可以保存當前虛擬機的運行狀態到硬盤,然后可以重新啟動虛擬機,這是虛擬機的運行狀態和之前一樣。
其余功能:
- 支持CPU 和 memory 超分(Overcommit)
- 支持半虛擬化I/O (virtio)
- 支持熱插拔 (cpu,塊設備、網絡設備等)
- 支持對稱多處理(Symmetric Multi-Processing,縮寫為 SMP )
- 支持 PCI 設備直接分配和 單根I/O 虛擬化 (SR-IOV)
- 支持 內核同頁合並 (KSM )
- 支持 NUMA (Non-Uniform Memory Access,非一致存儲訪問結構 )
四 常見虛擬化模式
按照Hypervisor的實現方式和位置不同,常見的形式分兩種
1. 全虛擬化
物理機上首先安裝常規的操作系統( Redhat、Ubuntu 和 Centos等),然后在操作系統上安裝kvm,kvm即Hypervisor,它會 作為 OS 上的一個程序模塊運行,並對管理虛擬機進行管理。除此之外:VirtualBox 和 VMWare Workstation 都屬於這個類型。
2. 半虛擬化
Hypervisor 直接安裝在物理機上,多個虛擬機在 Hypervisor 上運行。Hypervisor 實現方式一般是一個特殊定制的 Linux 系統。Xen 和 VMWare 的 ESXi 都屬於這個類型。
五 KVM架構
openstack可以兼容很多虛擬化解決方案,其中最主要的就是針對x86平台的kvm。
KVM 全稱 Kernel-Based Virtual Machine。也就是說 KVM 是基於 Linux 內核實現的,這就使得linux內核本身就相當於一個Hypervisor。
具體的:
基於kvm創建的vm就是一個普通的linux進程,由linux內核調度程序進行調度,vm因此可以使用linux內核已有的功能。vm的執行本質就是vm中cpu的執行,因此vm的每個cpu就是普通的linux進程。
KVM有一個內核模塊叫 kvm.ko,只提供 CPU 和內存的虛擬化,而針對於IO及其他硬件設備(網絡及存儲等)的虛擬化,則是交給qemu實現,qemu運行在用戶態通過/dev/kvm接口設置一個客戶機虛擬機服務器的地址空間,向kvm提供模擬的I/O,並且將它的視頻顯示映射回宿主的顯示屏。
其實qemu本身就是一種虛擬化技術,它與kvm的區別如下
1. 上圖的左側:完全基於Qemu純軟件(不包含操作系統內核)實現的虛擬化。kqemu是通過kqemu模塊實現內核態的加速,在用戶態的qemu通過訪問/dev/kqemu設備文件接口調用改進加速。不過,此類模式主要針對Guest os與Host os屬於統一cpu架構(比如都是x86的架構)。一個明顯的缺點是性能低下。
2. 上圖的右側:qemu+kvm實現的虛擬化(即qemu-kvm)。具體的,KVM並不能算是一個完整的虛擬化解決方案,kvm只是Linux標准內核加載了一個據說有幾萬行代碼的模塊kvm.ko。也就是說KVM僅可以在VT技術的基礎上,提供虛擬的處理器和虛擬內存,至於IO硬件的模仿都交給qemu去做。
創建虛擬機流程
-
- 標准的Linux內核中加入KVM的模塊kvm.ko變身成為一個VMM(VMM Virtual MachineMonitor)
- 在原有的用戶模式(工作在ring3)和內核模式(工作在ring0)兩種模式的基礎上增加了新的客戶模式。客戶模式存在的特權級別與ring0-3正交。(也就是說客戶模式也存在4個特權級別)
- 用戶創建虛擬機,通過調用用戶模式的qemu程序,qemu與kvm提供的libkvm庫為接口,傳遞創建指令。
- 打開/dev/kvm文件並獲得文件描述符fd后,通過ioctl指令寫入KVM_CREATE_KVM,即可創建一個虛擬機,並返回一個fd_vm的虛擬機文件描述符。
- 獲得fd_vm后,通過ioctl調用KVM_CREATE_VCPU指令,可以對fd_vm所對應的虛擬機創建vCPU,並對vCPU做初始化操作。
- 然后通過KVM_RUN指令對fd_vcpus操作,啟動運行虛擬機。
總結:
- Guest OS(此處vm1的linux os):客戶機系統,包括CPU(vCPU)、內存、驅動(Console、網卡、I/O 設備驅動等),被 KVM 置於一種受限制的 CPU 模式下運行。
- KVM:運行在內核空間,提供CPU 和內存的虛級化,以及客戶機的 I/O 攔截。Guest 的 I/O 被 KVM 攔截后,交給 QEMU 處理。
- QEMU:修改過的為 KVM 虛機使用的 QEMU 代碼,運行在用戶空間,提供硬件 I/O 虛擬化,通過 IOCTL /dev/kvm 設備和 KVM 交互。
KVM 是實現攔截虛機的 I/O 請求的原理:
QEMU-KVM:
其實 QEMU 原本不是 KVM 的一部分,它自己就是一個純軟件實現的虛擬化系統,所以其性能低下。但是,QEMU 代碼中包含整套的虛擬機實現,包括處理器虛擬化,內存虛擬化,以及 KVM需要使用到的虛擬設備模擬(網卡、顯卡、存儲控制器和硬盤等)。
為了簡化代碼,KVM 在 QEMU 的基礎上做了修改。VM 運行期間,QEMU 會通過 KVM 模塊提供的系統調用進入內核,由 KVM 負責將虛擬機置於處理的特殊模式運行。遇到虛機進行 I/O 操作,KVM 會從上次的系統調用出口處返回 QEMU,由 QEMU 來負責解析和模擬這些設備。
從 QEMU 的角度看,也可以說是 QEMU 使用了 KVM 模塊的虛擬化功能,為自己的虛機提供了硬件虛擬化加速。除此以外,虛機的配置和創建、虛機運行說依賴的虛擬設備、虛機運行時的用戶環境和交互,以及一些虛機的特定技術比如動態遷移,都是 QEMU 自己實現的。
KVM:
KVM 內核模塊在運行時按需加載進入內核空間運行。KVM 本身不執行任何設備模擬,需要 QEMU 通過 /dev/kvm 接口設置一個 GUEST OS 的地址空間,向它提供模擬的 I/O 設備,並將它的視頻顯示映射回宿主機的顯示屏。它是KVM 虛機的核心部分,其主要功能是初始化 CPU 硬件,打開虛擬化模式,然后將虛擬客戶機運行在虛擬機模式下,並對虛機的運行提供一定的支持。以在 Intel 上運行為例,KVM 模塊被加載的時候,它:
- 首先初始化內部的數據結構;
- 做好准備后,KVM 模塊檢測當前的 CPU,然后打開 CPU 控制及存取 CR4 的虛擬化模式開關,並通過執行 VMXON 指令將宿主操作系統置於虛擬化模式的根模式;
- 最后,KVM 模塊創建特殊設備文件 /dev/kvm 並等待來自用戶空間的指令。
四 KVM工具集合
Libvirt:簡單說就是 KVM 的管理工具。並且Libvirt 除了能管理 KVM 這種 Hypervisor,還能同時管理 vmware,XEN,Hyper-v, LXC,QEMU 等多種Hypervisor。
Libvirt 本質就是一組API,通常部署完libvirt后,都會包含 3 樣東西:一個API 庫,一個后台守護進程libvirtd和一個命令行工具virsh。
- API 庫使得其他人可以開發基於 Libvirt 的高級工具,比如 virt-manager,這是個圖形化管理KVM的常用工具。;
- libvirtd是服務程序,接收和處理 API 請求;
- virsh :基於 libvirt 的 命令行的常用工具 (CLI)。
一:libvirt實現在一台物理機上同時跑多個虛擬機監控程序vmm
libvirt期初是專門為Xen設計的一種管理API,后來被擴展為可支持多個VMM,libvirt以一組API的形式存在,負責與每個vmm通信,完成API請求
左圖是沒有引入libvirt時,一台機器只能運行一個Hypervisor/vmm,右圖是引入了libvirt時,一台機器可以同時運行多個Hypervisor/vmm,此時需要注意的是,libvirt把物理主機稱作節點,將來賓操作系統(guest os)稱為域Domain,而libvirt及其應用程序在宿主機Domain 0中運行
二 libvirtd提供從遠程應用程序訪問本地域的方式
三 libvrt api與相關驅動程序的層次結構。
libvirt 已經為表 1 所列舉出來的的虛擬機監控程序實現了驅動程序。隨着新的虛擬機監控程序在開源社區出現,其他驅動程序無疑也將可用。
四 libvirt主要功能總結
- Domain(虛擬機)管理:啟動、停止、暫停、保存、恢復和遷移。支持多種涉筆類型的熱插拔,如磁盤、網卡、內存和cpu。
- 遠程訪問支持:見圖2,只要在一台主機上運行libvirtd守護進程,所有的libvirt功能就都可以訪問和使用。支持多種網絡遠程傳播,使用最簡單的SSH,不需要額外的配置工作,比如example.com物理機運行了libvirtd,而且允許SSH訪問,下面命令就可以在遠程的主機上使用virsh命令:virsh -connect qemu+ssh://root@example.com/system
- 存儲管理:任何運行了libvirtd的主機都可以用來管理不同類型的存儲,如創建不同格式的文件映像(qcow2,vmdk,raw等),掛接NFS共享、列出現有的LVM卷組、創建新的LVM卷組和邏輯卷、對未處理過的磁盤設備分區、掛在iSCSI共享等等,因為libvirt可以遠程工作,所有這些都可以通過遠程主機來使用。
- 網絡接口管理:任何運行了libvirtd的主機都可用來管理物理和邏輯的網絡接口,可以列出現有的接口、配置參數、橋接、VLAN和關聯設備等,也可以創建新的網絡接口。
- 虛擬NAT和基於路由的網絡:任何運行了libvirtd的主機都可以用來管理和創建虛擬網絡。libvirt虛擬網絡使用防火牆規則作為路由器,讓虛擬機可以透明訪問主機的網絡。
ps:libvirt使用 C 語言編寫,可以由 Python,Ruby, Perl, PHP, Java 等語言調用,OpenStack 底層也使用 libvirt。更詳細猛擊這里
除此之外還包含下列工具:
virt-v2v:虛機格式遷移工具
virt-* 工具:包括 virt-install(創建KVM虛機的命令行工具),virt-viewer(連接到虛機屏幕的工具),virt-clone(虛機克隆工具),virt-top 等
sVirt:安全工具
五 kvm部署
5.1 虛擬化支持
KVM虛擬化需要CPU的硬件輔助虛擬化的支持,用來加速,在本環境中為Intel的CPU,使用的Intel VT技術。(該功能在有些主機里面可能需要去BIOS里面開啟)
5.2 軟件准備
操作系統: CentOS 7.2
軟件包: CentOS自帶yum源
關閉防火牆
關閉SELinux:將 /etc/sysconfig/selinux 中的 SELinux=enforcing 修改為 SELinux=disabled
開始安裝
5.3 檢查CPU虛擬化支持
如果是用vmware workstation的虛擬機做kvm實驗的化,需要開啟嵌套虛擬化
1.在物理機BIOS設置里開啟虛擬化功能
2.此時你的vm仍然不能開啟虛擬化,下列兩個
3.找到這台虛擬機存在的目錄
4.打開該目錄找到.vmx結尾的文件,增加一行
apic.xapic.enabled = "FALSE"
5.關閉虛擬機,然后啟動,就可以勾選開啟虛擬化功能了
進入虛擬機后查看虛擬化支持:
# grep -E 'svm|vmx' /proc/cpuinfo
vmx 為Intel的CPU指令集
svm 為AMD的CPU指令集
5.4 安裝軟件包
[root@localhost ~]# yum grouplist |grep '虛擬' 虛擬化主機 [root@localhost ~]# yum -y groupinstall '虛擬化主機'
[root@localhost 桌面]# lsmod |grep kvm
kvm_intel 138567 0
kvm 441119 1 kvm_intel
#以上輸出說明內核模塊加載成功,其中: kvm作為核心模塊,協同QEMU實現整個虛擬化環境的正常運行。 kvm_intel作為平台(Intel)獨立模塊,激活KVM環境的CPU硬件虛擬化支持。

qemu-kvm:主要的KVM程序包,該軟件包主要包含KVM內核模塊和基於KVM重構后的QEMU模擬器。KVM模塊作為整個虛擬化環境的核心工作在系統空間,負責CPU和內存的調度。QEMU作為模擬器工作在用戶空間,負責虛擬機I/O模擬。 qemu-img:主要用來QEMU磁盤鏡像的管理,如新建一塊磁盤鏡像給虛擬機。 libvirt:提供Hypervisor和虛擬機管理的API。 libvirt-client:KVM客戶端命令行管理工具virsh,負責虛擬機的啟動、停止和管理等。 libvirt-daemon:libvirtd守護進程,作為客戶端管理工具跟Hypervisor和虛擬機之間的橋梁。 libvirt-daemon-driver-xxx:從名字來看屬於libvirtd服務的驅動文件,作為libvirtd服務跟Hypervisor不同對象(如qemu模擬器,網絡,存儲等)間的接口。 libvirt-python:python的libvirt庫 python-virtinst:創建虛擬機所需要的命令行工具和程序庫 virt-install:創建和克隆虛擬機的命令行工具包。 virt-manager:圖形界面的KVM管理工具。 virt-top:虛擬機統計命令 virt-viewer:GUI連接程序,連接到已配置好的虛擬機 bridge-utils:網橋管理工具包,負責橋接網絡的創建、配置和管理等工作。
5.5 激活並啟動libvirtd服務
systemctl enable libvirtd
systemctl start libvirtd
5.6 網絡模式
詳見http://blog.csdn.net/cooling88/article/details/52203998
NAT方式:
virbr0網橋相當於一個hub或交換機,eth0相當於路由器,virbr0-nic相當於交換機virbr0上的一個接口,這個接口連接一根網線到路由器eth0
Bridge的方式:
br0網橋相當於一個hub或交換機,eth0相當於相當於交換機br0上的一個接口,這個接口連接一根網線到物理網絡
嘗試着從下圖總找出上述所說
5.7 配置橋接網絡
默認情況下所有虛擬機只能夠在host內部互相通信,如果需要通過局域網訪問虛擬機,需要創建一個橋接網絡。
1.停止NetworkManager服務
# systemctl stop NetworkManager
該服務開啟的情況下直接去修改網卡的配置文件會造成信息的不匹配而導致網卡激活不了。
2.修改以太網卡配置文件
(修改前先備份)# cd /etc/sysconfig/network-scripts
# vi ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
BRIDGE=br0
HWADDR=b8:ae:ed:7d:9d:11
NM_CONTROLLED=no
原有的以太網絡不需要配置IP地址,指定橋接的網卡設備(如br0)即可。
3.修改橋接網卡配置文件
# cd /etc/sysconfig/network-scripts
# vi ifcfg-br0
TYPE=Bridge
HWADDR=b8:ae:ed:7d:9d:11
BOOTPROTO=static
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.2.10
NETMASK=255.255.255.0
GATEWAY=192.168.2.1
DNS1=202.103.24.68
NM_CONTROLLED=no
#橋接網卡的需要配置IP地址,當然也可以用DHCP。需要注意的是橋接網卡br0中DEVICE的名字一定要與以太網卡eno1中BRIDGE對應。
強調:
1 #網卡配置文件中NM_CONTROLLED參數設置為no 2 3 #執行: 4 5 [root@localhost ~]# systemctl stop NetworkManager 6 [root@localhost ~]# systemctl disable NetworkManager
開啟主機IP地址轉發
# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
重啟網絡服務
# systemctl restart network
ps:針對NAT網路須知
需要掌握iptables:
詳細規則參考:http://blog.csdn.net/yu_xiang/article/details/9218589
1 #源地址轉換:內部訪問外部 2 iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 58.20.51.66 3 iptables-t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE 4 5 #目標地址轉換:外部訪問內部 6 iptables -t nat -A PREROUTING -d 202.103.96.112 -j DNAT --to-destination 192.168.0.112
5.8 驗證網絡
# ip a
eno1: mtu 1500 qdisc pfifo_fast master br0 state UP
br0: mtu 1500 qdisc noqueue state UP
inet 192.168.2.10/24 brd 192.168.2.255 scope global br0
截取了部分輸出,eno1和br0網卡都處於激活狀態,eno1橋接到br0,br0被分配了靜態IP地址。
5.9 嘗試連接Hypervisor
# virsh -c qemu:///system list
# virsh list
Id Name State
----------------------------------------
(由於沒有創建虛擬機,所以沒有條目顯示)
5.10 創建虛擬機
方法一:# virt-manager
針對這種方法,我們可以在服務端部署vncserver,然后用VNC Viewer來連接它的桌面,然后用圖形化去創建虛擬機

#安裝X-Windows圖形界面 yum -y groupinstall "X Window System" yum -y install gnome-classic-session gnome-terminal nautilus-open-terminal control-center liberation-mono-fonts #設置默認啟動圖形界面 unlink /etc/systemd/system/default.target ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target reboot #安裝vnc服務 yum install tigervnc-server -y #配置vnc cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service vim /etc/systemd/system/vncserver@\:1.service #修改內容 #ExecStart=/sbin/runuser -l root -c "/usr/bin/vncserver %i" #PIDFile=/root/.vnc/%H%i.pid #重啟systemd systemctl daemon-reload #為root用戶設置密碼 vncpasswd systemctl enable vncserver@:1.service systemctl start vncserver@:1.service #添加防火牆規則,放行vncserver firewall-cmd --permanent --add-service vnc-server systemctl restart firewalld.service #客戶端連接 #打開vncviewer客戶端工具,然后訪問地址是:服務端ip:1
方法二:virt-install
1:粗糙版:執行完了,並不能立即安裝操作系統
#要有橋brctl add-br br0
#安裝選項可用virt-install --help查看,寫的非常清楚
virt-install \ --name guest1-centos7-64 \ --memory 1024 \ --arch x86_64 \ --vcpus 2 \ --os-variant=rhel7 \ --disk /var/lib/libvirt/images/guest1-centos7-64.img,device=disk,bus=virtio,size=20,sparse=true \ --network bridge=br0 \ --noautoconsole \ --location=/iso/CentOS-7.0-1406-x86_64-DVD.iso

virt-install \ #安裝選項可用virt-install --help查看 --name=guest1-centos7-64 \ #虛擬機名稱 --ram=1024 \ #內存大小以MB為單位 --arch=x86_64 \ #cpu架構 --vcpus=2 \ #虛擬機cpu的個數 --check-cpu \ #檢查確定vcpu是否超過物理cpu個數,超過則發出警告 --os-type=linux \ #要安裝的操作系統類型,例如linux,unix,windows --os-variant=centos7.2 \ #要安裝的操作系統版本 --disk path=/var/lib/libvirt/images/guest1-centos7-64.img,device=disk,bus=virtio,size=20,sparse=true \ #虛擬機所用的磁盤文件或鏡像文件,size以G為單位 #--diskpath=/data/new.img,format=qcow2,size=10,bus=virtio \ #后面會講到制作qcow2格式的鏡像 #--nonsparse \ --network bridge=br0 \ #指定網絡,采用網橋 --noautoconsole \ #不自動開啟控制台 --location=http://example1.com/installation_tree/RHEL5.6-Serverx86_64/os \ #指定安裝操作系統給的鏡像位置 #--pxe \ #也可以是無人值守安裝 #--graphics #指定安裝通過哪種類型,可以是vnc,也可以沒有圖形,在這里我們沒有使用圖形直接使用文本方式
2:改進版:在命令行直接文本的方式裝系統
必須先做如下操作:
#針對Centos7+kvm為了執行console功能,即在控制台以文本的方式控制vm #在虛機里運行 [root@localhost ~]# grubby --update-kernel=ALL --args="console=ttyS0" [root@localhost ~]# reboot
然后才可以在命令行安裝操作系統
virt-install \ --name test1 \ --memory 1024 \ --arch x86_64 \ --vcpus 2 \ --os-type linux \ --os-variant=rhel7 \ --disk /data/kvm/test02.qcow2,format=qcow2,size=10,bus=virtio \ --network bridge=virbr0 \ --location=/iso/CentOS-7.0-1406-x86_64-DVD.iso \ --graphics none \ --console pty,target_type=serial \ --extra-args 'console=ttyS0,115200n8 serial'
方法三 使用 qemu-img 和 qemu-kvm 命令行方式安裝
(1)創建一個空的qcow2格式的鏡像文件
qemu-img create -f qcow2 windows-master.qcow2 10G
(2)啟動一個虛機,將系統安裝盤掛到 cdrom,安裝操作系統
qemu-kvm -hda windows-master.qcow2 -m 512 -boot d -cdrom /home/user/isos/en_winxp_pro_with_sp2.iso
(3)現在你就擁有了一個帶操作系統的鏡像文件。你可以以它為模板創建新的鏡像文件。使用模板的好處是,它會被設置為只讀所以可以免於破壞。
qemu-img create -b windows-master.qcow2 -f qcow2 windows-clone.qcow2
(4)你可以在新的鏡像文件上啟動虛機了
qemu-kvm -hda windows-clone.qcow2 -m 400
5.11 虛擬機操作
開關虛擬機
virsh start guest1-centos7-64 #開機 virsh shutdown guest1-centos7-64 #關機 virsh destroy guest1-centos7-64 #強制關閉電源 virsh list --all #查看虛擬機狀態
遠程管理虛擬機(qemu+ssh連接)
#在被管理的機器上 yum -y install virt-viewer export DISPLAY=被管理機IP:0.0 virt-virt-viewer -c qemu///system guest1-centos7-64 #本地管理虛擬機,獲取system權限,注意qemu后是三個/ #在管理機上 virt-viewer -c qemu+ssh://root@被管理機IP/system guest1-centos7-64 #遠程linux通過virt-viewer+ssh管理虛擬機guest1-centos7-64
制作鏡像文件
參考 http://www.361way.com/kvm-qcow2-preallocation-metadata/3354.html 示例:qemu-img create -f qcow2 -opreallocation=metadata /data/test02.img 10G;
raw格式與qcow2格式的對比:
raw的優勢如下:
- 簡單,是轉為其他虛擬機格式的通用中間格式,並能夠到處到其他引進模擬器中去
- 在支持稀疏文件的系統上,根據實際使用量來占用空間,而非原先設定的最大值(比如設定最高20GB,而實際只使用3GB)
- 以后能夠改變空間的最大值(把最高值20GB提高到200GB,qcow2也可以,不過要轉換為raw)
- 能夠直接被宿主機掛載,不用開虛擬機即可在宿主機和vm之間進行數據傳輸(此時不能開機)
- 直接讀寫虛擬機硬盤里的文件
qocw2性能更好:
- 即使在不支持稀疏的文件系統上,也可以獲得最小的空間
- 可以動態擴大,支持寫時復制
- AES加密
- zlib壓縮
- 支持多重虛擬機快照
- 然而raw的很多優勢,必須是在關機是才可以用,如直接掛載。而在生成環境不可能讓你這么做。
- raw格式不能做快照,后面有說明,需要轉換為qcow2格式,如果要使用qcow2格式的虛擬磁盤,需要事先創建qcow2格式的虛擬磁盤。
1. 開始安裝kvm a. 檢查你的系統是否支持虛擬化 grep -Ei 'vmx|svm' /proc/cpuinfo 如果有輸出內容,則支持,其中intelcpu支持會有vmx,amd cpu支持會有svm b. 通過yum安裝虛擬化的軟件包 yum install -y kvmvirt-* libvirt bridge-utils qemu-img 說明: kvm:軟件包中含有KVM內核模塊,它在默認linux內核中提供kvm管理程序 libvirts:安裝虛擬機管理工具,使用virsh等命令來管理和控制虛擬機。 bridge-utils:設置網絡網卡橋接。 virt-*:創建、克隆虛擬機命令,以及圖形化管理工具virt-manager qemu-img:安裝qemu組件,使用qemu命令來創建磁盤等。 c. 檢查kvm模塊是否加載 lsmod |grep kvm 正常應該是: kvm_intel 55496 3 kvm 337772 1 kvm_intel 如果沒有,需要執行 modprobe kvm-intel 還沒有就重啟一下試試 d. 配置網卡 cd /etc/sysconfig/network-scripts/ cp ifcfg-eth0 ifcfg-br0 分別編輯eth0和br0 ifcfg-eth0改成如下: DEVICE=eth0 HWADDR=00:0C:29:55:A7:0A TYPE=Ethernet UUID=2be47d79-2a68-4b65-a9ce-6a2df93759c6 ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=none BRIDGE=br0 ifcfg-br0改成如下: DEVICE=br0 #HWADDR=00:0C:29:55:A7:0A TYPE=Bridge #UUID=2be47d79-2a68-4b65-a9ce-6a2df93759c6 ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=static IPADDR=192.168.11.17 NETMASK=255.255.255.0 GATEWAY=192.168.11.1 DNS1=202.106.0.20 說明:我的虛擬機是橋接模式,所以設置br0的ip和我的真機同樣的網段,包括網關也是我路由器的ip,大家可以根據自己的環境去配置,目的是為了讓虛擬機可以上網。 /etc/init.d/network restart 查看網卡如下: br0 Linkencap:Ethernet HWaddr 00:0C:29:55:A7:0A inetaddr:192.168.11.17 Bcast:192.168.11.255 Mask:255.255.255.0 inet6addr: fe80::20c:29ff:fe55:a70a/64 Scope:Link UPBROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RXpackets:141326 errors:0 dropped:0 overruns:0 frame:0 TXpackets:90931 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RXbytes:456024940 (434.8 MiB) TX bytes:10933593 (10.4 MiB) eth0 Linkencap:Ethernet HWaddr 00:0C:29:55:A7:0A inet6addr: fe80::20c:29ff:fe55:a70a/64 Scope:Link UPBROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RXpackets:341978 errors:0 dropped:0 overruns:0 frame:0 TXpackets:90946 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RXbytes:468848861 (447.1 MiB) TX bytes:10934699 (10.4 MiB) lo Linkencap:Local Loopback inetaddr:127.0.0.1 Mask:255.0.0.0 inet6addr: ::1/128 Scope:Host UPLOOPBACK RUNNING MTU:65536 Metric:1 RXpackets:0 errors:0 dropped:0 overruns:0 frame:0 TXpackets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RXbytes:0 (0.0 b) TX bytes:0 (0.0 b) virbr0 Linkencap:Ethernet HWaddr 52:54:00:14:EF:D5 inetaddr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0 UPBROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RXpackets:0 errors:0 dropped:0 overruns:0 frame:0 TXpackets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RXbytes:0 (0.0 b) TX bytes:0 (0.0 b) e. 啟動或重啟libvirtd服務和messagebus 服務 /etc/init.d/libvirtd start /etc/init.d/messagebus restart 此時可以查看網絡接口列表 brctl show 結果如下: bridge name bridgeid STPenabled interfaces br0 8000.000c2955a70a no eth0 virbr0 8000.52540014efd5 yes virbr0-nic 2. 創建虛擬機 mkdir /data/ //創建一個存儲虛擬機虛擬磁盤的目錄,該目錄所在分區必須足夠大 virt-install \ --name aming1 \ --ram 512 \ --disk path=/data/aming1.img,size=30 \ --vcpus 1 \ --os-type linux \ --os-variant rhel6 \ --network bridge=br0 \ --graphics none \ --console pty,target_type=serial \ --location'http://mirrors.163.com/centos/6.7/os/i386/' \ --extra-args 'console=ttyS0,115200n8 serial' 說明: --name 指定虛擬機的名字 --ram 指定內存分配多少 --disk path 指定虛擬磁盤放到哪里,size=30 指定磁盤大小為30G,這樣磁盤文件格式為raw,raw格式不能做快照,后面有說明,需要轉換為qcow2格式,如果要使用qcow2格式的虛擬磁盤,需要事先創建qcow2格式的虛擬磁盤。參考 http://www.361way.com/kvm-qcow2-preallocation-metadata/3354.html 示例:qemu-img create -f qcow2 -opreallocation=metadata /data/test02.img 10G; --diskpath=/data/test02.img,format=qcow2,size=10,bus=virtio --vcpus 指定分配cpu幾個 --os-type 指定系統類型為linux --os-variant 指定系統版本 --network 指定網絡類型 --graphics 指定安裝通過哪種類型,可以是vnc,也可以沒有圖形,在這里我們沒有使用圖形直接使用文本方式 --console 指定控制台類型 --location 指定安裝介質地址,可以是網絡地址,也可以是本地的一個絕對路徑,(--location '/mnt/', 其中/mnt/下就是我們掛載的光盤鏡像mount /dev/cdrom /mnt)如果是絕對路徑, 已有本地鏡像可以 virt-install \ --name test02 \ --ram 512 \ --diskpath=/data/kvm/test02.qcow2,format=qcow2,size=10,bus=virtio \ --vcpus 1 \ --os-type linux \ --os-variant rhel7 \ --network bridge=br0 \ --graphics none \ --console pty,target_type=serial\ --location '/data/CentOS.iso' \ --extra-args'console=ttyS0,115200n8 serial' 會出現文本方式的安裝界面,選擇時區,安裝包的選擇(默認 Minial install)、root密碼設置,創建新用戶,以及網絡配置。在此沒看見有,注意設置一下DNS。 最后安裝完,reboot就進入剛剛創建的虛擬機了。要想退回到宿主機,ctrl ] 即可。 virsh list 可以列出當前的子機列表。 virsh start test01 啟動test01 virsh console test01 可以進入指定的子機 3. 克隆虛擬機 virt-clone --original test01 --name template--file /data/clone1.img 如果子機test01還未關機,則需要先關機,否則會報錯: ERROR 必須暫停或者關閉有要克隆設備的域。 關閉子機的方法是: virsh shutdown test01 說明:默認,我們沒有辦法在宿主機直接shutdown自己,我們需要借助於子機上的acpid服務才可以,這個服務說白了就是讓宿主機可以去調用子機的電源關閉的接口。所以,子機上需要安裝並啟動acpid服務。 先登錄子機: virsh console test01 登錄后,安裝acpid服務: yum install -y acpid 啟動: /etc/init.d/acpid start 按ctrl ] 退出來 此時再執行 virsh shutdowntest01 就可以啦。 克隆完后,virsh list all 就會發現clone1 這個子機,通過命令 virsh start clone1 可以開啟該子機。 4. virsh 常用操作 a. 開啟子機 virsh start test01 也可以在開啟的同時連上控制台 virsh start test01 --console b. 關閉子機 virsh shutdown test01 (這個需要借助子機上的acpid服務) 另外一種方法是 virsh destroy test01 c. 讓子機隨宿主機開機自動啟動 virsh autostart test01 解除自動啟動 virsh autostart --disable test01 d. 列出子機 virsh list //只能列出啟動的子機 virsh list --all //可以把所有子機都列出來 e. 刪除子機 virsh destroy clone1 virsh undefine clone1 rm -f /data/clone1.img f. 掛起子機 virsh suspend test01 h. 恢復子機 virsh resume test01 5. 快照管理 a. 創建快照 virsh snapshot-create test01 會報錯: unsupported configuration: internal snapshot fordisk vda unsupported for storage type raw 這是因為raw格式的鏡像不能做快照,所以需要先轉換一下格式 b. 磁盤鏡像轉換格式 先查看當前子機磁盤鏡像格式 qemu-img info /data/test01.img 結果是: image: /data/test01.img file format: raw virtual size: 30G (32212254720 bytes) disk size: 1.6G 把raw格式轉換為qcow格式(其實是復制了一份): qemu-img convert -f raw -O qcow2 /data/test01.img/data/test01.qcow2 qemu-img info /data/test01.qcow2 //再次查看格式,結果如下 image: /data/test01.qcow2 file format: qcow2 virtual size: 30G (32212254720 bytes) disk size: 1.1G cluster_size: 65536 現在我們還需要編輯子機配置文件,讓它使用新格式的虛擬磁盤鏡像文件 virsh edit test01 //這樣就進入了該子機的配置文件(/etc/libvirt/qemu/test01.xml),跟用vim編輯這個文件一樣的用法 需要修改的地方是: <driver name='qemu'type='raw' cache='none'/> <sourcefile='/data/test01.img'/> 改為: <driver name='qemu'type='qcow2' cache='none'/> <sourcefile='/data/test01.qcow2'/> c. 繼續創建快照 virsh snapshot-create test01 //這次成功了,提示如下 Domain snapshot 1437248443 created 列出快照: virsh snapshot-list test01 查看當前子機的快照版本: virsh snapshot-current test01 test01子機的快照文件在 /var/lib/libvirt/qemu/snapshot/test01/ 目錄下 d. 恢復快照 首先需要關閉子機 virsh destroy test01 確認子機是否關閉 virsh domstate test01 關閉 vish snapshot-list test01 //結果是 名稱 Creation Time 狀態 ------------------------------------------------------------ 1437248443 2015-07-19 03:40:43 +0800 shutoff 1437248847 2015-07-19 03:47:27 +0800 running virsh snapshot-revert test01 1437248443 e. 刪除快照 virsh snapshot-delete test01 1437248847 6. 磁盤擴容 a. 對於raw格式的虛擬磁盤擴容 qemu-img info /data/kvm/test03.img //本身只有9G 1. image: /data/kvm/test03.img 2. file format: raw 3. virtual size: 9.0G (9663676416 bytes) 4. disk size: 1.1G qemu-img resize /data/kvm/test03.img +2G qemu-img info /data/kvm/test03.img //現在增加了2G 1. image: /data/kvm/test03.img 2. file format: raw 3. virtual size: 11G (11811160064 bytes) 4. disk size: 1.1G 5. virsh destroy test03 //關閉test03虛擬機 virsh start test03 //開啟test03虛擬機 virsh console test03 //進入虛擬機 fdisk -l 查看已經磁盤分區已經增加 [root@localhost ~]# fdisk -l 但是磁盤掛載的空間並沒有增加 [root@localhost ~]# df -h Filesystem Size Used Avail Use%Mounted on /dev/mapper/VolGroup-lv_root 6.5G 579M 5.6G 10% / tmpfs 250M 0 250M 0%/dev/shm /dev/vda1 477M 26M 427M 6% /boot 因為新增加的空間還沒有划分使用。所以要繼續分區: [root@localhost ~]# fdisk /dev/vda 1. WARNING: DOS-compatible mode is deprecated.It's strongly recommended to 2. switch off the mode (command 'c') and change display units to 3. sectors (command 'u'). 4. 5. Command (m for help): p 6. 7. Disk /dev/vda: 11.8 GB, 11811160064 bytes 8. 16 heads, 63 sectors/track, 22885 cylinders 9. Units = cylinders of 1008 * 512 = 516096bytes 10.Sector size(logical/physical): 512 bytes / 512 bytes 11.I/O size(minimum/optimal): 512 bytes / 512 bytes 12.Diskidentifier: 0x000099f3 13. 14. Device Boot Start End Blocks Id System 15./dev/vda1 * 3 1018 512000 83 Linux 16.Partition 1does not end on cylinder boundary. 17./dev/vda2 1018 <font color="#ff0000">16645</font> 7875584 8e Linux LVM 18.Partition 2does not end on cylinder boundary. 19. 20.Command (mfor help):<font color="#ff0000"> n</font> 21.Commandaction 22. e extended 23. p primary partition (1-4) 24.p 25.Partitionnumber (1-4): <font color="#ff0000">3</font> 26.Firstcylinder (1-22885, default 1): <fontcolor="#ff0000">16646</font> 27.Lastcylinder, +cylinders or +size{K,M,G} (16646-22885, default 22885): 28.Usingdefault value 22885 29. 30.Command (mfor help): p 31. 32.Disk/dev/vda: 11.8 GB, 11811160064 bytes 33.16 heads, 63sectors/track, 22885 cylinders 34.Units =cylinders of 1008 * 512 = 516096 bytes 35.Sector size(logical/physical): 512 bytes / 512 bytes 36.I/O size(minimum/optimal): 512 bytes / 512 bytes 37.Diskidentifier: 0x000099f3 38. 39. Device Boot Start End Blocks Id System 40./dev/vda1 * 3 1018 512000 83 Linux 41.Partition 1does not end on cylinder boundary. 42./dev/vda2 1018 16645 7875584 8e Linux LVM 43.Partition 2does not end on cylinder boundary. 44.<fontcolor="#ff0000">/dev/vda3 16646 22885 3144960 83 Linux</font> 45. 46.Command (mfor help): w 47.Thepartition table has been altered! 48. 49.Callingioctl() to re-read partition table. 50. 51.WARNING:Re-reading the partition table failed with error 16: Device or resource busy. 52.The kernelstill uses the old table. The new table will be used at 53.the nextreboot or after you run partprobe(8) or kpartx(8) 54.Syncingdisks. 然后再把這個/dev/vda3 加入到lvm里面去: ls /dev/vda3 如果沒有這個分區,需要重啟一下。 [root@localhost ~]# pvcreate/dev/vda3 1. <spanstyle="line-height: 1.5; ">Physical volume "/dev/vda3" successfullycreated</span> [root@localhost ~]# pvs 1. PV VG Fmt Attr PSize PFree 2. /dev/vda2 <fontcolor="#ff0000"> VolGroup</font> lvm2a-- 7.51g 0 3. /dev/vda3 lvm2 --- 3.00g 3.00g [root@localhost ~]# vgextendVolGroup /dev/vda3 1. Volume group "VolGroup"successfully extended [root@localhost ~]# vgs 1. VG #PV #LV #SNAttr VSize <fontcolor="#ff0000">VFree</font> 2. VolGroup 2 2 0 wz--n- 10.50g <fontcolor="#ff0000">3.00g</font> [root@localhost ~]# lvs 1. LV VG Attr LSize PoolOrigin Data% Meta% Move Log Cpy%Sync Convert 2. lv_root VolGroup-wi-ao---- 6.71g 3. lv_swap VolGroup -wi-ao----816.00m [root@localhost ~]# lvextend -l +100%FREE /dev/VolGroup/lv_root 1. Size of logical volume VolGroup/lv_rootchanged from 6.71 GiB (1718 extents) to 9.71 GiB (2485 extents). 2. Logical volume lv_rootsuccessfully resized [root@localhost ~]# df -h 1. Filesystem Size Used Avail Use% Mounted on 2. /dev/mapper/VolGroup-lv_root 3. 6.5G 618M 5.6G 10% / 4. tmpfs 250M 0 250M 0% /dev/shm 5. /dev/vda1 477M 26M 427M 6% /boot [root@localhost ~]# resize2fs /dev/VolGroup/lv_root 1. resize2fs 1.41.12 (17-May-2010) 2. Filesystem at /dev/VolGroup/lv_root ismounted on /; on-line resizing required 3. old desc_blocks = 1, new_desc_blocks = 1 4. Performing an on-line resize of/dev/VolGroup/lv_root to 2544640 (4k) blocks. 5. The filesystem on /dev/VolGroup/lv_root isnow 2544640 blocks long. [root@localhost ~]# df -h 1. Filesystem Size Used Avail Use% Mounted on 2. /dev/mapper/VolGroup-lv_root 3. <fontcolor="#ff0000">9.5G </font>618M 8.4G 7% / 4. tmpfs 250M 0 250M 0% /dev/shm 5. /dev/vda1 477M 26M 427M 6% /boot 另外,如果是增加磁盤,思路是: 創建磁盤: qemu-img create -fraw /data/kvm/test03_2.img 5G 關閉虛擬機: virsh destroy test03 編輯配置文件: virsh edittest03 增加如下: 1. <disk type='file'device='disk'> 2. <driver name='qemu'type='raw' cache='none'/> 3. <source file='/data/kvm/test03_2.img'/> 4. <target dev='vdb'bus='virtio'/> 5. </disk> 開啟虛擬機:virsh start test03 進入虛擬機:virsh console test03 分區: fdisk /dev/vdb 格式化(略) 掛載(略) 當然也可以按照上面的思路把 /dev/vdb1 加入到 lvm里面去 b. qcow2格式 步驟基本上和raw一樣。如果提示 This image format doesnot support resize, 檢查一下你qemu-img create的時候,是否有加 preallocation=metadata 選項,如果有,就不能resize了。 7. 調整cpu和內存查看子機配置: virsh dominfo test02 virsh edit test02 修改: <memoryunit='KiB'>524288</memory> <currentMemoryunit='KiB'>524288</currentMemory> <vcpuplacement='static'>1</vcpu> 為: <memoryunit='KiB'>624288</memory> <currentMemoryunit='KiB'>624288</currentMemory> <vcpuplacement='static'>2</vcpu> 重啟虛擬機: virsh destroy test02 virsh start test02 8. 不重啟虛擬機在線增加網卡 virsh domiflist test02 查看test02子機的網卡列表 virsh attach-interface test02 --type bridge--source br0 //命令行增加一塊網卡 virsh dumpxml test02 >/etc/libvirsh/qemu/test02.xml //命令行增加的網卡只保存在內存中,重啟就失效,所以需要保存到配置文件中,其中/etc/libvirsh/qemu/test02.xml 為test02子機的配置文件 virsh console test02 //進入虛擬機后,執行 ifconfig -a 發現多了一個網卡 eth1 9. 虛擬機遷移 該方式要確保虛擬機是關機狀態。 virsh shutdown test02 virsh dumpxml test02 >/etc/libvirt/qemu/test03.xml // 如果是遠程機器,需要把該配置文件拷貝到遠程機器上 virsh domblklist test02 //查看test02子機的磁盤所在目錄 Target Source ------------------------------------------------ vda /data/add1.qcow2 rsync -av /data/add1.qcow2/data/test03.qcow2 //如果是遷移到遠程,則需要把該磁盤文件拷貝到遠程機器上 vi /etc/libvirt/qemu/test03.xm //因為是遷移到本機,配置文件用的是test02子機的配置,不改會有沖突,所以需要修改該文件,如果是遠程機器不用修改 修改domname: <name>test03</name> 修改uuid(隨便更改一下數字,位數不要變) <uuid>77bb10bd-3ad8-8899-958d-756063002969</uuid> 修改磁盤路徑: <disk type='file'device='disk'> <driver name='qemu'type='raw' cache='none'/> <source file='/data/test03.qcow2'/> <target dev='vda'bus='virtio'/> <address type='pci'domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </disk> virsh list --all //會發現新遷移的test03子機 |