跳到主要内容

第5章 KVM存储管理

KVM支持多种存储格式和管理方式,本章将详细介绍磁盘格式、磁盘管理操作和快照功能。

磁盘格式介绍

KVM支持多种虚拟磁盘格式,每种格式都有其特点和适用场景。

主要磁盘格式对比

格式特点优点缺点适用场景
raw原始格式性能最佳
简单可靠
不支持快照
占用空间大
高性能要求
数据库服务器
qcow2QEMU写时复制支持快照
支持压缩
动态分配
性能略低于raw通用场景
开发测试环境
qedQEMU增强磁盘性能优于qcow2功能较少需要性能又要节省空间
vmdkVMware格式兼容VMware性能一般虚拟机迁移
vdiVirtualBox格式兼容VirtualBoxKVM支持有限虚拟机迁移
选择建议
  • 生产环境:推荐使用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优化

  1. 选择合适的缓存模式

    <!-- 在虚拟机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/O
    • writethrough:安全但性能较低
    • writeback:性能好但可能丢数据
    • directsync:类似none但更安全
    • unsafe:最高性能但最不安全
  2. 使用virtio驱动

    # 确保使用virtio总线
    --disk path=/data/vm.qcow2,bus=virtio
  3. I/O线程优化

    <iothreads>4</iothreads>
    <disk type='file' device='disk'>
    <driver name='qemu' type='qcow2' iothread='1'/>
    </disk>

存储最佳实践

生产环境建议
  1. 使用独立的存储设备:避免与系统盘竞争I/O
  2. 定期进行磁盘碎片整理qemu-img convert可以整理碎片
  3. 监控磁盘使用率:避免存储空间不足
  4. 定期备份重要虚拟机:结合快照和备份策略
  5. 使用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

快照相关问题

  1. 错误:不支持快照

    • 原因:使用了raw格式磁盘
    • 解决:转换为qcow2格式
  2. 快照创建失败

    • 检查磁盘空间
    • 检查文件权限
    • 查看libvirt日志
  3. 快照恢复失败

    # 检查快照状态
    virsh snapshot-info centos7 --snapshotname snap1

    # 手动恢复(谨慎操作)
    virsh destroy centos7
    cp /backup/centos7.qcow2 /data/centos7.qcow2
    virsh start centos7

总结

本章介绍了KVM存储管理的核心功能:

  • ✅ 磁盘格式特点和选择策略
  • ✅ 磁盘创建、调整、转换等操作
  • ✅ 快照的创建、管理和恢复
  • ✅ 存储池和存储卷管理
  • ✅ 性能优化和故障排查

合理的存储管理是虚拟化环境稳定运行的基础。下一章将介绍虚拟机克隆技术。