搭建KVM虛擬機項目實戰記錄


Kernel-based Virtual Machine的簡稱,是一個開源的系統虛擬化模塊,自Linux 2.6.20之后集成在Linux的各個主要發行版本中。它使用Linux自身的調度器進行管理,所以相對於Xen,其核心源碼很少。KVM的虛擬化需要硬件支持(如Intel VT技術或者AMD V技術)。是基於硬件的完全虛擬化。而Xen早期則是基於軟件模擬的Para-Virtualization,新版本則是基於硬件支持的完全虛擬化。但Xen本身有自己的進程調度器,存儲管理模塊等,所以代碼較為龐大。廣為流傳的商業系統虛擬化軟件VMware ESX系列是基於軟件模擬的Full-Virtualization。

1.KVM簡介

虛擬化技術類型和架構:

  • 主機虛擬化:xen, kvm, virtualbox, ...
  • 容器(用戶空間隔離): lxc(LinuX Container), openvz, ...
  • 系統庫虛擬化:wine, ...
  • 應用程序級虛擬化:jvm, pvm,...

主機虛擬化:
CPU:

  • 模擬:emulation, 虛擬機的arch與物理平台的arch可以不相同;qemu;
  • 虛擬:virtualizatio

內存:
MMU virtualization:

  • Intel: EPT, Extended Page Table
  • AMD: NPT, Nested Page Table

TLB virtualization:tagged TLB
IO:

  • Emulation
  • Para-virtualization
  • IO-through:IO透傳

主機虛擬化的類型:

  • TYPE-I:於硬件級別直接運行hypervisor;(xen, vmware ESX/ESXI)
  • TYPE-II:於硬件級別運行一個OS(Host OS),而此OS上運行一個VMM;vmware workstation, virtualbox, kvm

Linux目前流行的開源虛擬化技術解決方案:

  • 主機虛擬化:xen, kvm, virtualbox
  • 容器級:lxc, libcontainer, runC, openvz
  • 模擬器:qemu

KVM的組件:

  • kvm.ko:模塊
  • API
  • qemu-kvm:用戶空間的工具程序;qemu-kvm is an open source virtualizer that provides hardware emulation for the KVM hypervisor.
  • libvirt:Libvirt is a C toolkit to interact with the virtualization capabilities of recent versions of Linux (and other OSes). The main package includes the libvirtd server exporting the virtualization support.

快速使用kvm技術

# yum install libvirt-daemon-kvm qemu-kvm virt-manager
# modprobe kvm
# systemctl start libvirtd.service
# virsh iface-bridge INTERFACE BRIDGE_NAME
# virt-manager  &

總結:

虛擬化技術的分類:
(1) 模擬:Emulation(Qemu, PearPC, Bochs, ...)
(2) 完全虛擬化:Full Virtualization,Native Virtualization
BT/hvm:VMWare Workstation, VirtualBox, VMWare Server, Parallels Desktop, KVM(hvm), XEN(hvm)
(3) 半虛擬化:Para-Virutalization,特點:GuestOS明確知道自己運行虛擬機之上;
xen, UML(user-mode linux)
(4) 容器級虛擬化:LXC, OpenVZ, libcontainer, runC, rkt, Linux V Servers, Virtuozzo, ...
(5) 庫級別虛擬化:wine
(6) 程序級虛擬化jvm, pvm, ...

KVM的組件:兩類組件:

(kvm.ko)/dev/kvm:工作為hypervisor,在用戶空間可通過系統調用ioctl()與內核中的kvm模塊交互,從而完成虛擬機的創建、啟動、停止、刪除等各種管理功能;

qemu-kvm進程:工作於用戶空間,用於實現IO設備模擬;用於實現一個虛擬機實例;

KVM模塊load進內存之后,系統的運行模式:

  • 內核模式:GuestOS執行IO類的操作時,或其它的特殊指令操作時的模式;它也被稱為“Guest-Kernel”模式;
  • 用戶模式:Host OS的用戶空間,用於代為GuestOS發出IO請求;
  • 來賓模式:GuestOS的用戶模式;所有的非IO類請求;

安裝使用KVM:
判斷CPU是否支持硬件虛擬化:

grep -i -E '(vmx|svm|lm)' /proc/cpuinfo
  • vmx:Intel VT-x
  • svm:AMD AMD-v

在虛擬機中嵌套虛擬機:開機前:

運行中的一個kvm虛擬機就是一個qemu-kvm進程,運行qemu-kvm程序並傳遞給它合適的選項及參數即能完成虛擬機啟動,終止此進程即能關閉虛擬機;
kvm工具棧:
qemu:qemu-kvm 、qemu-img(CentOS內核中)
libvirt:GUI:(virt-manager, virt-viewer)、(CLI: virsh, virt-install)

安裝:
(1) 裝載內核模塊modprobe kvm

使用virt-manager管理KVM
# yum install qemu-kvm libvirt-daemon-kvm virt-manager
# modprobe kvm
# systemctl start libvirtd.service
# virt-manager &

網絡虛擬化:
二層的虛擬網絡設備:kernel net bridge/brctl、openvswitch
CentOS 7創建物理橋,使用內核自帶的橋接模塊實現:
橋接口配置文件保留地址信息;

  • TYPE=Bridge
  • Device=BRIDGE_NAME

物理網卡配置文件:刪除地址、掩碼和網關等相關的配置,添加BRIDGE=BRIDGE_NAME
重啟網絡服務

2.KVM實戰應用

Qemu:

  • 處理器模擬器
  • 仿真各種IO設備
  • 將仿真設備連接至主機的物理設備
  • 提供用戶接口

