一、虚拟化
在计算机技术中,虚拟化(Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个计算机配置环境,并重新分割、重新组合,以达到最大化合理利用物理资源的目的。
虚拟化可以提高IT敏捷性、灵活性和可扩展性,同时大幅节约成本,实现更高的工作负载移动性、更高的性能和资源可用性、自动化运维,这些都是虚拟化的优势,虚拟化技术可以使IT部门更轻松地进行管理以及降低拥有成本和运维成本。其他优势包括
- 降低资金成本和运维成本
- 最大限度减少或消除停机
- 提高IT部门的工作效率、效益、敏捷性和响应能力
- 加快应用和资源的调配速度
- 提高业务连续性和灾难恢复能力
虚拟化类型
服务器虚拟化
服务器虚拟化支持将多个操作系统作为高效的虚拟机在单个五路服务器上运行,主要优势包括:
- 提升IT效率
- 降低运维成本
- 更快地部署工作负载
- 提高应用性能
- 提高服务器可用性
- 消除服务器数据剧增情况和复杂性
网络虚拟化
通过软件定义网络,即网络的创建不再依赖于物理设备,如公有云厂商运行用户自己创建新的网络,在kubernetes、OpenStack中都会使用到网络虚拟化
桌面虚拟化
将桌面部署为代管服务使IT组织能够更快地响应不断变化的工作场所需求和新出现的机会。还可以将虚拟化桌面和应用快速、轻松地交付给分支机构、外包和离岸员工以及使用iPad和Android平板电脑的移动员工
应用虚拟化
将软件虚拟化
存储虚拟化
SAN(基于磁盘)/SAN(NFS/Samba)/GlusterFS/ceph等
库虚拟化
在linux上运行windows程序使用wine,在mac系统运行windows程序使用CrossOver等
容器技术
被称为下一代虚拟化技术,典型的就是docker、Linux Container(LXC)、pouch、RKT
虚拟化技术分类
模拟器
在一个host之上通过虚拟化模拟器软件,模拟出一个硬件或者多个硬件环境,每个环境都是一个独立的虚拟机,CPU、IO、内存等都是模拟出来的,可以在宿主机模拟出不同于当前物理机CPU指令集的虚拟机,比如可以在windows模拟出macOS、unix系统,比较出名的模拟器有:pearpc、QEMU、Bochs
全虚拟化 full virtualization /准虚拟化 native virtualization
全虚拟化/准虚拟化不做CPU和内存模拟,只对CPU和内存做相应的分配等操作,全虚拟化需要物理硬件的支持,比如需要CPU必须支持并且打开虚拟化功能,例如Intel的Intel VT-X/EPT,AMD的AMD-V/RVI,以在CPU层面支持虚拟化功能和内存虚拟化技术,因此完全虚拟化也是基于硬件辅助的虚拟化技术
全虚拟化软件(硬件辅助全虚拟化):
VMware workstation #https://www.vmware.com/cn/products/workstation-pro.html
paralles desktop
KVM
Microsoft Hyper-V
VirtualBox
半虚拟化 para virtualization
半虚拟化要求guest OS的内核是知道自己运行在虚拟化环境当中的。因此guest OS的系统架构必须和宿主机的系统架构相同,并且要求对guset OS的内核做相应的修改,因此半虚拟化只支持开源内核的系统,不支持闭源的系统,比较常见的半虚拟化就是早期版本的XEN,但是Xen从其3.0版本开始,可以支持利用硬件虚拟化技术的支持(http://www-archive.xenproject.org/files/xen_3.0_datasheet.pdf),实现了完全虚拟化,可以在其平台上不加修改的直接运行如Linux/Windows的系列的操作系统,使得系统具备了更好的兼容性
二、虚拟化技术之KVM
KVM是Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自linux 2.6.20之后集成在Linux的各个主要发行版本中,KVM目前已成为学术界的主流VMM(virtual machine monitor,虚拟机监视器,也称为hypervisor)之一。
KVM(基于内核的虚拟机)是针对Linux的完全虚拟化解决方案,它在x86硬件上包含虚拟化扩展(Intel VT或AMD-V)。它由提供核心虚拟化基础架构的可加载内核模块kvm.ko和处理器特定模块kvm-intel.ko或kvm-amd.ko组成
KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术),是基于硬件的完全虚拟化,而Xen早期则是基于软件模拟的半虚拟化,新版本则是支持基于硬件支持的完全虚拟化,但Xen本身有自己的进程调度器,存储管理模块等,所以代码较为庞大,广为流传的商业系统虚拟化软件vmware ESXI系列是Full-Virtualization
Guest:客户机系统,包括CPU(vCPU)、内存、驱动(Console、网卡、I/O设备驱动等),被KVM置于一种受限制的CPU模式下运行
KVM:运行在内核空间,提供CPU和内存的虚拟化,以及客户机的I/O拦截,Guest的部分I/O被KVM拦截后,交给QEMU处理
Qemu:纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,我们最熟悉的就是能够模拟一台能够独立运行操作系统的虚拟机,虚拟机认为自己和硬件打交道,但其实是和Qemu模拟出来的硬件打交道,Qemu将这些指令转译给真正的硬件,正因为Qemu是纯软件实现的,所有的指令都要经Qemu过一手,性能非常低,所以在生产环境中,大多数的做法都是配合KVM来完成虚拟化工作,KVM完成复杂及要求比较高的设备虚拟化。
KVM管理工具
libvirt
使用最多的KVM虚拟化管理工具和应用程序接口,即通过libvirt调用KVM创建虚拟机,libvirt是KVM通用的访问API,其不但能管理KVM,还能管理VMware、Xen、Hyper-V、virtualbox等
virsh
一个常用的管理KVM虚拟化的命令行工具,常用于管理运行在单个宿主机上的虚拟机
virt-manager
virt-manager是一个虚拟化管理图形软件,其底层也是调用libvirt API来完成对虚拟机的操作,包括虚拟机的创建、删除、启动、停止以及一些简单的监控功能等
OpenStack
OpenStack是一个开源的虚拟化编排工具,常用于构建大规模的虚拟化环境,用于管理虚拟机的创建、启动、删除等整个生命周期
virt-install命令使用
# virt-install --help
virt-install --name NAME --memory MB STORAGE INSTALL [options]
使用指定安装介质新建虚拟机
通用选项:
--version 查看版本号
--name NAME 新建虚拟机的名称,多个虚拟机的名称必须不一样
--memory 1024 配置虚拟机的内存
--vcpus 2 为虚拟机配置的vcpus数
安装方法选项:
--cdrom ios镜像文件路径
设备选项:
--disk 使用指定的存储 --disk path=/var/lib/libvirt/images/centos7.qcow2
--network 配置虚拟机网络接口 --network=default,--network bridge=mybr0
vnc,listen=0.0.0.0,port=5901,password=test,keymap=ja 配置虚拟机控制程序设备
其它选项:
--autostart 引导主机时自动启动
--noautoconsole 不要自动阐释连接到客户端控制台
虚拟机管理命令virsh
# virsh list #列出当前开机的
# virsh list --incative #列出当前关闭的虚拟机
# virsh list --all #列出所有
# virsh shutdown centos7 #正常关机
# virsh start centos7 #正常开机
# virsh destroy centos7 #强制关机
# virsh undefine win10 #强制删除
# virsh autostart centos7 #设置当前虚拟机开机自启动
三、使用KVM创建虚拟机
kvm需要宿主机CPU必须支持虚拟化功能,因此如果是在vmware workstation上使用虚拟机做宿主机,那么必须要在虚拟机配置界面的处理器选项中开启虚拟化功能。
宿主机环境准备
#验证开启虚拟化
[root@node4 ~]# grep -Em 1 "vmx|svm" /proc/cpuinfo
# Inter: vmx
# Amd: svm
#安装kvm工具包
##CentOS
[root@node4 ~]# yum install -y qemu-kvm qemu-kvm-tools libvirt libvirt-client virt-manager virt-install
[root@node4 ~]# systemctl start --now libvirtd
[root@node4 ~]# ifconfig virbr0 #验证是否生成NAT网卡virbr0
# Ubuntu,https://ubuntu.com/server/docs/virtualization-libvirt
apt install qemu-kvm virt-manager libvirt-daemon-system
# kvm-ok # ubuntu验证是否支持kvm,centos不支持该方式
创建NAT网络虚拟机
默认网络就是nat
[root@node4 ~]# ls -lrt /home/data/isos/centos7.iso ##提前上传安装镜像
-rw-r--r--. 1 qemu qemu 1020264448 Jan 10 18:32 /home/data/isos/centos7.iso
#创建qcow2格式磁盘
[root@node4 ~]# qemu-img create -f qcow2 /home/data/kvm/images/centos7.qcow2 15G
# 查看支持的OS版本
[root@node4 ~]# osinfo-query os | grep centos
#创建默认网络虚拟机
[root@node4 ~]# virt-install --virt-type kvm --name=CentOS7 --os-variant=centos7.0 --accelerate --ram 2048 --vcpus 2 --cdrom=/home/data/isos/centos7.iso --disk path=/home/data/kvm/images/centos.qcow2,size=15,format=qcow2,bus=virtio --network=default --graphics vnc,listen=0.0.0.0 --noautoconsole --autostart
通过virt-manager安装管理虚拟机
如果系统语言是中文virt-manager打开管理界面显示是乱码
解决方法:
[root@node4 ~]# yum install -y dejavu-lgc-sans-fonts && yum groupinstall -y "fonts"
virt-manager提示Gtk-WARNING **: 19:16:15.412: cannot open display:
###安装xorg-x11-font-utils包后可以正常打开
[root@node4 ~]# yum -y install xorg-x11-font-utils
#安装步骤与正常安装一致
[root@node4 ~]# virt-manager
virt-manager管理虚拟机界面
查看虚拟机IP
自动获取到的ip地址是NAT分配的192.168.122.X地址段,此地址可以访问外网但是无法从外网主机访问到此虚拟机上的相关服务
创建bridge网络虚拟机
桥接网络可以让运行在宿主机上的虚拟机使用和宿主机同网段IP,并且可以从外部直接访问到虚拟机,目前企业中大部分场景都使用桥接网络。
创建br0桥接网卡
ubuntu 创建桥接网卡
~# vim /etc/netplan/01-netcfg.yaml
# This is the network config written by 'subiquity'
network:
renderer: networkd
ethernets:
eth0:
dhcp4: no
dhcp6: no
bridges:
br0:
dhcp4: no
dhcp6: no
addresses: [172.20.22.26/16]
gateway4: 172.20.22.254
interfaces:
- eth0
version: 2
~# netplan apply
~# ifconfig
centos创建桥接网卡
# cd /etc/sysconfig/network-scripts
# vim ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
IPADDR=172.20.22.26
NETMASK=255.255.0.0
GATEWAY=172.20.22.254
# vim ifcfg-em1
TYPE=Ethernet
PROXY_METHOD=none
BOOTPROTO=static
NAME=em1
DEVICE=em1
ONBOOT=yes
BRIDGE=br0
# systemctl restart network
# ifconfig
创建虚拟机
#创建系统磁盘
# qemu-img create -f qcow2 /home/data/kvm/images/centos7-bridge.qcow2 10G
Formatting '/home/data/kvm/images/centos7-bridge.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off
# ls -lrt /home/data/kvm/images/centos7-bridge.qcow2
-rw-r--r--. 1 root root 197120 Jan 12 14:45 /home/data/kvm/images/centos7-bridge.qcow2
#创建基于桥接网络的虚拟机
# virt-install --virt-type=kvm --name=centos7-bridge --os-variant=centos7.0 --accelerate --ram 2048 --vcpus 2 --cdrom=/home/data/isos/centos7.iso --disk path=/home/data/kvm/images/centos7-bridge.qcow2,format=qcow2,bus=virtio --network bridge=br0,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole --autostart
#通过virt-manager安装管理虚拟机
# virt-manager
#创建虚拟机自动生成对应的xml文件目录,虚拟机删除之后xml文件也会自动删除
# ls -lrt /etc/libvirt/qemu
-rw-------. 1 root root 4237 Jan 11 11:26 CentOS7.xml
-rw-------. 1 root root 4253 Jan 12 17:11 centos7-bridge.xml
验证虚拟机桥接网络通信
桥接网络的虚拟机需要手动设置虚拟机网卡的IP,网卡配置文件与物理机的相同也是在/etc/sysconfig/network-scripts目录中对应的ifcfg-eth0文件
创建windows10虚拟机
virtio是一种I/O半虚拟化解决方案,是一套通用I/O设备虚拟化的程序,是对半虚拟化Hypervisor中的一组通用I/O设备的抽象,提供了一套上层应用与各Hypervisor虚拟化设备(KVM,Xen,VMware等)之间的通信框架和编程接口,减少跨平台所带来的兼容性问题,大大提高驱动程序开发效率,windows系统需要单独安装virtio驱动,linux系统自带virtio驱动
windows虚拟机virtio驱动下载地址Index of /groups/virt/virtio-win/direct-downloads
##把win10的iso镜像问件以及virtio的驱动文件上传至home/data/isos目录下
# qemu-img create -f qcow2 /home/data/kvm/images/win10.qcow2 100G
Formatting '/home/data/kvm/images/win10.qcow2', fmt=qcow2 size=107374182400 encryption=off cluster_size=65536 lazy_refcounts=off
# virt-install --virt-type kvm --name win10 --os-variant=windows --accelerate --ram 2048 --vcpus 2 --cdrom=/home/data/isos/windows10.iso --disk path=/home/data/kvm/images/win10.qcow2 --disk path=/home/data/isos/virtio-win_amd64.vfd,device=floppy --network bridge=br0,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole --autostart
Starting install...
Domain installation still in progress. You can reconnect to
the console to complete the installation process.
接下来的安装步骤跟物理机安装一致,具体安装过程略
四、快速创建虚拟机
快速创建虚拟机的方法:
- 通过virt-manager直接clone
- 复制虚拟机磁盘,通过命令行创建虚拟机
- 复制虚拟机磁盘,通过virt-manager导入
通过virt-manager直接clone
打开virt-manager管理界面,右键点击clone
修改虚拟机名称,点击clone
clone完成后点击开机
修改对应的IP地址,重启网络测试
复制虚拟机磁盘,通过命令行创建虚拟机
虚拟机不要开始安装过程,即虚拟机启动后立即强制关机重新启动即可进入到虚拟机系统。复制的虚拟机磁盘已经是一个完整的虚拟机系统。
复制磁盘,通过命令行创建
[root@node4 ~]# cd /home/data/kvm/images
[root@node4 images]# cp centos7-bridge.qcow2 mysql-bridge.qcow2
[root@node4 images]# virt-install --virt-type kvm --name mysql-bridge --os-variant=centos7.0 --accelerate --ram 2048 --vcpus 2 --cdrom=/home/data/isos/centos7.iso --disk path=/home/data/kvm/images/mysql-bridge.qcow2 --network bridge=br0,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole --autostart
#会自动生成对应xml文件
[root@node4 images]# ls -lrt /etc/libvirt/qemu
-rw-------. 1 root root 4247 Jan 13 14:22 mysql-bridge.xml
修改对应的ip测试
复制虚拟机磁盘,通过virt-manager导入
复制虚拟机磁盘,通过virt-manager导入
[root@node4 ~]# cd /home/data/kvm/images
[root@node4 images]# cp centos7-bridge.qcow2 haproxy-bridge.qcow2
通过virt-manager管理界面导入
登录系统之后修改IP,重启网络测试
五、将vmvare虚拟机迁移到KVM环境
1、将VMware虚拟机对应的vmdk文件迁移至kvm硬盘存储位置
2、将迁移至kvm的vmdk文件格式转换为qcow2
3、用virt-manager管理工具转换完成的qcows2重新导入,开机测试
##将vmware虚拟机的node4-centos7.vmdk文件上传至kvm对应的磁盘存储目录,然后转换vmdk文件
# qemu-img convert -O qcow2 node4-centos7.vmdk node4-centos7.qcow2
导入步骤: