虚拟化KVM


1.虚拟化介绍


VMware Workstation就是虚拟化

  • 虚拟化简单讲,就是把一台物理计算机虚拟成多台逻辑计算机,每个逻辑计算机里面可以运行不同的操作系统,相互不受影响,每个逻辑系统都是独立的存在,这样就可以充分利用物理硬件的资源,而且还可以自由分配资源。

  • 关键词Hypervisor(VMM) 虚拟机管理器(用来管理逻辑计算机的)

  • 虚拟化技术分为全虚拟化和半虚拟化

      早期的CPU硬件不支持虚拟化,虚拟机上的操作系统(guestos)要想使用cpu资源,需要通过VMM来翻译指令,这个过程比较耗费资源,这种虚拟化技术叫做全虚拟化             (VMware Workstation)

    半虚拟化技术通过修改guestos内核,让guestos可以直接使用CPU资源,而不需要翻译指令了,从而节省了资源,但修改内核比较鸡肋(XEN)

    后续cpu厂商直接支持虚拟化,不需要通过VMM翻译指令了,无所谓半虚拟化和全虚拟化

  • 虚拟化技术的优点:

      资源池——一个物理机的资源分配到了不同的虚拟机里

      很容易扩展——增加物理机或者虚拟机即可,因为虚拟机是可以复制的

      很容易云化——亚马孙AWS,阿里云,谷歌云等


  • 虚拟化技术的局限性:

      每一个虚拟机都是一个完整的操作系统,所以需要给其分配物理资源,当虚拟机数量增多时,操作系统本身消耗的资源势必增多

      虚拟化技术没法解决运维环境和开发环境的矛盾,所以后来才出现了容器技术

参考 

虚拟化技术漫谈

全虚拟化和半虚拟化的区别 cpu的ring0 ring1又是什么概念

三种虚拟化技术的技术差别图解



2.常见虚拟化软件


VMware系列

VMware workstation、VMware vsphere(VMware esxi)、VMware Fusion(Mac) 

Xen 开源 半虚拟化(需要改机器的内核)

XenServer 商业,厂商Ctirx,基于Xen的(Ctirt把xen收购了)

KVM 开源 基于linux内核模块(被红帽子最后收购)

Hyper-V 商业,微软旗下的产品(适合在微软的操作系统上安装)

Openvz 开源  基于linux 特点:虚拟机和宿主机共用一个内核(如果你宿主机的内核崩溃那么你虚拟机的内核也会崩溃)

VirtualBox 开源  Sun公司开发  Oracle收购Sun

http://developer.huawei.com/ict/forum/thread-23385-1-1.html

软件特点:

  • VMware系列,商业

            VMware Workstation,适合单机使用

            VMware Vsphere(VMware esxi),适合规模更大的场景

            VMware Fusion(Mac)

  • Xen    开源,支持半虚拟化

  • XenServer    商业,Ctirx收购Xen之后研发的,基于Xen的

  • KVM    开源 ,基于Linux内核模块,目前KVM已经被红帽收购了,大多数系统都倾向于使用KVM

  • Hyper-V    商业,微软的产品,适合在windows服务器上用

  • Openvz    开源 ,轻量,基于Linux,虚拟机和宿主机共用一个内核,优点是一台物理机可以虚拟化很多台虚拟机,缺点是不稳定,物理机的内核奔溃,所有的虚拟机都会崩溃,早期vps供应商用得比较多

  • VirtualBox    开源 ,Sun公司开发 ,Oracle收购Sun之后,现在属于Oracle


3.虚拟化架构

虚拟化KVM_KVm

I型:虚拟机直接运行在系统硬件上,创建硬件全仿真实例,被称为“裸机”,也称为裸金属架构。


II型:虚拟机运行在传统操作系统上,同样创建的是硬件全仿真实例,被称为“托管”hypervisor。也称为宿主架构。


Xen属于I型,KVM属于II型。



4.KVM介绍

简介1

  • KVM是以色列初创公司Qumranet开发,2008年9月RedHat公司收购了Qumranet

  • KVM是Linux内核的一个模块,它把Linux内核变成了一个Hypervisor

  • KVM是完全开源的,RedHat基于KVM的虚拟化解决方案叫做RHEV

  • KVM在Linux操作系统里面以进程的形式出现,由标准的Linux调度程序进行调度,这使得KVM能够使用Linux内核的已有功能

  • 只有一个KVM内核模块还不能实现虚拟化的全部功能,就好比操作系统只有内核还不能成为一个完整的操作系统一样

  • QEMU是一个开源的虚拟化软件,纯软件,可以虚拟化所以的硬件,性能不强

  • KVM基于QEMU开发了一个能够运行在用户空间的工具QEMU-KVM

  • 磁盘、网络设备等都是通过QEMU-KVM这个工具模拟出来的

  • KVM和QEMU-KVM通信是通过/dev/kvm实现的

  • libvirt是用来管理KVM虚拟机的API,其命令为virsh

