一:什麼是 KVM KVM 是指基於 Linux 內核的虛擬機(Kernel-based Virtual Machine)。 2006 年 10 月,由以色列的 Qumranet 組織開發的一種新的“虛擬機”實現方案。 2007 年 2 月發佈的 Linux 2.6.20 內核第一次包含了 KVM ...
一:什麼是 KVM
KVM 是指基於 Linux 內核的虛擬機(Kernel-based Virtual Machine)。 2006 年 10 月,由以色列的 Qumranet 組織開發的一種新的“虛擬機”實現方案。 2007 年 2 月發佈的 Linux 2.6.20 內核第一次包含了 KVM 。增加 KVM 到 Linux 內核是 Linux 發展的一個重要里程碑,這也是第一個整合到 Linux 主線內核的虛擬化技術。
KVM 在標準的 Linux 內核中增加了虛擬技術,從而我們可以通過優化的內核來使用虛擬技術。在 KVM 模型中,每一個虛擬機都是一個由 Linux 調度程式管理的標準進程,你可以在用戶空間啟動客戶機操作系統。一個普通的 Linux 進程有兩種運行模式:內核和用戶。 KVM 增加了第三種模式:客戶模式(有自己的內核和用戶模式)。
一個典型的 KVM 安裝包括以下部件:
- 一個管理虛擬硬體的設備驅動,這個驅動通過一個字元設備 /dev/kvm 導出它的功能。通過 /dev/kvm 每一個客戶機擁有其自身的地址空間,這個地址空間與內核的地址空間相分離或與任何一個正運行著的客戶機相分離。
- 一個模擬硬體的用戶空間部件,它是一個稍微改動過的 QEMU 進程。從客戶機操作系統執行 I/O 會擁有 QEMU。QEMU 是一個平臺虛擬化方案,它允許整個 PC 環境(包括磁碟、顯示卡(圖形卡)、網路設備)的虛擬化。任何客戶機操作系統所發出的 I/O 請求都被攔截,並被路由到用戶模式用以被 QEMU 過程模擬模擬。
二: 安裝 KVM
2.1 系統要求
KVM 需要有 CPU 的支持 (Intel VT 或 AMD SVM),在安裝 KVM 之前檢查一下 CPU 是否提供了虛擬技術的支持
- 基於
Intel
處理器的系統,運行grep vmx /proc/cpuinfo
查找 CPU flags 是否包括vmx
關鍵詞 - 基於
AMD
處理器的系統,運行grep svm /proc/cpuinfo
查找 CPU flags 是否包括svm
關鍵詞 - 檢查 BIOS,確保 BIOS 里開啟
VT
選項
註:
- 一些廠商禁止了機器 BIOS 中的 VT 選項 , 這種方式下 VT 不能被重新打開
- /proc/cpuinfo 僅從 Linux 2.6.15(Intel) 和 Linux 2.6.16(AMD) 開始顯示虛擬化方面的信息。請使用 uname -r 命令查詢您的內核版本。如有疑問,請聯繫硬體廠商
egrep "(vmx|svm)" /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt lahf_lm dts tpr_shadow vnmi flexpriority ept vpid flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt lahf_lm dts tpr_shadow vnmi flexpriority ept vpid flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt lahf_lm dts tpr_shadow vnmi flexpriority ept vpid flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt lahf_lm dts tpr_shadow vnmi flexpriority ept vpid flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt lahf_lm dts tpr_shadow vnmi flexpriority ept vpid flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt lahf_lm dts tpr_shadow vnmi flexpriority ept vpid flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt lahf_lm dts tpr_shadow vnmi flexpriority ept vpid flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt lahf_lm dts tpr_shadow vnmi flexpriority ept vpid
2.2 安裝 kvm 軟體
安裝 KVM 模塊、管理工具和 libvirt (一個創建虛擬機的工具)
yum install -y qemu-kvm libvirt virt-install virt-manager bridge-utils
/etc/init.d/libvirtd start
chkconfig libvirtd on
2.2.1 確保正確載入 KVM 模塊
lsmod | grep kvm
kvm_intel 54285 0
kvm 333172 1 kvm_intel
2.2.2 檢查 kvm 是否正確安裝
virsh -c qemu:///system list
Id Name State
----------------------------------------------------
如果這裡是錯誤信息,說明安裝出現問題
2.3 配置網路-網橋模式
kvm 上網有兩種配置,一種是 default,它支持主機和虛擬機的互訪,同時也支持虛擬機訪問互聯網,但不支持外界訪問虛擬機,另外一種是 bridge 方式,可以使虛擬機成為網路中具有獨立 IP 的主機。
2.3.1 預設網路 virbro
預設的網路連接是 virbr0,它的配置文件在 /var/lib/libvirt/network 目錄下,預設配置為
cat /var/lib/libvirt/network/default.xml
default
77094b31-b7eb-46ca-930e-e0be9715a5ce
2.3.2 橋接網路
配置橋接網卡,配置如下
more /etc/sysconfig/network-scripts/ifcfg-\*
:::::::::::::: 新建文件
/etc/sysconfig/network-scripts/ifcfg-br0
::::::::::::::
DEVICE=br0
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.39.20
NETMASK=255.255.255.0
GATEWAY=192.168.39.1
DNS1=8.8.8.8
:::::::::::::: 物理網卡
/etc/sysconfig/network-scripts/ifcfg-em1
::::::::::::::
DEVICE=em1
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
BRIDGE=br0
::::::::::::::
2.4 配置網路-NAT模式
NATM模式下不用配置為網卡
2.5配置 VNC
(1) 修改 VNC 服務端的配置文件
[root@LINUX ~]# vim /etc/libvirt/qemu.conf
vnc_listen = "0.0.0.0" 第十二行,把 vnc_listen 前面的#號去掉。
(2) 重啟 libvirtd 和 messagebus 服務
[root@LINUX ~]# /etc/init.d/libvirtd restart
Stopping libvirtd daemon: [ OK ]
Starting libvirtd daemon: libvirtd: initialization failed [FAILED]
解決辦法:
[root@LINUX ~]# echo "export LC_ALL=en_US.UTF-8" >> /etc/profile
[root@LINUX ~]# source /etc/profile
[root@LINUX ~]# /etc/init.d/libvirtd restart
[root@LINUX ~]# /etc/init.d/messagebus restart
三:創建虛擬機
virt-manager 是基於 libvirt 的圖像化虛擬機管理軟體,操作類似 vmware,不做詳細介紹。
- (1)Virt-manager 圖形化模式安裝
- (2)Virt-install 命令模式安裝【本文使用此方式】
- (3)Virsh XML 模板安裝
3.1 上傳 ISO
[root@LINUX ~]# mkdir -p /home/iso
[root@LINUX ~]# mkdir -p /home/kvm
將 iso 拷貝到 /home/iso 目錄
3.2 創建 kvm 虛擬機的磁碟文件
本例創建的磁碟文件為 10G,實際使用中應註意下 /home 的空間,可以設置為 100G
[root@LINUX ~]# cd /home/kvm/
[root@LINUX ~]# qemu-img create -f qcow2 -o preallocation=metadata kvm_mode.img 10G
3.3 啟動虛擬機
3.3.1 啟動虛擬機參數說明
virt-install命令有許多選項,這些選項大體可分為下麵幾大類,同時對每類中的常用選項也做出簡單說明。
一般選項:指定虛擬機的名稱、記憶體大小、VCPU個數及特性等;
- -n NAME, --name=NAME:虛擬機名稱,需全局惟一;
- -r MEMORY, --ram=MEMORY:虛擬機內在大小,單位為MB;
- --vcpus=VCPUS[,maxvcpus=MAX][,sockets=#][,cores=#][,threads=#]:VCPU個數及相關配置;
- --cpu=CPU:CPU模式及特性,如coreduo等;可以使用qemu-kvm -cpu ?來獲取支持的CPU模式;
安裝方法:指定安裝方法、GuestOS類型等;
- -c CDROM, --cdrom=CDROM:光碟安裝介質;
- -l LOCATION, --location=LOCATION:安裝源URL,支持FTP、HTTP及NFS等,如ftp://172.16.0.1/pub;
- --pxe:基於PXE完成安裝;
- --livecd: 把光碟當作LiveCD;
- --os-type=DISTRO_TYPE:操作系統類型,如linux、unix或windows等;
- --os-variant=DISTRO_VARIANT:某類型操作系統的變體,如rhel5、fedora8等;
- -x EXTRA, --extra-args=EXTRA:根據--location指定的方式安裝GuestOS時,用於傳遞給內核的額外選項,例如指定kickstart文件的位置,--extra-args "ks=http://172.16.0.1/class.cfg"
- --boot=BOOTOPTS:指定安裝過程完成後的配置選項,如指定引導設備次序、使用指定的而非安裝的kernel/initrd來引導系統啟動等 ;例如:
- --boot cdrom,hd,network:指定引導次序;
- --boot kernel=KERNEL,initrd=INITRD,kernel_args=”console=/dev/ttyS0”:指定啟動系統的內核及initrd文件;
存儲配置:指定存儲類型、位置及屬性等;
- --disk=DISKOPTS:指定存儲設備及其屬性;格式為--disk /some/storage/path,opt1=val1,opt2=val2等;常用的選項有:
- device:設備類型,如cdrom、disk或floppy等,預設為disk;
- bus:磁碟總結類型,其值可以為ide、scsi、usb、virtio或xen;
- perms:訪問許可權,如rw、ro或sh(共用的可讀寫),預設為rw;
- size:新建磁碟映像的大小,單位為GB;
- cache:緩存模型,其值有none、writethrouth(緩存讀)及writeback(緩存讀寫);
- format:磁碟映像格式,如raw、qcow2、vmdk等;
- sparse:磁碟映像使用稀疏格式,即不立即分配指定大小的空間;
- --nodisks:不使用本地磁碟,在LiveCD模式中常用;
網路配置:指定網路介面的網路類型及介面屬性如MAC地址、驅動模式等;
- -w NETWORK, --network=NETWORK,opt1=val1,opt2=val2:將虛擬機連入宿主機的網路中,其中NETWORK可以為:
- bridge=BRIDGE:連接至名為“BRIDEG”的橋設備;
- network=NAME:連接至名為“NAME”的網路;
- 其它常用的選項還有:
- model:GuestOS中看到的網路設備型號,如e1000、rtl8139或virtio等;
- mac:固定的MAC地址;省略此選項時將使用隨機地址,但無論何種方式,對於KVM來說,其前三段必須為52:54:00;
- --nonetworks:虛擬機不使用網路功能;
圖形配置:定義虛擬機顯示功能相關的配置,如VNC相關配置;
- --graphics TYPE,opt1=val1,opt2=val2:指定圖形顯示相關的配置,此選項不會配置任何顯示硬體(如顯卡),而是僅指定虛擬機啟動後對其進行訪問的介面;
- TYPE:指定顯示類型,可以為vnc、sdl、spice或none等,預設為vnc;
- port:TYPE為vnc或spice時其監聽的埠;
- listen:TYPE為vnc或spice時所監聽的IP地址,預設為127.0.0.1,可以通過修改/etc/libvirt/qemu.conf定義新的預設值;
- password:TYPE為vnc或spice時,為遠程訪問監聽的服務進指定認證密碼;
- --noautoconsole:禁止自動連接至虛擬機的控制台;
設備選項:指定文本控制台、聲音設備、串列介面、並行介面、顯示介面等;
- --serial=CHAROPTS:附加一個串列設備至當前虛擬機,根據設備類型的不同,可以使用不同的選項,格式為“--serial type,opt1=val1,opt2=val2,...”,例如:
- --serial pty:創建偽終端;
- --serial dev,path=HOSTPATH:附加主機設備至此虛擬機;
- --video=VIDEO:指定顯卡設備模型,可用取值為cirrus、vga、qxl或vmvga;
3.3.2 bridge 網路模式啟動虛擬機
有獨立 IP 時使用這種方式
[root@LINUX ~]# chmod -R 777 /etc/libvirt
[root@LINUX ~]# chmod -R 777 /home/kvm
[root@LINUX ~]#virt-install --name=kvm_test --ram 4096 --vcpus=4 \
-f /home/kvm/kvm_mode.img --cdrom /home/iso/sucunOs_anydisk.iso \
--graphics vnc,listen=0.0.0.0,port=7788, --network bridge=br0 \
--force --autostart
3.3.3 NAT 模式啟動虛擬機
沒有獨立 IP 時使用這種方式
[root@LINUX ~]# chmod -R 777 /etc/libvirt
[root@LINUX ~]# chmod -R 777 /home/kvm
[root@LINUX ~]#virt-install --name=kvm_test --ram 4096 --vcpus=4 \
-f /home/kvm/kvm_mode.img --cdrom /home/iso/sucunOs_anydisk.iso \
--graphics vnc,listen=0.0.0.0,port=7788 \
--force --autostart
3.4 連接虛擬機
- (1) 網上下載 VNC 客戶端
- (2) 用 VNC 客戶端連接並安裝虛擬機的操作系統(VNC 連上之後,跟安裝 linux Centos 6.5 系統一樣,重新裝一次)
點擊 continue 是如果出現閃退的情況,請修改 Option->Expert->ColorLevel 的值為 full
四:管理 KVM
4.1 管理 kvm 上的虛擬機
- virsh list #顯示本地活動虛擬機
- virsh list --all #顯示本地所有的虛擬機(活動的 + 不活動的)
- virsh start x #啟動名字為 x 的非活動虛擬機
- virsh shutdown x #正常關閉虛擬機
- virsh dominfo x #顯示虛擬機的基本信息
- virsh autostart x #將 x 虛擬機設置為自動啟動