qemu-kvm命令語法:qemu-kvm  [options]  [disk_image]
選項有很多類別:標准選項、塊設備相關選項、顯示選項、網絡選項、...
標准選項:

  • -machine [type=]name:-machine help來獲取列表,用於指定模擬的主機類型;
  • -cpu cpu:-cpu help來獲取列表;用於指定要模擬的CPU型號;
  • -smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]:指明虛擬機上vcpu的數量及拓撲;
  • -boot [order=drives][,once=drives][,menu=on|off] [,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time][,strict=on|off]
    •   order:各設備的引導次序:c表示第一塊硬盤,d表示第一個光驅設備;-boot order=dc,once=d
  • -m megs:虛擬機的內存大小;
  • -name NAME:當前虛擬機的名稱,要惟一;

塊設備相關的選項:

  • -hda/-hdb file:指明IDE總線類型的磁盤映射文件路徑;第0和第1個;
  • -hdc/-hdd file:第2和第3個;
  • -cdrom file:指定要使用光盤映像文件;
  • -drive [file=file][,if=type][,media=d][,index=i] [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]:
    file=/PATH/TO/SOME_IMAGE_FILE:映像文件路徑; if=TYPE:塊設備總線類型,ide, scsi, sd, floppy, virtio,... media=TYPE:介質類型,cdrom和disk; index=i:設定同一類型設備多個設備的編號; cache=writethrough|writeback|none|directsync|unsafe:緩存方式; format=f:磁盤映像文件的格式;
    View Code

顯示選項:

  • -display type:顯示的類型,sdl, curses, none和vnc;
  • -nographic:不使用圖形接口;
  • -vga [std|cirrus|vmware|qxl|xenfb|none]:模擬出的顯卡的型號;
  • -vnc display[,option[,option[,...]]]]:啟動一個vnc server來顯示虛擬機接口; 讓qemu進程監聽一個vnc接口;
  • -monitor stdio:在標准輸出上顯示monitor界面;

options:password:連接此服務所需要的密碼;
Ctrl-a, c:在console和monitor之間切換;
Ctrl-a, h
網絡選項:
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v] 

為虛擬機創建一個網絡接口,並將其添加至指定的VLAN; model=type:指明模擬出的網卡的型號,ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio; -net nic,model=? macaddr=mac:指明mac地址;52:54:00:
View Code

-net tap[,vlan=n][,name=str][,fd=h][,fds=x:y:...:z][,ifname=name][,script=file][,downscript=dfile]:

通過物理的TAP網絡接口連接至vlan n; script=file:啟動虛擬機時要執行的腳本,默認為/etc/qemu-ifup downscript=dfile:關閉虛擬機時要執行的腳本,/etc/qemu-ifdown ifname=NAME:自定義接口名稱;
View Code 

-daemonize:以守護進程運行;

/etc/qemu-ifup

#!/bin/bash
#
bridge=br0
if [ -n "$1" ];then
ip link set $1 up
sleep 1
brctl addif $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: no interface specified."
exit 1
fi	

示例1:
qemu-kvm -name c2 -smp 2,maxcpus=4,sockets=2,cores=2 -m 128 -drive file=/images/kvm/cos-i386.qcow2,if=virtio -vnc :1 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:11 -net tap,script=/etc/qemu-ifup  (注意:最好用if=virtio 半虛擬化,性能比全虛擬化高;if后不能有空格!)
示例2:
qemu-kvm -name winxp -smp 1,maxcpus=2,sockets=1,cores=2 -m 1024 -drive file=/data/vms/winxp.qcow2,media=disk,cache=writeback,format=qcow2 file=/tmp/winxp.iso,media=cdrom -boot order=dc,once=d -vnc :1 -net nic,model=rtl8139,macaddr=52:54:00:00:aa:11 -net tap,ifname=tap1,script=/etc/qemu-ifup -daemonize
dnsmasq:(DNS轉發器和DHCP服務器)
--listen-address=192.168.64.2,127.0.0.1
--dhcp-range=192.168.64.10,192.168.64.254,48h
--dhcp-option=3,192.168.0.1
但通常用虛擬機時不會用繁瑣且易出錯的命令行形式一個個生成,而是virsh,默認生成模版文件在/etc/libvirt/qemu/目錄下
virsh命令:虛擬機的生成需要依賴於預定義的xml格式的配置文件;其生成工具有兩個:virt-manager, virt-install;
virsh [OPTION]... COMMAND [ARG]..
子命令的分類:

  • Domain Management (help keyword 'domain')
  • Domain Monitoring (help keyword 'monitor')
  • Host and Hypervisor (help keyword 'host')
  • Interface (help keyword 'interface')
  • Networking (help keyword 'network')
  • Network Filter (help keyword 'filter')
  • Snapshot (help keyword 'snapshot')
  • Storage Pool (help keyword 'pool')
  • Storage Volume (help keyword 'volume')

Domain Management (help keyword 'domain')

  • create:從xml格式的配置文件創建並啟動虛擬機;
  • define:從xml格式的配置文件創建虛擬機;
  • destroy:強行關機;
  • shutdown:關機;
  • reboot:重啟;
  • undefine:刪除虛擬機;
  • suspend/resume:暫停於內存中,或繼續運行暫停狀態的虛擬機;
  • save/restore:保存虛擬機的當前狀態至文件中,或從指定文件恢復虛擬機;
  • console:連接至指定domain的控制台;
  • attach-disk/detach-disk:磁盤設備的熱插拔;
  • attach-interface/detach-interface:網絡接口設備的熱插拔;

type:bridge
source:BRIDGE_NAME
注意 :無須事先創建網絡接口設備;
Domain Monitoring (help keyword 'monitor')

  • domiflist
  • domblklist
  • ...

圖形管理工具:

  • kimchi:基於H5研發web GUI; virt-king;
  • OpenStack: IaaS
  • oVirt:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM