前面学习了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 关闭
迁移完成!