- 原理介绍
- Hypervisor介绍
分类:
类型 I : 裸金属型
直接运行到物理机的Hypervisor上,这种架构搭建的虚拟化环境称为裸机虚拟化环(kvm直接跑在这个硬件上,替代了原来操作系统的功能)
类型 II : 宿主型
即需要运行在具有虚拟化功能的操作系统上的Hypervisor,构建的是主机虚拟化环境
硬件辅助的全虚拟化 HVM(Hardware Virtual Machine)<----KVM(kernel-based Virtual Machine)集成在内核中
RedHat创建虚拟机数量限制:https://access.redhat.com/articles/rhel-kvm-limits
KVM 体系结构
KVM: 初始化CPU硬件,打开虚拟机模式,负责CPU,内存,中断控制器,时钟. 由内核模块kvm_xxx.ko 实现,工作于hypervisor,设备/dev/kvm,是一个字符设备,在用户空间可通过ioctl()系统调用来 完成VM创建、启动,为VM分配内存、读写VCPU的寄存器、向VCPU注入中断、时钟等管理功能
QEMU进程:工作于用户空间,主要用于实现模拟IO设备,如显卡,网卡,硬盘等, qemu-kvm进 程:工作于用户空间,用于实现一个虚拟机实例
Libvirt:提供统一API,守护进程libvirtd和相关工具,如:virsh,virt-manager等
- 实践
查看虚拟机是否支持kvm
lscpu |grep -Em 1 'vmx|svm' ##vmx对应intel的cpu svm对应AMD的cpu
如果没有需要开启虚拟化引擎
[root@localhost ~]# lsmod |grep kvm ##发现启用了kvm
kvm_intel 385024 2
kvm 1105920 1 kvm_intel
irqbypass 16384 5 kvm
安装KVM
Centos安装:yum install -y qemu-kvm libvirt virt-manager virt-install virt-viewer
systemctl enable --now libvirtd 起服务,会出现virbr0的网桥
virt-manager 图形化工具,安装虚拟机,如果虚拟机无法键盘输入,需要点击虚拟机灯泡,在Display VNC一栏当中选择VNC server,在Boot Options中把光驱勾上,
实现web界面的管理虚拟机:yum install -y cockpit cockpit-machine
systemctl start cockpit ##启用9090端口,web访问即可管理虚拟机
新建虚拟机后
宿主机可以ping通虚拟机,并且可以连接,如果由于部分原因导致不能在虚拟机界面登入,可以使用arp -a 来探测mac所对应的ip地址,从而进行连接,ifconfig查看发现有virbr0网桥,以及vnet1,vnet2等虚拟机的网卡,安装bridge-utils ,执行brctl show 可以看到虚拟网卡桥接到网桥virbr0上了。
宿主机在目录/var/lib/libvirt/images 下看到的如centos8.qcow2文件大小可能会直接有所分配的大小,该文件为虚拟机的文件。该虚拟机的配置文件在/etc/libvirt/qemu/centos8.xml文件下,存放有路径信息,mac,以及ip网卡等信息
Ubuntu安装:
apt install qemu-kvm virt-manager libvirt-daemon-system
ubuntu特有的指令:kvm-ok #验证是否支持kvm,只有Ubuntu支持,CentOS 不支持
迁移kvm
步骤(建议迁移与被迁移的主机使用相同的系统版本):
- 拷贝虚拟机文件(.qcow2)与虚拟机的配置文件(.xml),并修改:
cp /var/lib/libvirt/images/centos8.qcow2 /var/lib/libvirt/images/rename.qcow2
chown qemu.qemu rename.qcow2 ##赋权限
cp /etc/libvirt/qemu/centos8.xml /etc/libvirt/qemu/rename.xml
vim rename.xml ##拷贝并修改配置文件避免冲突
如:<name>rename</name>
<uuid>d23b626a-db38-499d-bb1e-dc574cc3a704</uuid>
<source file='/var/lib/libvirt/images/rename.qcow2'/>
<mac address='52:54:00:bb:9a:67'/>
- 重启libvirtd,再次打开virt-manager发现出现了新的虚拟机
网络规则
宿主机与虚拟机可以互相Ping通
宿主机执行 iptables -vnL -t nat 发现虚拟机通过snat出去访问外网,伪装成宿主机的ip
但是外机不能ping通虚拟机,如果要Ping通,需要外机做以下操作:
- 添加虚拟机网段的路由,网关设置成宿主机的ip
[root@Rocky9 ~]# route add -net 192.168.122.0/24 gw 10.0.0.233 dev eth0
- 宿主机iptables -vnL发现规则有添加,暴力点全清可以正常通讯,如果想恢复规则,重启libvirtd即可
[root@localhost images]# iptables -F
使用 virt-install 创建虚拟机
如果需要批量进行虚拟机的创建管理,命令行工具virt-install 更加方便和适合,而且创建的后的虚拟机不是一下子占用所有的空间。创建出来的磁盘文件很小,想VMWARE一样会模拟出很大的空间,创建时注意,/var/lib/libvirt/images/下的qcow2文件不能重名会覆盖。virt-manager的图形化界面,右击虚拟机也可以delete删除虚拟机
创建虚拟机:
virt-install --help #查看帮助信息
3.2.2.1利用qemu-img命令创建虚拟磁盘:
qemu-img create -f qcow2 /var/lib/libvirt/images/centos7.qcow2 20G ##创建qcow2格式,规定大小为最大20g的磁盘文件
du -sh /var/lib/libvirt/images/centos7.qcow2 ##实际大小很小
3.2.2.2 利用 osinfo-query命令查看支持的OS版本
osinfo-query os|grep centos
3.2.2.3 创建虚拟机使用光盘启动并手动安装
利用virt-install 创建虚拟机的硬件环境:
virt-install --virt-type kvm --name centos7 --ram 1024 --vcpus 2 --cdrom=/data/isos/CentOS-7.9-2009.iso --disk path=/var/lib/libvirt/images/centos7.qcow2 --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole --os-variant=centos7.0
##创建默认NAT模式的虚拟机,并不自动打开virt-viewer连接console,需要手动打开virt-manager 连 接,并手动安装系统,--os-variant用的是osinfo-query os 所查看到的kvm所支持的os类型
virt-manager ##再启动图形化进行安装即可
此时ps -ef |grep qemu-kvm,每有一个虚拟机,就对应一个qemu-kvm进程
基于现有虚拟机磁盘为模版创建新的虚拟机(克隆)
3.3.1 利用virt-manager实现
在图形化界面,右击关机后的虚拟机,选择clone克隆,勾选默认即可,此时在/etc/libvirt/qemu与 /var/lib/libvirt/images/分别生成了配置文件与磁盘文件,linux虚拟机克隆后不会产生什么冲突的问题,因为IP是DHCP自动分配的,mac地址一些的都会重新生成
3.3.2 利用virt-install实现(命令行)
cd /var/lib/libvirt/images/
cp -a centos8.qcow2 centos8-2c.qcow2
virt-install --virt-type kvm --name centos8-2c --ram 1024 --vcpus 1 --disk bus=virtio,path=/var/lib/libvirt/images/centos8-2c.qcow2 --network network=default,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole --autostart --boot hd
## --boot hd表示从硬盘上启动,与创建的虚拟机比,克隆的格式有所不同
(tips:加速ssh登录vim /etc/ssh/sshd_config---->UseDNS no GSSAPIAuthentication no 修改之后重启sshd即可)
- 管理虚拟机
半虚拟化驱动virtio
为了提高内存、硬盘、网络的性能,需要支持半虚拟化,virtio 是一种 I/O 半虚拟化解决方案,是一套通用 I/O 设备虚拟化的程序,是对半虚拟化 Hypervisor 中的一组通用 I/O 设备的抽象,提供了一套上层应用与各 Hypervisor 虚拟化设备(KVM,Xen, VMware等)之间的通信框架和编程接口,减少跨平台所带来的兼容性问题,大大提高驱动程序开发效率,Windows 系统需要单独安装virtio驱动,Linux系统自带y驱动。
linux:
lsmod |grep virtio ##linux自带virtio的驱动,通过半虚拟化,性能更快些
建议硬盘与NIC网卡都选virtio
测试:
yum install -y hdparm
dd | hdparm -t /dev/vda1
/dev/vda1:
Timing buffered disk reads: 1024 MB in 1.12 seconds = 911.85 MB/sec
windows:
qemu-img create -f qcow2 /var/lib/libvirt/images/win2016.qcow2 100G ##创建磁盘文件
osinfo-query os |grep win ##找到需要的windows版本
virt-install --virt-type kvm --name Win2016 --memory 2048 --vcpus=2 --os-variant=win2k16 --cdrom=/data/isos/cn_windows_server_2016_x64_dvd_9718765.iso --disk path=/var/lib/libvirt/images/win2016.qcow2,format=qcow2,bus=virtio --disk path=/data/isos/virtio-win-0.1.141.iso,device=cdrom --network bridge=virbr0,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole --autostart ##创建好硬件,启动安装,镜像选2008,virtio驱动选择virtio-win-0.1.141.iso:
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/
详细过程看4.1.5.3
windows克隆:
windows需要删除SID--->C:\Windows\System32\Sysprep\sysprep.exe,清理后关机再右击克隆即可
virt=manager远程管理KVM宿主机
在其他机器上,保证先安装了ssh askpass,在进行连接远程管理宿主机上的虚拟机
yum install -y openssh-askpass
打开virt-manager
连接从而实现远程的管理
虚拟机的性能监控
virsh 命令行管理虚拟机
virsh ##交互式执行命令:
非交互式命令:
virsh --help|grep start ##查看帮助
virsh list ##列出正在运行的虚拟机
virsh list --all ##列出所有的虚拟机包含关机的
virsh start Win2016 ##启动虚拟机
virsh destroy 8 ##强制关闭虚拟机,不推荐,后面可以跟domid或虚拟机名称
virsh shutdown centos8/id ##正常关闭
virsh undefine centos8 ##删除配置文件,保留磁盘文件,恢复使用virt-manager的import导入
其他子命令如下:
4.4.1.4 virsh 子命令说明
help #打印基本帮助信息
attach-device #使用XML文件中的设备定义在虚拟机中添加设备
attach-disk #在虚拟机中附加新磁盘设备
attach-interface #在虚拟机中附加新网络接口
create #从 XML 配置文件生成虚拟机并启动新虚拟机
define #为虚拟机输出XML配置文件
destroy #强制虚拟机停止
detach-device #从虚拟机中分离设备,使用同样的XML 描述作为命令
attach-device
detach-disk #从虚拟机中分离磁盘设备
detach-interface #从虚拟机中分离网络接口
domblkstat #显示正在运行的虚拟机的块设备统计
domid #显示虚拟机ID
domifstat #显示正在运行的虚拟机的网络接口统计
dominfo #显示虚拟机信息
domname #显示虚拟机名称
domstate #显示虚以机状态
domuuid #显示虚拟机UUID
dumpxml #输出虚拟机 XML配置文件
list #列出所有虚拟机
migrate #将虚拟机迁移到另一台主机中
nodeinfo #有关管理程序的输出信息
quit #退出这个互动终端
reboot #重新启动虚拟机
restore #恢复以前保存在文件中的虚拟机
resume #恢复暂停的虚拟机
save #将虚拟机当前状态保存到某个文件中
setmaxmem #为管理程序设定内存上限
setmem #为虚拟机设定分配的内存
setvcpus #修改为虚拟机分配的虚拟CPU数目
shutdown #关闭某个虚拟机
start #启动未激活的虚拟机
suspend #暂停虚拟机
undefine #删除与虚拟机关联的所有文件
vepuinfo #显示虚以机的虚拟CPU信息
vcpupin #控制虚拟机的虚拟CPU亲和性
version #显示virsh版本
- 存储管理
注意事项:/var/lib/libvirt/images/这个目录要随时注意空间大小,最好使用逻辑卷挂载
热迁移:开机状态迁移。需要搭建磁盘文件的共享文件系统(NFS)挂载的,迁移内存的数据,对网络带宽要求极高,需要万兆的网卡才能满足。
5.3 虚拟镜像文件格式
raw :默认
优点 : 性能好
缺点 : 空间占用大,功能较少,生产不推荐使用
qcow2:kvm推荐的格式,支持快照
支持zlib的磁盘压缩
支持AES的加密
优点 : 空间节约,功能丰富
缺点 : 性能较差,生产推荐使用
qemu-img --help|grep -i support ##查看支持的格式
Supported formats: blkdebug blklogwrites blkverify compress copy-before-write copy-on-read file ftp ftps gluster host_cdrom host_device http https iscsi iser luks nbd null-aio null-co nvme preallocate qcow2 quorum raw rbd ssh throttle vhdx vmdk vpc
5.4 使用qemu-img管理虚拟磁盘文件
qemu-img --help ##查看帮助信息
qemu-img create /var/lib/libvirt/images/test1.img 1g
qemu-img info test1.img ##查看格式
image: test1.img
file format: raw
virtual size: 1 GiB (1073741824 bytes) ##最大磁盘大小
disk size: 1 MiB ##磁盘占用大小
##默认建的就是row稀疏文件格式
qemu-img create -f qcow2 test2qcow2.img 1g
qemu-img info test2qcow2.img
image: test2qcow2.img
file format: qcow2
virtual size: 1 GiB (1073741824 bytes) ##最大磁盘大小
disk size: 196 KiB ##磁盘占用大
cluster_size: 65536
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: false
refcount bits: 16
corrupt: false
extended l2: false
##指定创建为qcow2的格式
5.4.4 磁盘预分配策略
off
此为缺省策略,即不使用预分配策略,预分配后的虚拟磁盘占用空间很小,不属于稀疏映像类型 生成的磁盘文件占用空间很小
metadata
只预分配元数据(metadata),预分配后的磁盘文件属于稀疏映像类型,相当于vmware中的磁盘置备选项: Thin Provision(精简配置),生成的磁盘文件为稀疏格式,实际占用的空间比off策略稍大一些
falloc (真的会划分这么大)
分配文件的块并标识它们的状态为未初始化,即只分配空间,但不置零. 预分配后的虚拟磁盘属于非稀疏映像类型,相对full模式来说,创建虚拟磁盘的速度要快很多,相当于vmware中的磁盘置备选项: 厚置备延迟置零生成的磁盘文件实际占用的空间和分配的空间相同大小
full (最彻底,划分的最慢,但是性能最好,空间浪费率就高了)
分配所有磁盘空间并置零,预分配后的虚拟磁盘属于非稀疏映像类型,创建最慢,相当于vmware中的磁盘置备选项: 厚置备置零生成的磁盘文件实际占用的空间和分配的空间相同大小
qemu-img create -f qcow2 file.img -o preallocation=(off|metadata|falloc|full) 1g ##设置不同的分配策略
qemu-img info file.img ##对比不同的大小
5.5 磁盘快照管理
cd /var/lib/libvirt/images (注意在虚拟机的关机状态操作,否则会加读锁)
qemu-img snapshot -l centos7.qcow2 ##查看一台虚拟机无快照文件
qemu-img snapshot -c centos7-1snapshot centos7.qcow2 ##创建这台虚拟机的快照
qemu-img snapshot -l centos7.qcow2 ##再次查看一台虚拟机有快照
开虚拟机删根,破坏系统
virsh destory centos7 ##关机
重启失败,关机
qemu-img snapshot -a centos7-1snapshot centos7.qcow2 ##还原快照,恢复
[root@localhost images]# qemu-img snapshot -d centos7-1snapshot centos7.qcow2 ##删除快照
[root@localhost images]# qemu-img snapshot -l centos7.qcow2 ##快照消失
qemu-img 包括以下子命令
check #检查完整性
create #创建镜像
commit #提交更改
compare #比较
(convert #转换
#转化为qcow2格式
[root@centos8 ~]#qemu-img convert -f vmdk -O qcow2 CentOS8.2.vmdk CentOS8.2.qcow2)
info #获得信息
map #映射
snapshot #快照管理
rebase #在已有的镜像的基础上创建新的镜像
resize #调整大小
(#增加10G空间
[root@centos8 ~]#qemu-img resize /var/lib/libvirt/images/centos8.qcow2 +10G )
amend #修订镜像格式选项
- 网络管理
实现部分网桥
1.创建网桥virbr1:
nmcli connection add type bridge ifname virbr1 con-name virbr1
nmcli con s
nmcli connection modify virbr1 ipv4.method manual ipv4.addresses 11.11.11.11/24
nmcli connection up virbr1
(nmcli con add type bridge-slave con-name br0-port0 ifname eth0 master br0
nmcli con add type bridge-slave con-name br0-port1 ifname eth1 master br0
用于实现物理网卡接入)
2.克隆一台虚拟机,搭接在新的virbr1的网桥上:
cp centos7.qcow2 centos7-2.qcow2
virt-install --virt-type kvm --name centos7-2 --ram 2048 --vcpus 2 --disk bus=virtio,path=/var/lib/libvirt/images/centos7-2.qcow2 --network bridge=virbr1,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole --autostart --boot hd ##注意拷贝的机子已经关闭了selinux,--network bridge=virbr1表示搭接到新的网桥上
3.虚拟机上操作centos7这台机子配置网卡网段和virbr1网段一致的ip
4.在宿主机上安装bridge-utils包
brctl show ##看到centos7-2的虚拟网卡搭接到virbir1上了,此时可以ping通这个地址
5.照另一台虚拟添加网卡桥接到virbr1上
nmcli con modify eth1 ipv4.method manual ipv4.address 11.11.11.13/24
nmcli con up eth1
##此时实现两台内部虚拟机通讯
arp -a/brctl show ##可以查看到内容