简介2

  1. 这里只介绍KVM而不介绍其他虚拟化软件的原因有两点,一是我们大多数的服务器系统都是Linux内核的操作系统,而KVM是基于Linux内核的。二是KVM是开源、免费的,其他的例如VMware Vsphere、XenServer等都是商业收费的,而Hyper-V 又是Windows的,Openvz 又有局限性(与宿主共用内核,就无法安装其他内核的虚拟机),稳定性也有待考究,VirtualBox又不适合大规模的虚拟化场景,所以最后就只剩下KVM了。

  2. KVM是Kernel-based Virtual Machine的缩写,意为基于内核的虚拟机。KVM是一个完全开源的系统虚拟化模块,它所基于的是Linux内核,它把Linux内核变成了一个Hypervisor,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM目前已成为学术界的主流VMM之一。

  3. 最开始KVM是由以色列初创公司Qumranet开发,后来2008年9月RedHat公司收购了Qumranet,RedHat基于KVM的虚拟化解决方案叫做RHEV,不过RHEV是收费的。

  4. KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化。而Xen早期则是基于软件模拟的Para-Virtualization,新版本则是基于硬件支持的完全虚拟化。但Xen本身有自己的进程调度器,存储管理模块等,所以代码较为庞大。广为流传的商业系统虚拟化软件VMware ESX系列是基于软件模拟的Full-Virtualization。

  5. KVM在Linux操作系统里面以进程的形式出现,由标准的Linux调度程序进行调度,这使得KVM能够使用Linux内核的已有功能。但是只有一个KVM内核模块还不能实现虚拟化的全部功能,就好比操作系统只有内核还不能成为一个完整的操作系统一样。所以这就需要提到QEMU了,QEMU是一个开源的虚拟化软件,纯软件,可以虚拟化所有的硬件,性能不强。而KVM基于QEMU开发了一个能够运行在用户空间的工具QEMU-KVM,KVM里的磁盘、网络设备等都是通过QEMU-KVM这个工具模拟出来的,所以KVM结合QEMU-KVM工具之后才算完整,KVM和QEMU-KVM通信是通过/dev/kvm实现的。其中libvirt是用来管理KVM虚拟机的API,其命令为virsh。

KVM架构图

虚拟化KVM_虚拟化_02


5.Centos7上安装KVM


前提是CPU支持虚拟化

1.虚拟机设置内存4G(根据实际的实验需求来)

虚拟化KVM_虚拟化_03

2.处理器2核,虚拟化引擎两个虚拟化相关的选项打上对勾(如果在启动机器时报“CPU性能计数器问题”可以把下边的虚拟化CPU性能计数器的√去掉,只要前边的)

虚拟化KVM_虚拟化_04

3.增加一个50G的虚拟磁盘

虚拟化KVM_虚拟化_05

4.开启虚拟机


检查cpu参数是否支持虚拟化  

grep -Ei 'vmx|svm' /proc/cpuinfo

vmx(标识):英特尔CPU

svm(标识):AMD

虚拟化KVM_KVm_06

准备工作-关闭防火墙

关闭iptables或者firewalld

关闭selinux

格式化新磁盘,挂载到/kvm_data

查看新磁盘

虚拟化KVM_KVm_07

这里不用分区直接格式化

虚拟化KVM_KVm_08

查看你格式化磁盘的格式

虚拟化KVM_KVm_09

创建/kvm_data目录并把新磁盘挂在到该目录下

[root@localhost ~]# mkdir  
[root@localhost ~]# mount /dev/sdb /kvm_data/

虚拟化KVM_KVm_10

编辑配置文件让磁盘开机自动挂载到目录下:vi /etc/fstab

/dev/sdb                /kvm_data               ext4    defaults        0 0

虚拟化KVM_虚拟化_11

下载一个centos7的镜像文件

安装kvm

yum install -y  virt-*  libvirt  bridge-utils qemu-img


6.配置网卡并安装centos7


配置网卡,增加桥接网卡

拷贝现有网卡并改名为br0

cp ifcfg-eno16777736 ifcfg-br0

编辑网卡br0更改一些东西

TYPE=Bridge
BOOTPROTO=none
NAME=br0
DEVICE=br0
ONBOOT=yes
PREFIX=24
IPADDR=192.168.18.128
NETMASK=225.225.225.0
GATEWAY=192.168.18.2
DNS1=114.114.114.114
DNS2=8.8.8.8

把之前的网卡也更改一下(其他IP都去掉BRIDGE=br0意思是桥接到br0往卡上)

TYPE=Ethernet
BOOTPROTO=none
NAME=eno16777736
DEVICE=eno16777736
ONBOOT=yes
BRIDGE=br0

配置完重启网卡服务

systemctl restart network

配置成功桥接网卡之后你会发现br0是之前网卡的IP

虚拟化KVM_虚拟化_12

检查KVM模块是否加载

lsmod|grep kvm

虚拟化KVM_虚拟化_13

启动libvirtd服务

systemctl start  libvirtd

检查进程在不在

ps aux|grep libvirt

虚拟化KVM_虚拟化_14

命令:brctl show

