文章目录
KVM基础
概述
KVM(Kernel-based Virtual Machine)是一种开源的虚拟化技术,它将Linux内核转变为一个裸机虚拟机监控程序(Hypervisor)。KVM是Linux内核的一个模块,自2007年以来就成为Linux主线内核的一部分。通过KVM,用户可以在单个物理机器上运行多个隔离的操作系统实例,每个实例被称为虚拟机(VM)。
KVM架构
cpu虚拟化:硬件辅助全虚拟化VT-X/AMD-V
内存虚拟化:MMU虚拟化(内存硬件虚拟化)EPT/RVI。影子页表
I/O虚拟化:硬件辅助虚拟化hypercall virtio。passth
存储虚拟化:文件系统+文件映射/分区映射/裸设备映射
网络虚拟化:LBR/OVS。虚拟机交换机linux_bridge
KVM管理工具
Libvirtd:前端守护进程管理工具
图形化管理工具
virt-manage 虚拟机管理
virt-viewer 虚拟机敞口查看器
命令行管理工具
virsh 安装、查看、修改虚拟机使用
virt-install 安装虚拟机使用
qemu-img 镜像管理
qemu-kvm 安装虚拟机啊
命令行工具使用
virt-install安装虚拟机
#常用参数
--cdrom <路径> 指定镜像安装路径
--os-type=linux 指定操作系统类型
--os-variant=Fedora18 指定操作系统发行版本
--vcpus=1 指定cpu
--ram=128 指定内存
qemu-image create -f qcow2 <路径>vm03.qcow2 5G 创建磁盘文件
--disk=<文件路径> 指定磁盘路径
--disk=<文件路径>,size=6 创建磁盘文件并指定大小,
--name=vm03 设置虚拟机名称
--network network=default 设置网络
--graphices vnc,listen=0.0.0.0,port=5913 创建vnc
virsh工具使用
virsh shutdown vm03 关闭虚拟机
virsh destroy vm03 强制断电
virsh undefine vm03 删除虚拟机
virsh list 虚拟机列表查看
virsh start <vmname> 开启虚拟机
virsh reboot <vm-name> 重启虚拟机
virsh reset <vm-name> 强制重启
virsh domuuid <vm-name> 查看虚拟机UUID
virsh suspend uuid 指定UUID暂停虚拟机
virsh resume uuid 恢复虚拟机
qemu-kvm工具使用
qemu-kvm <镜像路径> -m 128 -smg 1 -vnc:1 (5900+1)-name vm02 -drive file=<磁盘文件路径>,if=ide创建的虚拟机不受virsh管理
不会向libvirtd注册
KVM核心功能
虚拟机配置文件
每个虚拟机在创建完成之后需要生成对应的
- 虚拟机配置文件-虚拟机元数据 XML文件格式记录,可以被libvirtd调用,对KVM虚拟机开机时就需要去加载配置文件
a. virt-manage
b. virt-install
c. qemu-kvm 不产生元数据-临时创建一个虚拟机
d. 默认路径/etc/libvirt/etc/libvirt/qemu/vm01.xml -持久化存储配置文件-虚拟机元数据
e. 运行中的配置文件/run/libvirt/etc/libvirt/qemu/vm01.xml - 磁盘文件(文件系统+文件映射)qcow(img)/qcow2
a. qemu-img创建磁盘文件
b. virt-install --disk 指定文件目录创建
c. 默认路径/var/lib/libvirt/images
虚拟机配置文件内容
XML文件格式通过标签指定数值的意义
/etc/libvirt/etc/libvirt/qemu/vm01.xml
#虚拟机域信息,虚拟机元数据最高级别
<domain type='kvm'>
所有信息
</domain>
#名字,UUID
<name>vm01</name>
<uuid>qwefwqwefwwefgfew</uuid>
#内存信息
<memory unit='KiB'>123456</memory>
<currentMemory>12345</currentMemory>
#vCPU核心数
<vcpu placement='static'>1</vcpu>
#操作系统信息
<os>
<type arch="" >hvm</type>
<boot dev='hd'></boot>
</os>
KVM虚拟机CPU与内存配置
CPU三大模式
命令行启动 virt-install
host-passthourgh(主机直通模式)
Libvirt令KVM把宿主机把CPU指令集透传给虚拟机。虚拟机能够最大限度的使用宿主机的指令集,故虚拟机性能最好,但是在热迁移的时候要求目的主机的CPU和原主机的CPU一致
–cpu host-passthourgh
host-model
Libvirt 根据当前宿主机 CPU 指令集从配置文件 /usr/share/libvirt/cpu_map.xml(cpu类型仓库) 选择一种最相配的 CPU 型号。在这种 mode下,虚拟机的指令集往往比宿主机少,性能相对 host-passthrough 要差一点,但是热迁移时,它允许目的节点 CPU 和源节点的存在一定的差异。
Libvirt对CPU提炼出标准的几种类型,在/usr/share/libvirt/cpu_map.xm1中可以查到。
–cpu host
custom
这种模式下虚拟机 CPU 指令集数最少,故性能相对最差,但是它在热迁移时跨不同型号 CPU 的能力最强。此外,custom模式下支持用户添加额外的指令集。
未增加指令集模式
–cpu Westmere-IBRS
增加指令集模式
–cpu broadwell-IBRS,+vme,+ss,+vmx,+ht,+hypersiovr
CPU拓扑配置
启动参数:
–vcpus 4,sockets=4,cores=l,threads=1
默认是4cpu,1core,1thread
配置参数
<cpu mode='host-passthrough' check='none'>
<topology sockets='4'cores='1'threads='1'/>
</cpu>
CPU热插拔
需要预先配置KVM虚拟机最大vCPU参数才能使用
启动参数
–vcpus 2,maxvcpus=4
配置参数
<vcpu placement='static' current="2">4</vcpu>
virsh setvcpus vm01 4 --live
检查配置文件
virsh edit vm01
开机状态只能热插不能拔
CPU嵌套虚拟化
宿主机vmx指令集是intel的硬件辅助虚拟化的功能。
如果需要在虚拟机内部使用虚拟化技术需要开启Nested模块
需要将虚拟化指令集透传给虚拟机,生产环境中嵌套虚拟化会大量浪费时间分片,性能只有宿主机的50%-65%
三种cpu启动模式都能支持嵌套虚拟化。
custom需要手动将vmx加到里面。
lsmod | grep -i kvm
#启用Nested
ehco 'opthions kvm_intel nested=1' >/etc/modprobe.d/kvm_nested.conf
#卸载Nested
modprobe -r kvm_intel
内存热插拔
#启动参数
–memory 512,maxmemory=1024
#配置参数
<memoryunit='KiB'>1048576</memory>
<currentMemoryunit='KiB'>524288</currentMemory>
#热插拔配置-增加到1024M
virsh setmem vm01 1048576 --live
热拔不能超过虚拟机在使用的内存下限。
内存热气球
待更新
KVM虚拟网络设置
虚拟机链接LinuxBridge
默认链接是LinuxBridge
#查看网络
virsh net-list
#编辑网络
virsh net-edit <default>
虚拟机连接OVS
指定virtualport_port=openvswitch
#使用网桥-ovs01
qemu-imgcreate
-fgcow2
/var/lib/libvirt/images/vm01.qcow21G
virt-install
--name=vm01\
--cdrom=/var/lib/1ibvirt/images/TinyCore-11.0.iso\
--os-type=linux\
-os-variant=fedora18\
--cpu host
-vcpus2,maxvcpus=4
--memory 512
--disk=/var/lib/libvirt/images/vm01.qcow2
--networkbridge=ovs01,model=virtic,virtualport_type=openvswitch
绑定Macvtap接口
待更新
绑定TunTap接口
待更新
绑定VLAN接口
待更新