第5章 KVM存储管理
KVM支持多种存储格式和管理方式,本章将详细介绍磁盘格式、磁盘管理操作和快照功能。
磁盘格式介绍
KVM支持多种虚拟磁盘格式,每种格式都有其特点和适用场景。
主要磁盘格式对比
格式 | 特点 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|
raw | 原始格式 | 性能最佳 简单可靠 | 不支持快照 占用空间大 | 高性能要求 数据库服务器 |
qcow2 | QEMU写时复制 | 支持快照 支持压缩 动态分配 | 性能略低于raw | 通用场景 开发测试环境 |
qed | QEMU增强磁盘 | 性能优于qcow2 | 功能较少 | 需要性能又要节省空间 |
vmdk | VMware格式 | 兼容VMware | 性能一般 | 虚拟机迁移 |
vdi | VirtualBox格式 | 兼容VirtualBox | KVM支持有限 | 虚拟机迁移 |
选择建议
- 生产环境:推荐使用raw格式,获得最佳性能
- 开发测试:推荐使用qcow2格式,便于快照和克隆
- 虚拟机迁移:根据源平台选择相应格式
磁盘管理操作
查看磁盘信息
# 查看磁盘详细信息
qemu-img info /data/centos7.raw
# 输出示例:
# image: /data/centos7.raw
# file format: raw
# virtual size: 10G (10737418240 bytes)
# disk size: 1.4G
# 查看qcow2格式磁盘
qemu-img info /data/centos7.qcow2
# 输出示例:
# image: /data/centos7.qcow2
# file format: qcow2
# virtual size: 10G (10737418240 bytes)
# disk size: 1.4G
# cluster_size: 65536
# Format specific information:
# compat: 1.1
# lazy refcounts: false
创建磁盘
# 创建raw格式磁盘
qemu-img create -f raw /data/disk1.raw 20G
# 创建qcow2格式磁盘
qemu-img create -f qcow2 /data/disk1.qcow2 20G
# 创建预分配空间的qcow2磁盘(提高性能)
qemu-img create -f qcow2 -o preallocation=metadata /data/disk2.qcow2 20G
# 创建压缩的qcow2磁盘
qemu-img create -f qcow2 -o compression_type=zstd /data/disk3.qcow2 20G
调整磁盘容量
重要提示
磁盘容量只能增加,不能减少。调整前请确保虚拟机已关闭或磁盘已卸载。
# 增加磁盘容量
qemu-img resize /data/disk1.qcow2 +10G
# 设置磁盘为指定大小
qemu-img resize /data/disk1.qcow2 30G
# 查看调整后的大小
qemu-img info /data/disk1.qcow2
虚拟机内部扩展分区:
# 对于ext4文件系统
resize2fs /dev/vdb
# 对于xfs文件系统
xfs_growfs /dev/vdb
# 如果是分区,可能需要先扩展分区表
fdisk /dev/vdb # 删除并重建分区,保持起始位置不变
partprobe # 重新读取分区表
磁盘格式转换
# raw转qcow2
qemu-img convert -f raw -O qcow2 /data/centos7.raw /data/centos7.qcow2
# qcow2转raw
qemu-img convert -f qcow2 -O raw /data/centos7.qcow2 /data/centos7.raw
# 转换时压缩(仅适用于qcow2)
qemu-img convert -c -f raw -O qcow2 /data/centos7.raw /data/centos7-compressed.qcow2
# 查看转换进度
qemu-img convert -p -f raw -O qcow2 /data/centos7.raw /data/centos7.qcow2
转换后修改虚拟机配置:
# 1. 关闭虚拟机
virsh shutdown centos7
# 2. 编辑配置文件
virsh edit centos7
# 3. 修改磁盘配置
# 原配置:
# <driver name='qemu' type='raw'/>
# <source file='/data/centos7.raw'/>
#
# 改为:
# <driver name='qemu' type='qcow2'/>
# <source file='/data/centos7.qcow2'/>
# 4. 启动虚拟机
virsh start centos7
磁盘检查和修复
# 检查qcow2磁盘
qemu-img check /data/centos7.qcow2
# 修复qcow2磁盘(-r all表示修复所有错误)
qemu-img check -r all /data/centos7.qcow2
# 输出示例:
# No errors were found on the image.
# Image end offset: 1234567890
快照管理
快照功能允许保存虚拟机在某个时间点的状态,便于测试和恢复。
快照类型
- 内部快照:快照数据存储在qcow2文件内部
- 外部快照:快照数据存储在独立文件中
- 实时快照:虚拟机运行时创建(包含内存状态)
- 磁盘快照:仅保存磁盘状态
创建快照
# 创建内部快照(需要qcow2格式)
virsh snapshot-create-as centos7 --name "initial-setup" \
--description "系统初始安装完成"
# 创建包含内存的快照(虚拟机运行中)
virsh snapshot-create-as centos7 --name "before-update" \
--description "系统更新前备份" --memspec file=/tmp/centos7-mem.img
# 创建磁盘快照(虚拟机关闭状态)
virsh snapshot-create-as centos7 --name "disk-only" \
--description "仅磁盘快照" --disk-only
查看快照
# 列出所有快照
virsh snapshot-list centos7
# 输出示例:
# 名称 生成时间 状态
# ------------------------------------------------------------
# initial-setup 2024-01-10 10:30:15 +0800 shutoff
# before-update 2024-01-11 14:20:30 +0800 running
# 查看快照详细信息
virsh snapshot-info centos7 --snapshotname initial-setup
# 查看当前快照
virsh snapshot-current centos7
# 查看快照树形结构
virsh snapshot-list centos7 --tree
管理快照
# 切换到指定快照
virsh snapshot-revert centos7 --snapshotname initial-setup
# 删除快照
virsh snapshot-delete centos7 --snapshotname before-update
# 重命名快照(需要编辑XML)
virsh snapshot-dumpxml centos7 initial-setup > snapshot.xml
# 编辑snapshot.xml中的name
virsh snapshot-create centos7 snapshot.xml --redefine
外部快照(高级)
外部快照适合大型虚拟机,可以更灵活地管理存储:
# 创建外部快照
virsh snapshot-create-as centos7 \
--name external-snap \
--diskspec vda,file=/data/snapshots/centos7-snap1.qcow2 \
--disk-only --atomic
# 查看快照链
qemu-img info --backing-chain /data/snapshots/centos7-snap1.qcow2
# 合并快照(blockcommit)
virsh blockcommit centos7 vda --active --pivot
存储池管理
存储池提供了统一的存储管理接口。
查看存储池
# 列出所有存储池
virsh pool-list --all
# 查看存储池信息
virsh pool-info default
# 查看存储池中的卷
virsh vol-list default
创建存储池
# 创建目录类型存储池
mkdir -p /data/kvm-pool
virsh pool-define-as data-pool dir - - - - "/data/kvm-pool"
virsh pool-build data-pool
virsh pool-start data-pool
virsh pool-autostart data-pool
# 创建LVM存储池
virsh pool-define-as lvm-pool logical - - /dev/vg_kvm volgroup
virsh pool-start lvm-pool
virsh pool-autostart lvm-pool
# 创建NFS存储池
virsh pool-define-as nfs-pool netfs - - nfs-server:/export/kvm /mnt/kvm-nfs
virsh pool-start nfs-pool
存储卷管理
# 在存储池中创建卷
virsh vol-create-as data-pool test-vol.qcow2 10G --format qcow2
# 克隆存储卷
virsh vol-clone --pool data-pool centos7.qcow2 centos7-clone.qcow2
# 删除存储卷
virsh vol-delete --pool data-pool test-vol.qcow2
# 上传ISO到存储池
virsh vol-create-as default centos7.iso 4G --format raw
virsh vol-upload --pool default centos7.iso /path/to/centos7.iso
性能优化建议
磁盘I/O优化
-
选择合适的缓存模式
<!-- 在虚拟机XML中配置 -->
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='none' io='native'/>
<source file='/data/centos7.qcow2'/>
<target dev='vda' bus='virtio'/>
</disk>缓存模式说明:
none
:最佳性能,直接I/Owritethrough
:安全但性能较低writeback
:性能好但可能丢数据directsync
:类似none但更安全unsafe
:最高性能但最不安全
-
使用virtio驱动
# 确保使用virtio总线
--disk path=/data/vm.qcow2,bus=virtio -
I/O线程优化
<iothreads>4</iothreads>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' iothread='1'/>
</disk>
存储最佳实践
生产环境建议
- 使用独立的存储设备:避免与系统盘竞争I/O
- 定期进行磁盘碎片整理:
qemu-img convert
可以整理碎片 - 监控磁盘使用率:避免存储空间不足
- 定期备份重要虚拟机:结合快照和备份策略
- 使用thin provisioning:按需分配存储空间
故障排查
磁盘性能问题
# 在虚拟机内测试磁盘性能
dd if=/dev/zero of=/tmp/test bs=1G count=1 oflag=direct
# 使用fio进行详细测试
fio --name=randwrite --ioengine=libaio --rw=randwrite \
--bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60
快照相关问题
-
错误:不支持快照
- 原因:使用了raw格式磁盘
- 解决:转换为qcow2格式
-
快照创建失败
- 检查磁盘空间
- 检查文件权限
- 查看libvirt日志
-
快照恢复失败
# 检查快照状态
virsh snapshot-info centos7 --snapshotname snap1
# 手动恢复(谨慎操作)
virsh destroy centos7
cp /backup/centos7.qcow2 /data/centos7.qcow2
virsh start centos7
总结
本章介绍了KVM存储管理的核心功能:
- ✅ 磁盘格式特点和选择策略
- ✅ 磁盘创建、调整、转换等操作
- ✅ 快照的创建、管理和恢复
- ✅ 存储池和存储卷管理
- ✅ 性能优化和故障排查
合理的存储管理是虚拟化环境稳定运行的基础。下一章将介绍虚拟机克隆技术。