可以看到两个网卡br0和virbr0

虚拟化KVM_KVm_15

virbr0:是libvirtd服务启动起来的一个桥接网卡跟我们桥接的br0网卡不一样

为什么有两个,因为分别代表两种网络模式,因为vmware可以用鼠标点换网络模式,而kvm只能在系统里换,就需要有两个模式,之后配置你指向哪个就是哪个模式

virbr0:NAT模式

br0:桥接模式


7.命令行安装centos7


virt-install --name=awei-01 --memory=512,maxmemory=1024 --vcpus=1,maxvcpus=2 --os-type=linux --os-variant=rhel7 --location=/tmp/CentOS-7-x86_64-DVD-1804.iso --disk path=/kvm_data/awei-01.img,size=10 --bridge=br0 --graphics=none --console=pty,target_type=serial  --extra-args="console=tty0 console=ttyS0"

命令说明:

  • --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 定义终端额外的参数

报错:

虚拟化KVM_虚拟化_16

解决办法:yum install -y openssl-1.0.2k*

开始安装前的检测硬件:这时候其实已经进入了一个虚拟终端了,按Ctrl+]退出终端,但是我们不能退出来

虚拟化KVM_KVm_17

开始安装(翻译)

1) [x] Language settings 语言设置                2) [!] Time settings 时间设置

        (English (United States)) 英语(美国)              (Timezone is not set.) 未设置时区

 3) [!] Installation source 安装源                   4) [!] Software selection 软件选择

        (Processing...) 正在处理                                 (Processing...) 正在处理

 5) [!] Installation Destination 安装目标        6) [x] Kdump 

        (No disks selected) 未选择磁盘                     (Kdump is enabled) Kdump已启用

 7) [ ] Network configuration 网络配置        8) [!] Root password 跟密码

        (Not connected) 未连接                               (Password is not set.) 未设置密码

 9) [!] User creation 创建用户

        (No user will be created) 不会创建用户

  Please make your choice from above ['q' to quit | 'b' to begin installation |

  'r' to refresh]:                      请从上面选择['q'退出|'b'开始安装|"r"刷新:

  • 语言配置

  1. 配置语言-敲“1”回车

虚拟化KVM_虚拟化_18

2.再回车-选择“68”项中文

虚拟化KVM_虚拟化_19

3.在选择中文类别“1”中文简体

虚拟化KVM_虚拟化_20

  • 时区设置

  1. 敲“2”回车-选择“1”时区设置-回车

虚拟化KVM_KVm_21

2.选择“2”亚洲-回车

虚拟化KVM_KVm_22

3.回车-选择“64”上海

  • 配置安装目标

敲“5”回车-选择“c”-回车

Installation

 1) [x] Language settings            2) [x] Time settings
     (Simplified Chinese (China))        (Asia/Shanghai timezone)
 3) [x] Installation source           4) [x] Software selection
     (Local media)                (Minimal Install)
 5) [!] Installation Destination         6) [x] Kdump
     (No disks selected)             (Kdump is enabled)
 7) [ ] Network configuration          8) [!] Root password
     (Not connected)               (Password is not set.)
 9) [!] User creation
     (No user will be created)
  Please make your choice from above ['q' to quit | 'b' to begin installation |
  'r' to refresh]: 5
================================================================================
================================================================================
Probing storage...
Installation Destination

[x] 1) : 10 GiB (vda)

1 disk selected; 10 GiB capacity; 10 GiB free ...

  Please make your choice from above ['q' to quit | 'c' to continue |
  'r' to refresh]: c
================================================================================
================================================================================
Autopartitioning Options

[ ] 1) Replace Existing Linux system(s)

[x] 2) Use All Space

[ ] 3) Use Free Space

Installation requires partitioning of your hard drive. Select what space to use
for the install target.

  Please make your choice from above ['q' to quit | 'c' to continue |
  'r' to refresh]: 2
================================================================================
================================================================================
Autopartitioning Options

[ ] 1) Replace Existing Linux system(s) 替换现有的Linux系统

[x] 2) Use All Space 利用所有空间

[ ] 3) Use Free Space 使用可用空间

Installation requires partitioning of your hard drive. Select what space to use
for the install target.

  Please make your choice from above ['q' to quit | 'c' to continue |
  'r' to refresh]: c 默认就可以
================================================================================
================================================================================
Partition Scheme Options

[ ] 1) Standard Partition 标准分区 

[ ] 2) Btrfs Btrfs系统

[x] 3) LVM 

[ ] 4) LVM Thin Provisioning LVM精简资源调配

Select a partition scheme configuration.

  Please make your choice from above ['q' to quit | 'c' to continue |
  'r' to refresh]: 1
================================================================================
================================================================================
Partition Scheme Options

[x] 1) Standard Partition

[ ] 2) Btrfs

[ ] 3) LVM

[ ] 4) LVM Thin Provisioning

Select a partition scheme configuration.

  Please make your choice from above ['q' to quit | 'c' to continue |
  'r' to refresh]: c 完成

翻译:

