前面学习了kvm虚拟化的一些基础操作,本节整理一下kvm快照、扩容等等相关的内容。

克隆虚拟机

  • 克隆之前需要先关闭虚拟机:
$ virsh shutdown vm01
  • 克隆
$ virt-clone --original vm01 --name vm02 --file /kvm_data/vm02.img

# 参数解读:
--original:指定被克隆的源虚拟机名称
--name:指定克隆后的虚拟机名字
--file:指定目标虚拟机的虚拟磁盘文件

# 更多参数,详见:
$ virt-clone --help
  • 查看:
$ virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     vm01                           关闭
 -     vm02                           关闭

快照管理

快照管理相关命令:

$ virsh  snapshot-
snapshot-create     snapshot-current    snapshot-dumpxml    snapshot-info       snapshot-parent     
snapshot-create-as  snapshot-delete     snapshot-edit       snapshot-list       snapshot-revert

创建快照

$ virsh snapshot-create vm01
已生成域快照 1552808803   (速度很快)

创建完快照后可以通过以下命令查看虚拟硬盘的信息:

$ qemu-img info /kvm_data/vm01.img 
image: /kvm_data/vm01.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         1552808803                0 2019-03-17 15:46:43   00:00:00.000
Format specific information:
    compat: 1.1
    lazy refcounts: true

注意,此处可以查看到快照的相关信息。

查看快照

  • 列出某虚拟机的所有快照
$ virsh snapshot-list vm01
  • 查看当前快照版本信息
$ virsh snapshot-current vm01
  • 查看所有快照配置文件
$ ls /var/lib/libvirt/qemu/snapshot/vm01/

恢复及删除快照

  • 恢复某虚拟机的快照
$ virsh snapshot-revert vm01 1552808803
  • 删除某虚拟机的某个快照
$ virsh snapshot-delete vm01 1552808803

虚拟磁盘格式

虚拟磁盘常用格式:raw、qcow2

虚拟机默认磁盘格式为qcow2——支持创建快照;还有一种格式——raw,不支持创建快照。

  • 创建raw格式的磁盘,大小为2G
$ qemu-img create -f raw /kvm_data/vm01_2.img 2G 
Formatting '/kvm_data/vm01_2.img', fmt=raw size=2147483648
  • 查看磁盘
$ qemu-img info /kvm_data/vm01_2.img 
image: /kvm_data/vm01_2.img
file format: raw
virtual size: 2.0G (2147483648 bytes)
disk size: 0
  • 把raw格式的磁盘转换为qcow2格式
$ qemu-img convert -O qcow2 /kvm_data/vm01_2.img  /kvm_data/vm01_2.qcow2

$ ls -lh vm01_*
-rw-r--r-- 1 root root 2.0G 3月  17 16:12 vm01_2.img
-rw-r--r-- 1 root root 193K 3月  17 16:16 vm01_2.qcow2

$ du -sh *
0	vm01_2.img
196K	vm01_2.qcow2

