前言
概述
基于内核的虚拟机(KVM)是一种内建于 Linux® 的开源虚拟化技术。具体而言,KVM 可帮助您将 Linux 转变为虚拟机监控程序,使主机计算机能够运行多个隔离的虚拟环境,即虚拟客户机或虚拟机(VM)。
KVM 是 Linux 的一部分。Linux 2.6.20 或更新版本包括 KVM。KVM 于 2006 年首次公布,并在一年后合并到主流 Linux 内核版本中。由于 KVM 属于现有的 Linux 代码,因此它能立即享受每一项新的 Linux 功能、修复和发展,无需进行额外工程。
简单来说就是:基于内核的虚拟机
KVM 功能
KVM 是 Linux 的一部分。Linux 也是 KVM 的一部分。Linux 有的,KVM 全都有。然而,KVM 的某些特点让它成为了企业的首选虚拟机监控程序。
安全防护
KVM 利用安全增强型 Linux(SELinux)和安全虚拟化(sVirt)组合来加强虚拟机的安全性和隔离性。SELinux 在虚拟机周围建立安全边界。sVirt 则扩展 SELinux 的功能,使强制访问控制 (MAC)安全机制应用到客户虚拟机,并且预防手动标记错误。
存储空间
KVM 能够使用 Linux 支持的任何存储,包括某些本地磁盘和网络附加存储(NAS)。还可以利用多路径 I/O 来增强存储并提供冗余能力。KVM 还支持共享文件系统,因此虚拟机镜像可以由多个主机共享。磁盘镜像支持精简置备,可以按需分配存储,不必预先备妥一切。
硬件支持
KVM 可以使用多种多样的认证 Linux 兼容硬件平台。由于硬件供应商经常助力内核开发,所以 Linux 内核中通常能快速采用最新的硬件功能。
内存管理
KVM 继承了 Linux 的内存管理功能,包括非统一内存访问和内核同页合并。虚拟机的内存可以交换,也可通过大型宗卷支持来提高性能,还可由磁盘文件共享或支持。
实时迁移
KVM 支持实时迁移,也就是能够在物理主机之间移动运行中的虚拟机,而不会造成服务中断。虚拟机保持开机状态,网络连接保持活跃,各个应用也会在虚拟机重新定位期间正常运行。KVM 也会保存虚拟机的当前状态,从而存储下来供日后恢复。
性能和可扩展性
KVM 继承了 Linux 的性能,针对客户机和请求数量的增长进行扩展,满足负载的需求。KVM 可让要求最苛刻的应用工作负载实现虚拟化,而这也是许多企业虚拟化设置的基础,如数据中心和私有云等(通过 OpenStack®)。
调度和资源控制
在 KVM 模型中,虚拟机是一种 Linux 进程,由内核进行调度和管理。通过 Linux 调度程序,可对分配给 Linux 进程的资源进行精细的控制,并且保障特定进程的服务质量。在 KVM 中,这包括完全公平的调度程序、控制组、网络命名空间和实时扩展。
更低延迟,更高优先级
Linux 内核提供实时扩展,允许基于虚拟机的应用以更低的延迟、更高的优先级来运行(相对于裸机恢复)。内核也将需要长时间计算的进程划分为更小的组件,再进行相应的调度和处理。
正片开始
先来了解 qcow2和raw
raw: 裸磁盘格式(默认的虚拟磁盘格式)
raw,原意就是“未经加工”,也指未格式化的磁盘。linux中,raw是磁盘映像的纯二进制映像格式。在支持稀疏文件的文件系统里,raw格式的映像只占用记录在其中的数据实际使用的空间。Raw格式磁盘又称为裸磁盘设备,裸设备,你随便dd一个file就可以模拟了一个raw格式的镜像。
由于裸的彻底,性能上接近物理硬盘的,性能较好。目前来看,KVM和XEN默认的格式好像还是这个格式。因为其原始,有很多原生的特性,例如直接挂载也是一件简单的事情。 裸的好处还有就是简单,支持转换成其它格式的虚拟机镜像对裸露的它来说还是很简单的(如果其它格式需要转换,有时候还是需要它做为中间格式),空间使用来看,这个很像物理磁盘,使用多少就显示多少(du -h看到的大小就是使用大小)。而且, raw虚拟磁盘/映像格式很容易扩展,即原生态,管理灵活度,与系统交互更好,但不支持snapshot,相关资料说明,可利用版本管理软件对raw格式的文件做版本管里,通过不同的版本回滚,实现类似快照的功能。
raw虽然性能比较好,但是不支持快照
而且raw是立即分配空间的,不管你有没有用这么多空间
总结一句就是类似于固态硬盘
Qcow2(QEMU copy-on-write)
qcow2 镜像格式是 QEMU 模拟器支持的一种磁盘镜像。它也可以用一个文件的形式来表示一块固定大小的块设备磁盘。Qcow2是目前比较主流的一种虚拟化镜像格式,目前qcow2的性能上接近raw裸格式的性能,与普通的 raw 格式的镜像相比,它还有以下特性:
a)更小的空间占用,即使文件系统不支持空洞(holes);qcow2 格式的镜像比 Raw 格式文件更小,只有在虚拟机实际占用了磁盘空间时,其文件才会增长,能方便的减少迁移花费的流量,更适用于云计算系统
b)支持写时拷贝(COW, copy-on-write),镜像文件只反映底层磁盘的变化;
c)支持快照(snapshot),镜像文件能够包含多个快照的历史;
d)可选择基于 zlib 的压缩方式,它允许每个簇(cluster)单独使用 zlib 压缩。
e)可以选择 AES 加密,支持使用 128 位的 AES 密钥进行加密。
官方解释,qcow2 镜像文件是由多个固定大小的单元组织构成,这些单元被称为 (host clusters );无论是实际用户数据(guest data)还是镜像的元数据(metadata),都存储到一个 cluster 单元中。用户系统里所见到的虚拟磁盘实际是被分割成多个同样大小的 clusters 的集合显示。
qcow2 镜像可以用来保存另一个镜像文件的变化,它并不去修改原始镜像文件,只记录与原始镜像文件的不同即可,这种镜像文件就叫做 copy-on-write 镜像。虽然是一个单独的文件,但它的大部分的数据都来自原始镜像,只有跟原始镜像文件相比有变化的 cluster 才会被记录下来。快照就是原始文件本身(内部快照)。它既包含做快照之前的原始文件部分,它本身也包含可写的部分。
总结一句话类似于机械硬盘
性能没raw好,但是支持快照
而且qcow2是承诺给你这么多空间,并不会立即给你分配这么多空间
只有等到你需要用的时候才会分配,最多只给你承诺的空间大小,避免了资源的浪费
开始创建虚拟机
1.环境检查及安装
1.1)关闭防火墙及selinux
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
1.2检查CPU是否支持VT虚拟化
[root@localhost ~]# grep -Ei 'vmx|svm' /proc/cpuinfo
1.4)下载安装KVM软件
[root@localhost ~]# yum -y install kvm qemu-kvm python-virtinst libvirt libvirt-python virt-manager libguestfs-tools bridge-utils virt-install
2.在目录 /kvm/vdisks 下创建一个 qcow2 格式大小 10G 名为 testCentos.qcow2 的磁盘映像文件:
qemu-img create -f qcow2 /kvm/vdisks/testCentos.qcow2 10G
可以通过 qemu-img info 查看磁盘信息
qemu-img info /kvm/vdisks/testCentos.qcow2
3.配置虚拟网卡
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
# 拷贝当前的网卡文件,作为一个桥接网卡
[root@localhost /etc/sysconfig/network-scripts]# cp ifcfg-ens33 ifcfg-br0
# 修改原来的网卡内容
[root@localhost /etc/sysconfig/network-scripts]# vim ifcfg-ens33
重启网络服务
[root@localhost ~]# systemctl restart network
网络服务重启之后使用ifconfig命令可以看到此时ens33网卡的IP到br0网卡上了
4.启动KVM服务
# 检查KVM模块是否加载
[root@localhost ~]# lsmod |grep kvm
# 启动libvritd服务
[root@localhost ~]# systemctl start libvirtd
# 此时可以看到两个网卡
[root@localhost ~]# brctl show
5、使用命令安装
[root@localhost ~]# virt-install --name=study01 --memory=1024,maxmemory=1024 --vcpus=1,maxvcpus=2 --os-type=linux --os-variant=rhel7 --location=/opt/CentOS-7-x86_64-DVD-1810.iso --disk path=/kvm/vdisks/centos7.img.qcow2,size=10 --bridge=br0 --graphics=none --console=pty,target_type=serial --extra-args="console=tty0 console=ttyS0"
使用VNC连接
命令说明
--name 指定虚拟机的名称 --memory 指定分配给虚拟机的内存资源大小 maxmemory 指定可调节的最大内存资源大小,因为KVM支持热调整虚拟机的资源 --vcpus 指定分配给虚拟机的CPU核心数量 maxvcpus 指定可调节的最大CPU核心数量 --os-type 指定虚拟机安装的操作系统类型 --os-variant 指定系统的发行版本 --location 指定ISO镜像文件所在的路径,支持使用网络资源路径,也就是说可以使用URL --disk path 指定虚拟硬盘所存放的路径及名称,size 则是指定该硬盘的可用大小,单位是G --bridge 指定使用哪一个桥接网卡,也就是说使用桥接的网络模式 --graphics 指定是否开启图形 --console 定义终端的属性,target_type 则是定义终端的类型 --extra-args 定义终端额外的参数
使用命令行模式安装虚拟机
virt-install --connect qemu:///system --virt-type kvm --name centos --vcpus 1 --memory 2048 --disk path=/kvm/vdisks/centos.qcow2,size=10,format=qcow2 --location /opt/iso/CentOS-7-x86_64-DVD-1810.iso --network bridge=virbr0 --graphics none --extra-args="console=ttyS0"
使用 virsh console centos 进入虚拟机安装
这边重点说下桥接网络的配置
如果你创建虚拟机的时候用的是默认网络
那么你物理机会ping不通kvm虚拟机
但是你用vmware创建的系统内可以ping通
开始配置
不废话,反手就是两个配置文件
桥接网卡
ifcfg-br0
TYPE=Ethernet
NAME=ens33
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0
宿主机网卡
ifcfg-ens33
TYPE=Bridge
BOOTPROTO=none
NAME=br0
DEVICE=br0
ONBOOT=yes
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_PRIVACY=no
IPADDR=192.168.2.100
NETMASK=255.255.255.0
GATEWAY=192.168.2.254
DNS1=114.114.114.114
上面的方法是用了静态的ip配置
也可以使用dhcp自动获取ip
需要删除下面的ip配置
加上
BOOTPROTO=dhcp
dhcp完整配置 ifcfg-ens33
TYPE=Bridge
BOOTPROTO=none
NAME=br0
DEVICE=br0
ONBOOT=yes
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_PRIVACY=no
BOOTPROTO=dhcp
这样网卡就可以自己自动获取ip了
配置完成后不要忘记重启网络
systemctl restart network
这边补充个知识点
virsh pool-start local0
这个命令是启动存储池
virsh pool-list --all
这条命令是查看所有的存储池
virsh pool-autostart local0
1、虚拟机查看
执行命令:
virsh list
可以查看已经打开的虚拟机。
执行命令:
virsh list --all
可以查看所有虚拟机(包括已经打开的和未打开的)
执行命令:
virsh version
可以查看virsh的版本上述命令执行结果如下:
2、虚拟机启动与关闭执行命令:
virsh start centos7-1
可以打开该虚拟机。执行命令:
virsh shutdown centos7-1
可以关闭该虚拟机。执行命令:
virsh destroy centos7-1
可以强制性关闭该虚拟机,相当于强行断电,当虚拟机无法正常关闭时常使用这种方法。
3、虚拟机配置文件导出执行命令:
virsh dumpxml centos7-2 > /tmp/centos7-2.xml
可以将该虚拟机的配置文件导出到/tmp/目录下,并命名为centos7-2.xml,该命令执行结果如下:
4、虚拟机挂起与恢复执行命令:
virsh suspend centos7-1
可以挂起该虚拟机。执行命令:
virsh resume centos7-1
可以恢复该虚拟机。
5、虚拟机会话链接执行命令:
virsh console centos7-1
可以与centos7-1打开一个控制台窗口终端。
6、虚拟机克隆
有关虚拟机克隆等相关理论和命令,请参考以下文章:KVM详解(四)——KVM克隆与KVM配置文件
7、虚拟机撤销与恢复执行命令:
virsh undefine centos7-2
可以将该虚拟机从虚拟机管理器中移除,该虚拟机的配置文件会随之删除,但是该虚拟机磁盘文件并没有删除,因此该虚拟机还可以恢复,但是前提是该虚拟机的配置文件已经进行了导出和备份。
执行命令:
virsh define /tmp/centos7-2.xml
即可对删除的虚拟机进行恢复。
8、虚拟机自启动与自启动撤销执行命令:
virsh autostart centos7-1
可以使得该虚拟机在开始时自启动执行命令:
virsh autostart --disable centos7-1
可以取消掉该虚拟机开机时自启动的设置。
生成虚拟机的XML配置文件,然后对XML文件进行修改,并使用virsh define
命令将修改后的XML配置文件加载到虚拟机中。
-
生成虚拟机的XML配置文件:
virsh dumpxml centos > centos.xml
-
编辑XML配置文件
centos.xml
,根据需要进行修改。 -
加载修改后的XML配置文件到虚拟机中:
virsh define centos.xml
创建快照
-
在KVM中,你可以使用
virsh
命令行工具来创建和管理虚拟机的快照。以下是创建快照的一般步骤: -
首先,确定你要对哪个虚拟机创建快照,以及快照的名称。然后使用以下命令创建快照:
virsh snapshot-create-as <domain_name> <snapshot_name>
将
<domain_name>
替换为虚拟机的名称,<snapshot_name>
替换为你想要给快照的名称,"Description of the snapshot"
替换为快照的描述信息。 -
创建快照后,你可以列出当前存在的快照以确认快照已经创建成功:
virsh snapshot-list <domain_name>
这将列出指定虚拟机的所有快照信息。
-
如果你需要回滚到快照状态,可以使用以下命令来恢复到指定的快照:
virsh snapshot-revert <domain_name> <snapshot_name>
将
<domain_name>
替换为虚拟机的名称,<snapshot_name>
替换为你要回滚到的快照的名称。 -
如果你只是想删除快照而不进行恢复,可以使用以下命令删除指定的快照:
virsh snapshot-delete <domain_name> <snapshot_name>
同样,将
<domain_name>
替换为虚拟机的名称,<snapshot_name>
替换为你要删除的快照的名称。
virsh save是什么?
virsh save
命令用于将虚拟机的当前状态保存到磁盘中,以便稍后可以通过恢复这个状态来快速启动虚拟机。这种保存的状态类似于虚拟机的冷冻状态,包括虚拟机的内存和CPU状态。当你执行
virsh save
命令时,虚拟机的当前内存状态会被保存到一个文件中。接着,虚拟机的运行状态被暂停,但虚拟机的配置和磁盘状态仍然保持不变。稍后,你可以使用virsh restore
命令来恢复之前保存的状态,使虚拟机从保存的状态下恢复运行。这种保存虚拟机状态的方法对于需要临时暂停虚拟机、备份或迁移虚拟机非常有用。当虚拟机处于高负载状态时,也可以通过保存状态来暂停虚拟机,稍后再恢复到之前的状态。
总之,
virsh save
命令可以将虚拟机的内存状态保存到文件中,以便稍后可以恢复虚拟机到保存的状态。
创建
virsh save centos centos.img
恢复
virsh restore centos.img