[ ] 1) Replace Existing Linux system(s) 替换现有的Linux系统

[x] 2) Use All Space 利用所有空间

[ ] 3) Use Free Space 使用可用空间

  • 设置root密码

Installation

 1) [x] Language settings                 2) [x] Time settings
        (Simplified Chinese (China))             (Asia/Shanghai timezone)
 3) [x] Installation source               4) [x] Software selection
        (Local media)                            (Minimal Install)
 5) [x] Installation Destination          6) [x] Kdump
        (Automatic partitioning                  (Kdump is enabled)
        selected)                         8) [!] Root password
 7) [ ] Network configuration                    (Password is not set.)
        (Not connected)
 9) [!] User creation
        (No user will be created)
  Please make your choice from above ['q' to quit | 'b' to begin installation |
  'r' to refresh]: 8
================================================================================
================================================================================
Please select new root password. You will have to type it twice.

Password: 
Password (confirm): 
================================================================================
================================================================================
Question

The password you have provided is weak: The password fails the dictionary check 您提供的密码很弱:密码无法通过字典检查 
- it is too simplistic/systematic. 它过于简单化/系统化
Would you like to use it anyway? 你想用它吗?

Please respond 'yes' or 'no': yes 请回答“是”或“否”:
  • 配置完这几项之后选“b”开始安装

虚拟化KVM_虚拟化_23

按回车继续进行重启

虚拟化KVM_KVm_24


8.虚拟机管理


命令整合

[root@localhost ~]# virsh list //查看虚拟机列表,只能看到运行的虚拟机

[root@localhost ~]# virsh list --all //查看虚拟机列表,包括未运行的虚拟机

[root@localhost ~]# virsh console awei-01  # 进入指定的虚拟机,进入的时候还需要按一下回车

[root@localhost ~]# virsh start awei-01  # 启动虚拟机

[root@localhost ~]# virsh shutdown awei-01  # 关闭虚拟机

[root@localhost ~]# virsh destroy awei-01  # 强制停止虚拟机

[root@localhost ~]# virsh undefine awei-01  # 彻底销毁虚拟机,会删除虚拟机配置文件,但不会删除虚拟磁盘

[root@localhost ~]# virsh autostart awei-01  # 设置宿主机开机时该虚拟机也开机

[root@localhost ~]# virsh autostart --disable awei-01  # 解除开机启动

[root@localhost ~]# virsh suspend awei-01 # 挂起虚拟机

[root@localhost ~]# virsh resume awei-01 # 恢复挂起的虚拟机

ctrl+] //退出虚拟机使用快捷键

ps aux |grep kvm //查看kvm进程

virsh list //查看虚拟机列表,只能看到运行的虚拟机

[root@awei-01 ~]# virsh list
 Id    名称                         状态
----------------------------------------------------
 2     awei-02                        running

virsh list --all //查看虚拟机列表,包括未运行的虚拟机