$ qemu-img info /kvm_data/vm01_2.qcow2 
image: /kvm_data/vm01_2.qcow2
file format: qcow2
virtual size: 2.0G (2147483648 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

更改某虚拟机的磁盘格式

$ virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     vm01                           关闭
 -     vm02                           关闭

更换vm02的磁盘格式,首先在执行操作之前需要先关闭虚拟机。

  • 在vm02的基础上创建一个raw格式的磁盘
$ qemu-img convert -O raw /kvm_data/vm02.img /kvm_data/vm02_1.raw
  • 编辑vm02虚拟机的配置文件
$ virsh edit vm02 
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>  # 更改磁盘镜像类型为 raw
      <source file='/kvm_data/vm02_1.raw'/> # 指定磁盘镜像的位置
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>

说明:使用该命令编辑配置文件等同于 vim /etc/libvirt/qemu/vm02.xml ,好处是该命令本身可以对更改后的文件进行语法检测,类似于 visudo

  • 启动 vm02 虚拟机
$ virsh start vm02 
域 vm02 已开始

$ virsh list
 Id    名称                         状态
----------------------------------------------------
 5     vm02                           running

$ ls -lh
总用量 4.0G
-rw------- 1 root root  11G 3月  17 15:46 vm01.img
-rw-r--r-- 1 qemu qemu  10G 3月  17 16:38 vm02_1.raw  # 被使用的磁盘属主属组为 qemu
-rw------- 1 root root 1.4G 3月  17 16:24 vm02.img
  • 创建快照
$ virsh snapshot-create vm02 
错误:不支持的配置:存储类型 vda 不支持磁盘 raw 的内部快照

即,raw格式磁盘不支持创建快照!

磁盘扩容

扩容raw格式磁盘

$ qemu-img resize /kvm_data/vm02_1.raw +2G 

$  ls -lh
总用量 4.0G
-rw------- 1 root root  11G 3月  23 08:22 vm01.img
-rw-r--r-- 1 root root  12G 3月  23 08:24 vm02_1.raw
-rw------- 1 root root 1.4G 3月  17 16:24 vm02.img

$ qemu-img info vm02_1.raw 
image: vm02_1.raw
file format: raw
virtual size: 12G (12884901888 bytes)
disk size: 1.3G

磁盘扩容后只有在宿主机重启该虚拟机后才可以生效。

注意: 此时新增加的2G并没有被利用,需要对新加的2G重新分区才可以(新增一个分区,分配2G空间,不损坏之前已有分区)。

额外增加磁盘

由上可知,该办法并不是很友好,于是,采用另外一个办法——额外增加磁盘,也可以达到扩容的目的,如下:

  • 创建一块虚拟磁盘
$  qemu-img create -f raw /kvm_data/vm02_2.raw 5G
  • 修改对应虚拟机的配置文件(为虚拟机添加一块虚拟磁盘)
$ virsh edit vm02
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/kvm_data/vm02_1.raw'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/kvm_data/vm02_2.raw'/>
      <target dev='vdb' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
    </disk>
# 说明:
## 复制配置文件中第一块 <disk...>...</disk>
## 更改 source 为新创建的虚拟磁盘
## 保证 target<dev=>、address<slot=> 中磁盘名称和磁盘槽位(slot)与原有磁盘不同且没被占用
  • 重启vm02虚拟机
$ virsh shutdown vm02
$ virsh start vm02
$ virsh console vm02
  • 查看虚拟机信息:此时多了一块磁盘vdb(5G)
$ fdisk -l
磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000c9c55

   设备 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

磁盘 /dev/vdb:5368 MB, 5368709120 字节,10485760 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

然后对新加磁盘进行格式化、分区、挂载即可完成扩容!!!

扩容qcow2格式磁盘

  • 查看虚拟机磁盘信息
$ qemu-img info vm01.img 
image: vm01.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.4G
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         1552808803                0 2019-03-17 15:46:43   00:00:00.000
Format specific information:
    compat: 1.1
    lazy refcounts: true
  • 扩容:报错
$ qemu-img resize /kvm_data/vm01.img +2G
qemu-img: Can't resize an image which has snapshots  # 存在快照,不能resize,需要删除快照
qemu-img: This image does not support resize
  • 删除快照再扩容
$ virsh snapshot-delete vm01 1552808803
$ qemu-img resize /kvm_data/vm01.img +2G
  • 重启vm01
$ virsh shutdown vm01
$ virsh start vm01
$ virsh console vm01
  • 查看vm01磁盘信息
$ df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/vda3       8.0G  1.1G  7.0G   13% /
devtmpfs        486M     0  486M    0% /dev
tmpfs           496M     0  496M    0% /dev/shm
tmpfs           496M  6.7M  489M    2% /run
tmpfs           496M     0  496M    0% /sys/fs/cgroup
/dev/vda1      1014M  126M  889M   13% /boot
tmpfs            48M     0   48M    0% /run/user/0

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

   设备 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磁盘并没有被使用,需要对这2G增加分区并挂载。

额外增加磁盘

同样该方法比较不友好,可以通过重新添加虚拟磁盘的方法(同raw格式)达到扩容的目的!

$  qemu-img create -f qcow2 /kvm_data/vm01_1.qcow 5G
$ virsh edit vm01
	<disk...>
	...
	<source ...file=..>
	<target ...dev=..>
	<address ...slot=..>
	</disk>

重启vm01,并对新磁盘进行格式化、分区、挂载。

调整CPU、内存和网卡

通过配置文件更改CPU、内存

  • 查看一个虚拟机的配置信息、
$ virsh dominfo vm01
Id:             -
名称:       vm01
UUID:           5d9d873f-0286-4ada-8e83-f2881b6ad1da
OS 类型:    hvm
状态:       关闭
CPU:          1
最大内存: 1048576 KiB
使用的内存: 524288 KiB
持久:       是
自动启动: 启用
管理的保存: 否
安全性模式: none
安全性 DOI: 0

如果想看到更详细的信息,可以查看其配置文件。

  • 更改内存、CPU配置
$ virsh edit vm01
  <currentMemory unit='KiB'>624288</currentMemory>  # 由524288改为624288
  <vcpu placement='static' current='2'>2</vcpu>  # 由current='1'改为current='2'
  • 重启虚拟机vm01生效
$ virsh start vm01
$ virsh dominfo vm01
Id:             5
名称:       vm01
UUID:           5d9d873f-0286-4ada-8e83-f2881b6ad1da
OS 类型:    hvm
状态:       running
CPU:          2
CPU 时间:   21.6s
最大内存: 1048576 KiB
使用的内存: 624288 KiB
持久:       是
自动启动: 启用
管理的保存: 否
安全性模式: none
安全性 DOI: 0

$ virsh console vm01
  • 查看虚拟机内置信息
$ free -h
              total        used        free      shared  buff/cache   available
Mem:           576M         84M        377M        6.6M        114M        349M
Swap:          1.0G          0B        1.0G

$ cat /proc/cpuinfo  |grep processor
processor	: 0
processor	: 1

即,内存由512变为576;CPU为2核。

动态调整

  • 调整内存
$ virsh setmem vm01 800m
$ virsh dominfo vm01
Id:             5
名称:       vm01
UUID:           5d9d873f-0286-4ada-8e83-f2881b6ad1da
OS 类型:    hvm
状态:       running
CPU:          2
CPU 时间:   23.9s
最大内存: 1048576 KiB
使用的内存: 819200 KiB
持久:       是
自动启动: 启用
管理的保存: 否
安全性模式: none
安全性 DOI: 0

# 登陆虚拟机查看
$ virsh console vm01
$ free -h
              total        used        free      shared  buff/cache   available
Mem:           767M         84M        567M        6.6M        115M        540M
Swap:          1.0G          0B        1.0G

# 减少内存——生产环境不用
$ virsh setmem vm01 512m
$ virsh dominfo vm01
Id:             5
名称:       vm01
UUID:           5d9d873f-0286-4ada-8e83-f2881b6ad1da
OS 类型:    hvm
状态:       running
CPU:          2
CPU 时间:   25.9s
最大内存: 1048576 KiB
使用的内存: 524288 KiB
持久:       是
自动启动: 启用
管理的保存: 否
安全性模式: none
安全性 DOI: 0
  • 调整CPU
virsh setvcpus vm01 1
错误:不支持的配置:failed to find appropriate hotpluggable vcpus to reach the desired target vcpu count  # 即,不支持减小CPU核数

$ virsh setvcpus vm01 2
  • 调整网卡
# 查看网卡信息
$ virsh domiflist vm01
接口     类型     源        型号      MAC
-------------------------------------------------------
vnet0      bridge     br0        virtio      52:54:00:3c:9d:4b

# 添加网卡
$ virsh attach-interface vm01 --type bridge --source virbr0
$ virsh domiflist vm01
接口     类型     源        型号      MAC
-------------------------------------------------------
vnet0      bridge     br0        virtio      52:54:00:3c:9d:4b
vnet1      bridge     virbr0     rtl8139     52:54:00:77:2e:c2

$ virsh attach-interface vm01 --type bridge --source br0
成功附加接口

$ virsh domiflist vm01
接口     类型     源        型号      MAC
-------------------------------------------------------
vnet0      bridge     br0        virtio      52:54:00:3c:9d:4b
vnet1      bridge     virbr0     rtl8139     52:54:00:77:2e:c2
vnet2      bridge     br0        rtl8139     52:54:00:e1:6d:cd


$ virsh console vm01
# 查看网卡信息
$ ifconfig
ens9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.122.47  netmask 255.255.255.0  broadcast 192.168.122.255
        inet6 fe80::e039:1f3f:dc88:f52  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:77:2e:c2  txqueuelen 1000  (Ethernet)
        RX packets 42  bytes 3843 (3.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 51  bytes 5234 (5.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens10: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.180.132  netmask 255.255.255.0  broadcast 172.16.180.255
        inet6 fe80::c4ce:485a:752a:f410  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:e1:6d:cd  txqueuelen 1000  (Ethernet)
        RX packets 10  bytes 1030 (1.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 16  bytes 1984 (1.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 52:54:00:3c:9d:4b  txqueuelen 1000  (Ethernet)
        RX packets 28  bytes 2882 (2.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

以上动态调整如果要永久生效,最好保存到配置文件中:

$ virsh dumpxml vm01 > /etc/libvirt/qemu/vm01.xml

Note: 只有在创建虚拟机的时候指定了虚拟机最大内存、最大CPU数量才能对其进行动态调整,且不能超出最大值。

迁移虚拟机

迁移,即将虚拟机的配置文件(.xml)和数据文件(.img)从A机器拷贝到B机器。

迁移之前需要先停止虚拟机!

本次试验在同一台机器进行!

  • 迁移配置文件(如果是远程机器,需要将该配置文件scp到远程机器上)
$ virsh dumpxml vm01 > /etc/libvirt/qemu/vm03.xml
  • 查看源虚拟机磁盘位置
virsh domblklist vm01
目标     源
------------------------------------------------
vda        /kvm_data/vm01.img
hda        -
  • 迁移数据文件(如果是远程机器,需要将该文件同步到远程机器上)
$ rsync -av /kvm_data/vm01.img /kvm_data/vm03.img
  • 修改配置文件 (远程机器迁移忽略这一步)
$ vim /etc/libvirt/qemu/vm03.xml  # 因为是本地拷贝,vm03使用的是vm01的配置,所以会有冲突
  <name>vm03</name>
  <uuid>5d9d375f-0286-4ada-8e83-f2881b6ad1da</uuid> # 随便改数字,位数不要变
  ...
  <source file='/kvm_data/vm03.img'/>
  • 定义新虚拟主机
$  virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     vm01                           关闭
 -     vm02                           关闭

$ virsh define /etc/libvirt/qemu/vm03.xml 
定义域 vm03(从 /etc/libvirt/qemu/vm03.xml

$ virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     vm01                           关闭
 -     vm02                           关闭
 -     vm03                           关闭

迁移完成!