前面学习了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 关闭
快照管理
快照管理相关命令:
代码语言:javascript复制$ virsh snapshot-
snapshot-create snapshot-current snapshot-dumpxml snapshot-info snapshot-parent
snapshot-create-as snapshot-delete snapshot-edit snapshot-list snapshot-revert
创建快照
代码语言:javascript复制$ virsh snapshot-create vm01
已生成域快照 1552808803 (速度很快)
创建完快照后可以通过以下命令查看虚拟硬盘的信息:
代码语言:javascript复制$ 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
更改某虚拟机的磁盘格式
代码语言:javascript复制$ 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格式磁盘
代码语言:javascript复制$ 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格式)达到扩容的目的!
代码语言:javascript复制$ 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
以上动态调整如果要永久生效,最好保存到配置文件中:
代码语言:javascript复制$ 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 关闭
迁移完成!
代码语言:txt复制 (adsbygoogle = window.adsbygoogle || []).push({});