[root@awei-01 ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 2     awei-02                        running
 -     awei-01                        关闭

virsh console awei-01//进入指定虚拟机 连接完之后要回车进去

虚拟化KVM_虚拟化_25

virsh undefine awei-01//彻底销毁虚拟机,会删除虚拟机配置文件,virsh list --all就看不到了 (配置文件在/etc/libvirt/qemu里边)

虚拟化KVM_KVm_26

要想彻底删除这个虚拟机需要删除“虚拟磁盘文件”在kvm的根目录里/kvm_data

虚拟化KVM_虚拟化_27

ls /etc/libvirt/qemu/  //可以查看虚拟机配置文件


9.克隆虚拟机


克隆虚拟机是虚拟机软件必须得有的功能,这样能省去我们安装系统及环境的时间,如果使用过VMware、VirtualBox等虚拟机软件的话,都知道有这个功能,KVM也不例外,只不过我们没有用图形化界面,是命令行形式的而已。


要克隆某个虚拟机,首先这个虚拟机需要为关闭状态:

virsh shutdown awei-01

[root@awei-01 ~]# virsh shutdown awei-01
域 awei-01 被关闭

然后执行以下命令进行克隆:

virt-clone  --original awei-01 --name awei-02 --file /kvm_data/awei-02.img

[root@awei-01 ~]# virt-clone  --original awei-01 --name awei-02 --file /kvm_data/awei-02.img
正在分配 'awei-02.img'                                                                                    |  10 GB  00:00:37     

成功克隆 'awei-02'。

virsh list --all 查看一下会多出一台awei-02的机器

[root@awei-01 ~]# virsh list --all
 Id    名称                        状态
----------------------------------------------------
 -     awei-01                      关闭
 -     awei-02                      关闭

参数说明

  • --original指定克隆源虚拟机

  • --name指定克隆后的虚拟机名字

  • --file指定目标虚拟机的虚拟磁盘文件

如果aminglinux01虚拟机开机状态,则提示先关闭或者暂停虚拟机

  • 为了方便管理,我们可以退出虚拟终端,在外边远程连接它进行操作

[root@awei-01 ~]# ssh 192.168.18.130
The authenticity of host '192.168.18.130 (192.168.18.130)' can't be established.
ECDSA key fingerprint is b8:43:75:b8:96:d0:42:d8:0b:5e:89:64:60:e0:73:c7.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.18.130' (ECDSA) to the list of known hosts.
root@192.168.18.130's password: 密码
Last login: Wed May 13 09:40:39 2020
[root@localhost ~]# w
 17:12:03 up 1 min,  2 users,  load average: 0.17, 0.10, 0.04
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     ttyS0                     09:40    7:31m  0.11s  0.11s -bash
root     pts/0    192.168.18.128   17:11    3.00s  0.01s  0.01s w


10.快照管理


同样的创建快照也是虚拟机软件的一个很重要的功能,快照能够很方便的帮我们把虚拟机恢复到一个正常的状态下。我们来看看命令行下如何使用KVM创建虚拟机的快照:

创建快照  virsh snapshot-create awei-01

[root@awei-01 ~]# virsh snapshot-create awei-01
已生成域快照 1589336112

raw格式的虚拟磁盘不支持做快照,qcow2支持

qemu-img info /kvm_data/awei-01.img //查看aminglinux01.img信息,同时会查看到快照列表(因为快照是做的磁盘快照)

[root@awei-01 ~]# qemu-img info /kvm_data/awei-01.img
image: /kvm_data/awei-01.img
file format: qcow2 ##虚拟磁盘格式
virtual size: 10G (10737418240 bytes) # 虚拟磁盘的总大小
disk size: 1.3G # 虚拟磁盘目前所占用的物理磁盘大小
cluster_size: 65536 
Snapshot list: # 快照列表
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         1589336112                0 2020-05-13 10:15:12   00:00:00.000
Format specific information:
    compat: 1.1
    lazy refcounts: true

virsh snapshot-list aminglinux01 //列出所有快照

[root@awei-01 ~]# virsh snapshot-list awei-01
 名称               生成时间              状态
------------------------------------------------------------
 1589336112           2020-05-13 10:15:12 +0800 shutoff
[root@awei-01 ~]# virsh snapshot-list awei-02
 名称               生成时间              状态
------------------------------------------------------------

virsh snapshot-current awei-01//查看当前快照版本

ls /var/lib/libvirt/qemu/snapshot/awei-01//查看所有快照配置文件

virsh snapshot-revert awei-01 1513440854//恢复指定快照

virsh snapshot-delete awei-01  1513440854//删除快照


11.磁盘格式


虚拟磁盘常用格式有raw和qcow2,以上我们也提到了raw格式的虚拟磁盘不支持创建快照,qcow2格式的虚拟磁盘才支持创建快照。

qemu-img info /kvm_data/awei-01.img//查看虚拟磁盘格式

[root@awei-01 ~]# qemu-img info /kvm_data/awei-01.img 
image: /kvm_data/awei-01.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.3G
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         1589336112                0 2020-05-13 10:15:12   00:00:00.000
Format specific information:
    compat: 1.1
    lazy refcounts: true

创建一个2G大小的raw格式的虚拟磁盘,-f选项用于指定虚拟磁盘的格式

qemu-img create -f raw /kvm_data/awei-01_2.img 2G//创建2G的raw格式磁盘

[root@awei-01 ~]# qemu-img create -f raw /kvm_data/awei-01_2.img 2G
Formatting '/kvm_data/awei-01_2.img', fmt=raw size=2147483648

把raw格式的磁盘转换为qcow2格式

qemu-img convert -O qcow2 /kvm_data/awei-01_2.img /kvm_data/awei-01_2.qcow2

[root@awei-01 ~]# qemu-img info /kvm_data/awei-01_2.img ##先查看原来的磁盘格式
image: /kvm_data/awei-01_2.img
file format: raw ##raw格式的
virtual size: 2.0G (2147483648 bytes)
disk size: 0
[root@awei-01 ~]# qemu-img convert -O qcow2 /kvm_data/awei-01_2.img /kvm_data/awei-01_2.qcow2 ##raw格式转换为qcow2格式
[root@awei-01 ~]# qemu-img info /kvm_data/awei-01_2.qcow2 ##查看转换之后的
image: /kvm_data/awei-01_2.qcow2
file format: qcow2 ##成功转换为acow2格式
virtual size: 2.0G (2147483648 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

如上,与其说是转换,不如说是从raw格式的磁盘复制了一份格式为qcow2磁盘出来,因为原本的磁盘并不会发生任何的变化,而是从这个raw格式磁盘的基础上复制出来了一个新的qcow2格式的磁盘。

转换后用ls -lh查看磁盘文件的大小,可以看到qcow2格式的磁盘文件比较小,raw格式的磁盘文件大小和我们指定空间大小一样是2G:

[root@awei-01 kvm_data]# ls -lh
总用量 2.7G
-rw-r--r-- 1 root root 2.0G 5月  13 20:39 awei-01_2.img
-rw-r--r-- 1 root root 193K 5月  13 20:41 awei-01_2.qcow2
-rw------- 1 root root  11G 5月  13 10:15 awei-01.img
-rw------- 1 qemu qemu 1.4G 5月  13 20:49 awei-02.img
drwx------ 2 root root  16K 5月   9 01:28 lost+found

PS:raw格式的磁盘性能比qcow2要好,但是raw格式的磁盘无法做快照

使用du -sh命令查看则不一样了,raw格式的磁盘文件大小是0,而qcow2格式的磁盘文件大小则是和我们使用ls -lh查看的一样:

[root@awei-01 kvm_data]# du -sh *
0   awei-01_2.img
196K awei-01_2.qcow2
1.4G awei-01.img
1.4G awei-02.img
16K lost+found

这就是raw格式的虚拟磁盘文件和qcow2格式的虚拟磁盘文件在物理磁盘存储上的区别

给aminglinux02转换为raw格式的磁盘

先把awei-02虚拟机关闭

virsh shutdown awei-02

qemu-img convert -O raw /kvm_data/awei-02.img /kvm_data/awei-02_3.raw

[root@awei-01 kvm_data]# qemu-img convert -O raw /kvm_data/awei-02.img /kvm_data/awei-02_3.raw
[root@awei-01 kvm_data]# ls -l
总用量 4113052
-rw-r--r-- 1 root root  2147483648 5月  13 20:39 awei-01_2.img
-rw-r--r-- 1 root root      197120 5月  13 20:41 awei-01_2.qcow2
-rw------- 1 root root 10739384832 5月  13 10:15 awei-01.img
-rw-r--r-- 1 root root 10737418240 5月  14 02:26 awei-02_3.raw # 此时的属组属主为root
-rw------- 1 root root  1407254528 5月  14 02:09 awei-02.img
drwx------ 2 root root       16384 5月   9 01:28 lost+found

virsh edit awei-02//更改格式和文件路径

     <driver name='qemu' type='raw'/>
      <source file='/kvm_data/awei-02_3.raw'/>

启动:virsh start aminglinux02

可以发现启动状态的虚拟机的磁盘文件的属组属主会发生改变

[root@awei-01 kvm_data]# ls -l
总用量 4113052
-rw-r--r-- 1 root root 2147483648 5月  13 20:39 awei-01_2.img
-rw-r--r-- 1 root root 197120 5月  13 20:41 awei-01_2.qcow2
-rw------- 1 root root 10739384832 5月  13 10:15 awei-01.img
-rw-r--r-- 1 qemu qemu 10737418240 5月  14 02:26 awei-02_3.raw # 此时的属组属主为qemu
-rw------- 1 root root 1407254528 5月  14 02:09 awei-02.img
drwx------ 2 root root 16384 5月   9 01:28 lost+found

此时如果要给study02制作快照就会报如下错误:

[root@awei-01 kvm_data]# virsh snapshot-create awei-02
错误:不支持的配置:存储类型 vda 不支持磁盘 raw 的内部快照



12.磁盘扩容 – raw格式


以上介绍了虚拟磁盘格式的,以及如何转换虚拟磁盘格式,下面我们来看看如何进行磁盘扩容:

[root@awei-01 kvm_data]# ls -lh /kvm_data/awei-02_3.raw
-rw-r--r-- 1 qemu qemu 10G 5月  14 03:03 /kvm_data/awei-02_3.raw
[root@awei-01 kvm_data]# qemu-img resize /kvm_data/awei-02_3.raw +2G
Image resized.
[root@awei-01 kvm_data]# ls -lh /kvm_data/awei-02_3.raw
-rw-r--r-- 1 qemu qemu 12G 5月  14 03:08 /kvm_data/awei-02_3.raw


如上可以看到,原本的10G变成12G了,但是此时进入虚拟机中会发现磁盘依旧是10G:


[root@localhost ~]# fdisk -l
磁盘 /dev/vda:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000ab192
   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200     4196351     1048576   82  Linux swap / Solaris
/dev/vda3         4196352    20971519     8387584   83  Linux


这是因为还没有生效,需要重启虚拟机才能生效,但是注意这个重启要在宿主机上使用virsh命令进行重启,如下:


[root@awei-01 kvm_data]# virsh destroy awei-02
域 awei-02 被删除

[root@awei-01 kvm_data]# virsh start awei-02
域 awei-02 已开始

[root@awei-01 kvm_data]# virsh console awei-02
连接到域 awei-02
换码符为 ^]
[root@localhost ~]# fdisk -l

磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000ab192

   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200     4196351     1048576   82  Linux swap / Solaris
/dev/vda3         4196352    20971519     8387584   83  Linux


然后还需要把这2G的空间分区才可以使用,因为我们安装这个系统的时候选择的是标准分区,所以无法像LVM分区那样直接扩容逻辑卷:


[root@localhost ~]# fdisk /dev/vda

欢迎使用 fdisk (util-linux 2.23.2)。

 

更改将停留在内存中,直到您决定将更改写入磁盘。

使用写入命令前请三思。

 

命令(输入 m 获取帮助):n  # 新建分区

Partition type:

   p   primary (3 primary, 0 extended, 1 free)

   e   extended

Select (default e): p  # 选择新建主分区

已选择分区 4

起始 扇区 (20971520-25165823,默认为 20971520):  # 默认即可,直接按回车

将使用默认值 20971520

Last 扇区, +扇区 or +size{K,M,G} (20971520-25165823,默认为 25165823): # 默认即可,直接按回车

将使用默认值 25165823

分区 4 已设置为 Linux 类型,大小设为 2 GiB

 

命令(输入 m 获取帮助):p  # 再次查看磁盘信息

 

磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区

Units = 扇区 of 1 * 512 = 512 bytes

扇区大小(逻辑/物理):512 字节 / 512 字节

I/O 大小(最小/最佳):512 字节 / 512 字节

磁盘标签类型:dos

磁盘标识符:0x00003436

 

   设备 Boot      Start         End      Blocks   Id  System

/dev/vda1   *        2048     1026047      512000   83  Linux

/dev/vda2         1026048     3123199     1048576   82  Linux swap / Solaris

/dev/vda3         3123200    20971519     8924160   83  Linux

/dev/vda4        20971520    25165823     2097152   83  Linux  # 可以看到多了一个/dev/vda4分区

 

命令(输入 m 获取帮助):w  # 保存退出


除了对已有磁盘扩容外,还可以额外增加磁盘,宿主机下执行以下命令:


[root@localhost ~]# qemu-img create -f raw /kvm_data/awei-02_2.raw 5G #先增加一块磁盘
Formatting '/kvm_data/study02_2.raw', fmt=raw size=5368709120 
[root@localhost ~]# qemu-img info /kvm_data/awei-02_2.raw ##查看刚增加的磁盘大小
image: /kvm_data/awei-02_2.raw
file format: raw
virtual size: 5.0G (5368709120 bytes)
disk size: 0
[root@localhost ~]# virsh edit awei-02  # 编辑配置文件,在原本的<disk>标签下增加以下内容
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/kvm_data/awei-02_2.raw'/>
      <target dev='vdb' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </disk>
[root@localhost ~]# virsh destroy awei-02
Domain study02 destroyed
 
[root@localhost ~]# virsh start awei-02
Domain awei-02 started
 
[root@localhost ~]#


qemu-img resize /kvm_data/aminglinux02_3.raw +2G

qemu-img info /kvm_data/aminglinux02_3.raw 

virsh destroy aminglinux02

virsh start aminglinux02

virsh console aminglinux02

fdisk -l 查看磁盘情况,并分新的分区

除了对已有磁盘扩容外,还可以额外增加磁盘

qemu-img create -f raw /kvm_data/aminglinux02_2.raw 5G

virsh edit aminglinux02 //增加<disk>…</disk>,注意更改source、target、slot

virsh destroy aminglinux02

virsh start aminglinux02


13.磁盘扩容 – qcow2格式


qcow2格式的虚拟磁盘的扩容方式和raw格式的是一样的,只不过需要注意的是,如果虚拟磁盘保存了快照,则无法扩容会报错,如下:

[root@awei-01 kvm_data]# qemu-img info /kvm_data/awei-01.img 
image: /kvm_data/awei-01.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.3G
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         1589336112                0 2020-05-13 10:15:12   00:00:00.000
Format specific information:
    compat: 1.1
    lazy refcounts: true
[root@awei-01 kvm_data]# qemu-img resize /kvm_data/awei-01
awei-01_2.img    awei-01_2.qcow2  awei-01.img      
[root@awei-01 kvm_data]# qemu-img resize /kvm_data/awei-01.img +2G
qemu-img: Can't resize an image which has snapshots
qemu-img: This image does not support resize
qemu-img resize /kvm_data/aminglinux01.img +2G

需要把快照删除后才能进行扩容:

[root@awei-01 kvm_data]# virsh snapshot-delete awei-01 1589336112
已删除域快照 1589336112

[root@awei-01 kvm_data]# qemu-img resize /kvm_data/awei-01.img +2G
Image resized.
[root@awei-01 kvm_data]#

剩下的操作和上面演示的raw是一样的,这里就不再演示了。

如果不希望删除快照的话,就只能是创建一块新的虚拟磁盘,操作方式也是和raw一样的。

建议不管是raw格式的还是qcow2格式的虚拟磁盘需要扩容,最好是使用新增硬盘的方式进行扩容,而不是在原有的磁盘上进行扩容,因为新增磁盘相对独立与已有的磁盘,误操作时也不容易对已有的磁盘造成影响。


14.调整cpu、内存、网卡


virsh dominfo awei-01 //查看配置

[root@awei-01 ~]# virsh dominfo awei-01
Id:             -
名称:       awei-01
UUID:           e7db2f69-4a35-4ce4-ae14-a2f99820a700
OS 类型:    hvm
状态:       关闭
CPU:          1
最大内存: 1048576 KiB
使用的内存: 524288 KiB
持久:       是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0
  • 调整cpu内存

virsh edit awei-01//更改如下部分内容

<memory unit='KiB'>2048576</memory> # 内存的最大大小
<currentMemory unit='KiB'>624288</currentMemory> # 目前使用的内存大小
<vcpu placement='static' current='2'>4</vcpu> # CPU的核心数量,current的值为当前使用的核心数量,标签的值则为最大可使用的核心数量

更改完配置文件之后,如果虚拟机是开机状态的话需要重启,关机状态的话则直接启动即可生效

[root@awei-01 ~]# virsh shutdown awei-01
域 awei-01 被关闭

[root@awei-01 ~]# virsh start awei-01
域 awei-01 已开始

这样就完成了内存和CPU的调整,以上我们是通过编辑配置文件来对内存和CPU的资源进行调整,需要重启虚拟机之后才能生效。不过好在KVM是支持动态调整的,但前提是有设置最大的资源大小,例如以上的例子中,我们将内存的最大大小设置了两个G左右,那么我们就可以在这两个G以内动态的调整内存的大小,CPU也是同理。如下示例: 

[root@awei-01 ~]# virsh setmem awei-01 800m # 动态调整内存大小为800M

[root@awei-01 ~]# virsh setvcpus awei-01 3 # 动态调整CPU核心数量为3核

[root@awei-01 ~]# virsh dominfo awei-01 # 可以看到无需重启也生效了
Id:             6
名称:       awei-01
UUID:           e7db2f69-4a35-4ce4-ae14-a2f99820a700
OS 类型:    hvm
状态:       running
CPU:          3
CPU 时间:   34.7s
最大内存: 2049024 KiB
使用的内存: 819200 KiB
持久:       是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0

# 想要动态调整的配置永久生效,则需要把当前配置写入到配置文件里去

virsh dumpxml awei-01 > /etc/libvirt/qemu/awei-01.xml

注:内存资源可以动态的调大调小,而CPU资源只能动态地调大不能调小。


  • 调整网卡

virsh domiflist awei-01//查看网卡

[root@awei-01 ~]# virsh domiflist awei-01
接口     类型     源        型号      MAC
-------------------------------------------------------
vnet1      bridge     br0        virtio      52:54:00:b2:43:c4

如上,可以看到目前该虚拟机只有一个网卡。


增加一块新的网卡,并设置为nat网络模式(virbr0类似vmware的vmnet8),这里如果写--source br0,则网络模式为桥接

virsh attach-interface awei-01 --type bridge  --source virbr0

[root@awei-01 ~]# virsh attach-interface awei-01 --type bridge  --source virbr0
成功附加接口

[root@awei-01 ~]# virsh domiflist awei-01
接口     类型     源        型号      MAC
-------------------------------------------------------
vnet1      bridge     br0        virtio      52:54:00:b2:43:c4
vnet2      bridge     virbr0     rtl8139     52:54:00:fc:9a:ae

virsh dumpxml awei-01 > /etc/libvirt/qemu/awei-01.xml//需要把配置写入到配置文件里


这条命令末尾如果写的是 --source br0 ,则是设置网络模式为桥接,和VMware里的桥接模式一样。--source是用于指定桥接到哪一块网卡上。

例如我们也可以桥接到br0上:

virsh attach-interface awei-01 --type bridge  --source br0

[root@awei-01 ~]# virsh attach-interface awei-01 --type bridge  --source br0
成功附加接口

[root@awei-01 ~]# virsh domiflist awei-01
接口     类型     源        型号      MAC
-------------------------------------------------------
vnet1      bridge     br0        virtio      52:54:00:b2:43:c4
vnet2      bridge     virbr0     rtl8139     52:54:00:fc:9a:ae
vnet3      bridge     br0        rtl8139     52:54:00:8f:7f:cb

[root@awei-01 ~]#


15.迁移虚拟机


该方式要确保虚拟机是关机状态

virsh shutdown awei-01

然后通过rsync命令将配置文件拷贝到另一台机器上:

[root@awei-01 ~]# rsync -av /etc/libvirt/qemu/awei-01.xml 192.168.77.128:/etc/libvirt/qemu/awei-01.xml

接着将虚拟机的磁盘文件也拷贝到另一台机器上:

[root@awei-01 ~]# virsh domblklist awei-01 ##查看虚拟机磁盘所在目录
目标     源
------------------------------------------------
vda        /kvm_data/awei-01.img
hda        -
[root@awei-01 ~]# rsync -av /kvm_data/awei-01.img  192.168.77.128:/kvm_data/awei-01.img


最后就是在另一台机器上根据实际情况修改虚拟机的配置文件,例如虚拟机的名称要对得上,虚拟磁盘文件路径要对得上等等,因为我这里两台机器的环境都是一样的,所以就不需要修改配置文件了,直接定义新虚拟机即可。以下这条命令在另一台机器上执行:

[root@awei-01 ~]# virsh define /etc/libvirt/qemu/awei-01.xml


修改磁盘路径

virsh define /etc/libvirt/qemu/aminglinux03.xml //定义新虚拟机

virsh list --all   //会发现新迁移的aminglinux03子机