- 虚拟化技术概览
- KVM简介
- KVM的管理操作
一、虚拟化技术概览
(一)虚拟化技术类型:
- 主机虚拟化:xen, kvm, virtualbox
- 容器(用户空间隔离): lxc (LinuX Container), openvz, runC
- 系统库虚拟化:wine
- 应用程序级虚拟化:jvm, pvm
(二)主机虚拟化
- 主机虚拟化:虚拟机(VM)和硬件之间加了一个Hypervisor软件层,或者叫做虚拟机管理程序(VMM)
(1)CPU虚拟化需要解决的问题
-
CPU的特权机制:ring机制
- 分为:ring0, ring1, ring2, ring3;实际只使用了ring0, ring3
- ring0仅允许内核执行特权指令,ring3允许执行普通指令
- 应用程序的普通指令运行在ring3上
- 当应用程序需要执行特权指令时,应用程序调用系统调用,从用户态转换至内核态,由内核执行特权指令,并将结果返回至应用程序,然后恢复至用户态
CPU的模拟:emulation, ring0与ring3都虚拟化,故虚拟机的arch与物理平台的arch可以不相同,如qemu
-
CPU的虚拟:virtualization,ring0虚拟化,分为完全虚拟化和半虚拟化
完全虚拟化(full-virt),GuestOS不知道自身运行于虚拟化环境中
(a) 需要解决的问题:GuestOS发出的特权指令会影响HostOS的运行,这是不可接受
的
(b) 解决方法:
BT:二进制转换 (软件),通过hypervisor翻译Guest的特权指令,效率较低
HVM:硬件辅助的虚拟化(硬件),硬件能够区分Guest和Host的特权指令,将两者隔离,效率较高半(准)虚拟化 (para-virt)
GuestOS明确知道自己运行在虚拟化环境中,故不需hypervisor翻译特权指令,性能比BT模式下的完全虚拟化高,但是需要对GuestOS的内核做相应的修改
(2)内存虚拟化需要解决的问题:
进程使用内存原理简介:
线性地址:用户进程拥有自己独立的地址空间,但这个地址空间是逻辑上的,故不同用户进程的地址空间位置可能有重叠
物理地址:真实内存空间的地址
MMU:Memory Management Unit,内存管理单元,负责将线性地址映射为物理地址-
MMU虚拟:
- 软件方式:
(a) 在hypervisor层对MMU虚拟,负责GuestOS环境的线性地址映射为物理地址
GVA--virtual MMU-->GPA--MMU-->HPA
(G: Guest, H: Host, V: Virtual, P: Physical, A: Address)
(b) shadow page tables:影子页表,直接实现从GVA至HPA的映射,Hypervisor将影子页表载入到物理上的内存管理单元(MMU)中进行地址翻译 - 硬件方式:
Intel: EPT, Extended Page Table
AMD: NPT, Nested Page Table
- 软件方式:
-
TLB virtualization:
- TLB:Translation Lookaside Buffer,转换检测缓冲区,是一个内存管理单元,用于改进虚拟地址到物理地址转换速度的缓存
- 虚拟化环境下一台虚拟主机可能误命中另一台主机的TLB缓存
- tagged TLB:在内存地址切换时知道TLB与虚拟机的对应关系,提升虚拟机与物理机之间的数据传送及翻译转换效率
(3)IO虚拟化需要解决的问题:
IO虚拟化的三种方式:
Emulation:模拟/完全虚拟化
Para-virtualization:半虚拟化
IO-through:IO透传,某个GuestOS能够独占使用设备磁盘虚拟化:例如,GuestOS的磁盘被虚拟为HostOS上的文件
网络虚拟化:虚拟主机网卡连接至虚拟交换机
仅主机:物理网卡的虚拟网卡连到虚拟交换机
桥接:物理网卡直接连到虚拟交换机,物理网卡需要开启混杂模式
NAT:物理网卡的虚拟网卡通过路由连接到虚拟交换机,并进行源地址转换
(4)主机虚拟化的类型:
TYPE-I:
架构特点:在硬件级别直接运行hypervisor
解决方案:xen, vmware ESX/ESXITYPE-II:
架构特点:在硬件级别运行一个OS (Host OS),而此OS上运行一个VMM
解决方案:vmware workstation, virtualbox, kvm
(三)多主机虚拟化
- IaaS:基础设施即服务
- PaaS:平台即服务
- SaaS:软件即服务
二、KVM简介
(一)KVM(Kernel-based Virtual Machine)的组件:
- kvm.ko:模块,安装本模块后的内核即成为kvm hypervisor
- qemu-kvm:用户空间的工具程序,为kvm hypervisor模拟IO设备
- libvirt:统一管理各虚拟化平台的管理接口
(二)KVM管理架构:C/S架构
- Client:
libvirt-client
virt-manager (GUI), virsh(CLI) - Daemon:
libvirt-daemon
(三)快速安装使用KVM:
- 判断CPU是否支持硬件虚拟化:
当今CPU都支持硬件虚拟化,主机在虚拟机环境中在CPU的设置中开启“虚拟化Intel VT-x/EPT 或 AMD-V/RVI”,才能在虚拟机中支持硬件虚拟化grep -i -E '(vmx|svm|lm)' /proc/cpuinfo vmx:Intel VT-x svm:AMD AMD-v
- 安装kvm组件
yum install libvirt-daemon-kvm qemu-kvm virt-manager
- 加载kvm.ko模块
modprobe kvm
- 启动libvirtd服务
systemctl start libvirtd.service
- 打开kvm的GUI管理接口
virt-manager
(四)KVM的组件:分为kvm.ko模块和qemu-kvm进程
(1)kvm.ko模块:
- 通过模拟为一个字符型设备dev/kvm负责和外界交互,工作为hypervisor
- 在用户空间可通过系统调用ioctl()与内核中的kvm模块交互,从而完成虚拟机的创建、启动、停止、删除等各种管理功能
(2)qemu-kvm进程:
- 工作于用户空间,用于实现IO设备模拟
- 用于实现一个虚拟机实例
- 运行中的一个kvm虚拟机就是一个qemu-kvm进程,运行qemu-kvm程序并传递给它合适的选项及参数即能完成虚拟机启动,终止此进程即能关闭虚拟机
(3)KVM模块load进内存之后,系统的运行模式:
- 内核模式:GuestOS执行IO类的操作时,或其它的特殊指令操作时的模式;它也被称为“Guest-Kernel”模式
- 用户模式:Host OS的用户空间,用于代为GuestOS发出IO请求
- 来宾模式:GuestOS的用户模式;所有的非IO类请求
三、KVM的管理操作
(一)使用virt-manager管理KVM
实验1:在虚拟机中安装kvm,使用virt-manager配置为通过PXE方式安装系统
环境准备:
1、在虚拟机环境中在CPU的设置中开启“虚拟化Intel VT-x/EPT 或 AMD-V/RVI”,才能在虚拟机中支持硬件虚拟化
2、使用XShell登录系统时,需要安装XManager并配置X协议转发,才能使用ssh -X选项登陆后,通过X协议在本地打开远程图形界面
-
步骤1:加载kvm模块
modprobe kvm lsmod | grep kvm
-
步骤2:CentOS 7创建物理桥,使用内核自带的桥接模块实现
cd /etc/sysconfig/network-scripts/ cp ifcfg-ens33 ifcfg-br0 vim ifcfg-ens33 // 物理网卡端指明桥接的名称 TYPE=Ethernet BOOTPROTO=static DEVICE=ens33 ONBOOT=yes BRIDGE=br0 vim ifcfg-br0 // 桥接网卡端指明IP地址等信息 TYPE=Bridge BOOTPROTO=static IPADDR=172.18.58.230 PREFIX=16 DEVICE=br0 ONBOOT=yes systemctl restart network.service brctl show
桥接网卡br0是刚刚创建的物理桥,而桥接网卡virbr0是装载kvm.ko模块后自动生成的NAT连接,若使用PXE模式安装系统则必须配置物理桥
-
步骤3:安装libvirt, virt-manager, qemu-kvm,并启动libvirtd服务
yum install qemu-kvm libvirt-daemon-kvm virt-manager systemctl start libvirtd.service // 在另一个终端ssh远程登录kvm主机,注意使用'-X'选项允许X协议转发 ssh -X [email protected] virt-manager &
出现如下窗口则成功启动virt-manager
-
步骤4:使用virt-manager创建虚拟机,并安装操作系统
- 创建虚拟机,选择PXE方式安装操作系统
- 选择安装的操作系统
- 配置内存和CPU设置
- 创建虚拟磁盘
- 给虚拟机命名,注意必须选中"Customize configuration before install "并选择网卡为建立的物理桥接网卡
- 在安装前配置中,在"Boot Options"中开启启动菜单,选中磁盘和网卡
- 同样在安装前配置中,在"Display VNC"中选择"VNC server",并且keymap选择"en-us",从而保证键盘使用正常
- 启动虚拟机,成功实现通过PXE方式安装
(二)使用qemu-kvm管理KVM
(1)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表示第一个光驱设备
e.g. -boot order=dc,once=d:启动顺序先光驱后硬盘,只在第一次启动时通过光驱 - -m megs:虚拟机的内存大小
- -name NAME:当前虚拟机的名称,要惟一
-
块设备相关的选项:
- -hda/-hdb file:指明IDE总线类型的磁盘映射文件路径,第0和第1个
- -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:磁盘映像文件的格式
-
显示选项:
-DISPLAY TYPE:显示的类型,sdl, curses, none和vnc- -nographic:不使用图形接口
- -vga [std|cirrus|vmware|qxl|xenfb|none]:模拟出的显卡的型号
- -vnc display[,option[,option[,...]]]]:启动一个vnc server来显示虚拟机接口
让qemu进程监听一个vnc接口
HOST:N,表示在HOST主机的第N个桌面号输出vnc,端口号:5900+N - -monitor stdio:在标准输出上显示monitor界面;
-
网络选项:
- -net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
为虚拟机创建一个网络接口,并将其添加至指定的vlan
model=type:指明模拟出的网卡的型号,如e1000,pcnet,virtio
macaddr=mac:指明mac地址,要求为52:54:00:XX:XX:XX,前6位固定,后六位自定义 - -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:自定义接口名称
- -net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
其它选项:
-daemonize:以守护进程运行-
注意:
- 当以前台模式运行时,
Ctrl-a, c:在console和monitor之间切换
Ctrl-a, h:查询帮助 - 建议Network IO, Disk IO使用半虚拟化技术,即设备类型为virtio,性能会有显著提升
- 当以前台模式运行时,
(2)qemu-img建立虚拟磁盘实际应用
-
实验2:使用qemu-img建立虚拟磁盘,使用virt-manager将系统安装至虚拟磁盘
- 步骤1:使用qemu-img建立虚拟磁盘
mkdir /vm/images -pv qemu-img create -f qcow2 -o size=120G,preallocation=metadata /vm/images/centos_test.qcow2
- 步骤2:启动virt-manager
virt-manager &
大部分步骤与实验1相同,只需在创建磁盘时手动选择磁盘位置即可
在系统安装前配置页面中也可以看到虚拟磁盘路径
(3)qemu-kvm建立虚拟机实际应用
-
实验3-1:使用qemu-kvm导入系统镜像,后台运行虚拟机,打开监听端口,通过VNC协议显示控制台
- 步骤1:使用qemu-kvm导入镜像并后台开启虚拟机
// 一般不使用qemu-kvm安装,故需要手动在/usr/bin下建立软链接至qemu-kvm的可执行程序 ln -s /usr/libexec/qemu-kvm /usr/bin // 导入镜像 qemu-kvm -name cirros -m 1024m -smp 2 -drive file=/vm/images/cirros-no_cloud-i386.img,if=virtio,media=disk -vnc :0 --daemonize ss -ntlp
可以看到qemu-kvm开启了5900端口
- 步骤2:安装并启动vnc
yum install tigervnc vncviewer :0
- 步骤3:此时只能通过kill关闭虚拟机进程
kill -9 9193
-
实验3-2:使用qemu-kvm导入系统镜像,并前台运行虚拟机
- 步骤1:使用qemu-kvm导入镜像并前台开启虚拟机
ln -s /usr/libexec/qemu-kvm /usr/bin qemu-kvm -name cirros -m 1024m -smp 2 -drive file=/vm/images/cirros-no_cloud-i386.img,if=virtio,media=disk -nographic ss -ntlp
- 步骤2:切换至qemu控制台,关闭进程
Ctrl+a h // 查询帮助 Ctrl+a c // 在console和monitor之间切换 quit // 关闭本进程
(4)qemu-kvm建立虚拟机并配置虚拟机网络
-
实验4:qume-kvm的网络配置
- 步骤1:在宿主机上配置网桥vnet0
brctl addbr vnet0 brctl show ip link set vnet0 up
- 步骤2:在宿主机上启动虚拟机,并配置网络
// 编辑qemu-kvm的网卡启动脚本 vim /etc/qemu-ifup #!/bin/bash # bridge=vnet0 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 2 fi chmod +x /etc/qemu-ifup qemu-kvm -name cirros1 -m 64m -smp 2 -drive file=/vm/images/cirros1.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:00:00:01 -net tap,script=/etc/qemu-ifup -vnc :0 --daemonize qemu-kvm -name cirros2 -m 64m -smp 2 -drive file=/vm/images/cirros2.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:00:00:02 -net tap,script=/etc/qemu-ifup -vnc :1 --daemonize
- 步骤3:通过vnc协议打开虚拟机cirros1和cirros2的控制台
vncviewer :0 vncviewer :1
- 步骤4:配置仅主机模式的虚拟主机网卡模式
只需把虚拟主机网卡和网桥vnet0配置在一个ip网段中即可
sudo ifconfig eth0 192.168.10.1 up // cirros1虚拟机上配置网卡 sudo ifconfig eth0 192.168.10.2 up // cirros2虚拟机上配置网卡 ifconfig vnet0 192.168.10.3 up // 宿主机上配置网桥
此时两台虚拟主机可以互相ping通
虚拟主机和网桥之间也可以互相ping通
- 步骤5:配置NAT模式的虚拟主机网卡模式
sudo route add default gw 192.168.10.3 // 虚拟机上建立默认网关 iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 192.168.136.230 // 宿主机上建立端口转发逻辑 sysctl -w net.ipv4.ip_forward=1 // 宿主机上设置允许网卡进行端口转发
配置网关后,虚拟机可以ping通宿主机的ip,但是无法ping通宿主机网段的其他主机
配置NAT后,可以ping通宿主机网段的其他主机
(三)使用virtsh管理KVM
(1)建立虚拟机
虚拟机的生成需要依赖于预定义的xml格式的配置文件,默认文件位置/etc/libvirt/qemu/
其生成工具有两个:virt-manager, virt-install
(2)virsh命令
语法: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+start
define:从xml格式的配置文件创建虚拟机启动:
start:启动
reboot:重启停止:
destroy:强行关机
shutdown:关机删除:undefine
暂停:
suspend/resume:暂停于内存中,或继续运行暂停状态的虚拟机
save/restore:保存虚拟机的当前状态至文件中,或从指定文件恢复虚拟机连接至指定domain的控制台:console
-
域的设备资源管理:
cpu-stats, vcpuinfo, vcpucount, setvcpus, vcpupin, setmaxmem, setmem磁盘设备的热插拔:attach-disk/detach-disk
网络接口设备的热插拔:attach-interface/detach-interface
Domain Monitoring (help keyword 'monitor')
domiflist:网络接口状况
domblklist:块设备状况-
实验5:virsh管理kvm虚拟机
- 虚拟机的创建、删除、暂停、恢复
// 有一台配置好的kvm虚拟机,复制其xml配置文件并作修改 virsh dumpxml cirros1 // 查看正在运行虚拟机的xml配置文件 cd /etc/libvirt/qemu cp cirros1.xml cirros2.xml vim cirros2.xml
cirros2 // 修改虚拟主机名4b78e9d4-46b6-460c-a7da-cc3c1b8e5b77 // 修改UUID// 修改导入的镜像 // 修改MAC地址 // 按照xml文件建立并开启虚拟机,按Ctrl+]退出当前虚拟机终端 virsh create /etc/libvirt/qemu/cirros2.xml --console // 查看当前正在运行的虚拟机 virsh list // 进入虚拟机cirros2的终端 virsh console cirros2 // 虚拟机暂存内存 virsh suspend cirros2 virsh list --all // 查看处于活动和非活动状态的所有虚拟主机 // 虚拟机从内存恢复 virsh resume cirros2 virsh list // 保存当前虚拟机状态至文件 virsh save cirros2 /tmp/cirros2 --running virsh list --all // 从文件恢复虚拟机 virsh restore /tmp/cirros2 virsh list --all // 关闭虚拟机 virsh destroy cirros2 --graceful // 删除虚拟机 virsh undefine cirros2 按照配置文件成功启动虚拟机,可以看到MAC地址按照配置文件要求设置
虚拟机暂存内存和从内存中恢复
虚拟机状态存储至磁盘和从磁盘恢复
关闭虚拟机
- 虚拟机的设备管理
// 查看虚拟机的相关硬件统计信息 virsh cpu-stats cirros1 virsh vcpuinfo cirros1 virsh vcpucount cirros1 // 给虚拟机热加载磁盘 qemu-img create -f qcow2 -o size=20G,preallocation=metadata /vm/images/test_disk.qcow2 virsh attach-disk cirros1 /vm/images/test_disk.qcow2 vdb virsh domblklist cirros1 // 查看虚拟机的块设备情况 // 给虚拟机热卸载磁盘 virsh detach-disk cirros1 vdb virsh domblklist cirros1 // 给虚拟机热添加网卡 brctl show virsh attach-interface cirros1 bridge br0 virsh domiflist cirros1 // 查看虚拟机的网卡设备情况 // 给虚拟机热卸载网卡 virsh detach-interface cirros1 bridge --mac 52:54:00:8c:b5:e1 virsh domiflist cirros1
分别在宿主机和虚拟机上都查看到了磁盘vdb的添加和删除
宿主机上虚拟机上
分别在宿主机和虚拟机上都查看到了网卡eth1的添加和删除
宿主机上虚拟机上