KVM虚拟化基础

前言

概述

基于内核的虚拟机(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网卡上了

a3cd89f92a36dade49e64a179b25709d.png

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的版本上述命令执行结果如下:

2022-11-24_3937.png

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,该命令执行结果如下:

2022-11-24_40506.png

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配置文件加载到虚拟机中。

  1. 生成虚拟机的XML配置文件:

    virsh dumpxml centos > centos.xml
  2. 编辑XML配置文件centos.xml,根据需要进行修改。

  3. 加载修改后的XML配置文件到虚拟机中:

    virsh define centos.xml

    创建快照

  4. 在KVM中,你可以使用virsh命令行工具来创建和管理虚拟机的快照。以下是创建快照的一般步骤:

  5. 首先,确定你要对哪个虚拟机创建快照,以及快照的名称。然后使用以下命令创建快照:

    virsh snapshot-create-as <domain_name> <snapshot_name>

    <domain_name> 替换为虚拟机的名称,<snapshot_name> 替换为你想要给快照的名称,"Description of the snapshot" 替换为快照的描述信息。

  6. 创建快照后,你可以列出当前存在的快照以确认快照已经创建成功:

    virsh snapshot-list <domain_name>

    这将列出指定虚拟机的所有快照信息。

  7. 如果你需要回滚到快照状态,可以使用以下命令来恢复到指定的快照:

    virsh snapshot-revert <domain_name> <snapshot_name>
     

    <domain_name> 替换为虚拟机的名称,<snapshot_name> 替换为你要回滚到的快照的名称。

  8. 如果你只是想删除快照而不进行恢复,可以使用以下命令删除指定的快照:

    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 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java-superchen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值