1
0
wiki/FormalSciences/ComputerScience/OperatingSystem/Virtualization/2.KVM/5. KVM 存储管理.md
2024-10-13 20:52:05 +08:00

692 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 5. KVM 存储管理
description: 本文深入探讨了KVM虚拟化环境中的存储管理涵盖了磁盘映像文件、逻辑卷管理LVM、网络存储NFS、iSCSI的配置方法以及存储池和存储卷的创建与管理。
keywords:
- KVM
- 存储管理
- 磁盘映像文件
- LVM
- 网络存储
- 存储池
- 存储卷
tags:
- 技术/操作系统
- 虚拟化/KVM
author: 仲平
date: 2024-07-16
---
## KVM 存储
### 存储概念
KVMKernel-based Virtual Machine存储是指在 KVM 虚拟化环境中为虚拟机提供的存储资源。KVM 支持多种存储类型包括磁盘映像文件、逻辑卷管理LVM和网络存储。虚拟机的存储设备可以像物理机的硬盘一样使用并且可以通过不同的存储格式和协议进行管理和访问。
### 虚拟机存储类型
#### 磁盘映像文件qcow2, raw
| 类型 | 特点 | 使用场景 |
| ---------------------------------------- | ------------------------------------------------------------ | ------------------------------------ |
| **qcow2** (QEMU Copy On Write version 2) | 支持动态分配、快照、压缩和加密。磁盘空间在实际使用时才分配,可以节省存储空间。 | 适合需要多快照和动态存储分配的环境。 |
| **raw** | 不支持快照、压缩和加密,直接映射磁盘数据。性能更高,适合需要最大化性能的场景。 | 适合高性能需求和简单存储管理的环境。 |
#### 其他常见磁盘映像文件类型
| 类型 | 特点 | 使用场景 |
| -------------------------------- | ------------------------------------------------------------ | --------------------------------------------- |
| **qcow** (QEMU Copy On Write) | qcow2 的前身,支持动态分配和快照,但性能和功能不及 qcow2。 | 已有 qcow 格式的旧环境。 |
| **vmdk** (Virtual Machine Disk) | 主要用于 VMware 虚拟机,可以兼容 KVM。支持多种虚拟磁盘格式和快照。 | 需要在 KVM 和 VMware 之间进行迁移的环境。 |
| **vdi** (Virtual Disk Image) | 主要用于 Oracle VirtualBox 虚拟机,可以兼容 KVM。支持动态分配和快照。 | 需要在 KVM 和 VirtualBox 之间进行迁移的环境。 |
| **vhd/vhdx** (Virtual Hard Disk) | 主要用于 Microsoft Hyper-V 虚拟机,可以兼容 KVM。vhdx 是 vhd 的改进版本,支持更大容量和更高性能。 | 需要在 KVM 和 Hyper-V 之间进行迁移的环境。 |
#### 逻辑卷管理LVM
逻辑卷管理LVM提供灵活的存储管理可以动态调整逻辑卷大小、快照和卷组管理。性能较高适合企业级应用和需要高性能、灵活存储管理的环境。
1. 创建物理卷和卷组:
```shell
sudo pvcreate /dev/sdX
sudo vgcreate vg_kvm /dev/sdX
```
2. 创建逻辑卷:
```shell
sudo lvcreate -n lv_myvm -L 20G vg_kvm
```
#### 网络存储NFS, iSCSI
NFSNetwork File System通过网络共享文件系统适合共享存储和集中存储管理以及多台虚拟机需要共享同一存储资源的环境。
挂载 NFS 存储:
```shell
sudo mount -t nfs server:/path/to/nfs /mnt/nfs
```
**iSCSIInternet Small Computer Systems Interface**
通过网络提供块级存储,适合高性能需求的存储应用,以及需要集中管理和高性能存储访问的环境。
1. 安装 iSCSI 客户端:
```shell
sudo apt install open-iscsi # Ubuntu
sudo yum install iscsi-initiator-utils # CentOS/RHEL
```
1. 发现和登录 iSCSI 目标:
```shell
sudo iscsiadm -m discovery -t sendtargets -p <iSCSI_server_IP>
sudo iscsiadm -m node --login
```
### 配置系统存储支持
#### 确认存储驱动加载情况
1. **检查存储驱动**
使用 `lsmod` 命令检查存储驱动是否加载:
```shell
lsmod | grep -E 'virtio_blk|virtio_scsi'
```
2. **加载存储驱动**
如果存储驱动未加载,可以手动加载:
```shell
sudo modprobe virtio_blk
sudo modprobe virtio_scsi
```
#### 准备存储设备和挂载点
1. **准备本地存储设备**
分区和格式化存储设备:
```shell
sudo fdisk /dev/sdX
sudo mkfs.ext4 /dev/sdX1
```
创建挂载点并挂载:
```shell
sudo mkdir -p /mnt/kvm_storage
sudo mount /dev/sdX1 /mnt/kvm_storage
```
2. **准备网络存储设备NFS 例子)**
安装 NFS 客户端:
```shell
sudo apt install nfs-common # Ubuntu
sudo yum install nfs-utils # CentOS/RHEL
```
挂载 NFS 共享:
```shell
sudo mkdir -p /mnt/nfs_storage
sudo mount -t nfs server:/path/to/nfs /mnt/nfs_storage
```
3. **配置自动挂载**
编辑 `/etc/fstab` 文件,添加以下内容确保重启后自动挂载:
```text
/dev/sdX1 /mnt/kvm_storage ext4 defaults 0 2
server:/path/to/nfs /mnt/nfs_storage nfs defaults 0 0
```
通过以上步骤,可以为 KVM 环境配置各种存储支持包括磁盘映像文件、LVM 和网络存储。确保存储驱动已加载,并准备好存储设备和挂载点,为虚拟机提供可靠的存储资源。
## 配置存储池
### 存储池是什么
#### 存储池的概念
存储池Storage Pool是 KVM 虚拟化环境中的一种抽象概念用于管理和组织底层存储资源。存储池可以包含多个存储卷Storage Volume每个存储卷对应虚拟机的一个磁盘映像文件、逻辑卷或网络存储块。通过存储池管理员可以更方便地管理和分配存储资源。
#### 存储池的类型
| 类型 | 特点 | 使用场景 |
| --------------------------------------- | ------------------------------------------------------------ | ------------------------------ |
| **目录存储池** (Directory Storage Pool) | 使用本地或挂载的目录作为存储池。简单易用,适合中小型部署。 | 适合中小型部署。 |
| **逻辑卷存储池** (LVM Storage Pool) | 基于 LVMLogical Volume Manager创建和管理逻辑卷。提供灵活的卷管理和快照功能。 | 适合企业级部署。 |
| **网络存储池** (Network Storage Pool) | 使用网络存储协议(如 NFS、iSCSI创建存储池。适合分布式存储和集中存储管理。 | 适合分布式存储和集中存储管理。 |
### 创建和管理目录存储池
#### 使用 `virsh` 创建目录存储池
1. **创建目录存储池**
创建一个目录存储池的 XML 配置文件,例如 `dir-pool.xml`
```xml
<pool type='dir'>
<name>dir-pool</name>
<target>
<path>/mnt/kvm_storage</path>
</target>
</pool>
```
2. **定义并启动存储池**
使用 `virsh` 命令定义并启动目录存储池:
```shell
sudo virsh pool-define dir-pool.xml
sudo virsh pool-start dir-pool
sudo virsh pool-autostart dir-pool
```
#### 配置目录存储池
1. **查看存储池信息**
```shell
sudo virsh pool-info dir-pool
```
2. **查看存储池中的存储卷**
```shell
sudo virsh vol-list dir-pool
```
3. **创建存储卷**
```shell
sudo virsh vol-create-as dir-pool volume1 10G
```
### 创建和管理逻辑卷存储池
#### 使用 `virsh` 创建 LVM 存储池
1. **创建 LVM 存储池**
创建一个 LVM 存储池的 XML 配置文件,例如 `lvm-pool.xml`
```xml
<pool type='logical'>
<name>lvm-pool</name>
<source>
<device path='/dev/vg_kvm'/>
<name>vg_kvm</name>
<format type='lvm2'/>
</source>
<target>
<path>/dev/vg_kvm</path>
</target>
</pool>
```
2. **定义并启动存储池**
使用 `virsh` 命令定义并启动 LVM 存储池:
```shell
sudo virsh pool-define lvm-pool.xml
sudo virsh pool-start lvm-pool
sudo virsh pool-autostart lvm-pool
```
#### 配置 LVM 存储池
1. **查看存储池信息**
```shell
sudo virsh pool-info lvm-pool
```
2. **查看存储池中的存储卷**
```shell
sudo virsh vol-list lvm-pool
```
3. **创建存储卷**
```shell
sudo virsh vol-create-as lvm-pool lv_volume1 20G
```
### 创建和管理网络存储池
#### 使用 `virsh` 创建 NFS 存储池
1. **创建 NFS 存储池**
创建一个 NFS 存储池的 XML 配置文件,例如 `nfs-pool.xml`
```xml
<pool type='netfs'>
<name>nfs-pool</name>
<source>
<host name='nfs-server'/>
<dir path='/path/to/nfs'/>
</source>
<target>
<path>/mnt/nfs_storage</path>
</target>
</pool>
```
2. **定义并启动存储池**
使用 `virsh` 命令定义并启动 NFS 存储池:
```shell
sudo virsh pool-define nfs-pool.xml
sudo virsh pool-start nfs-pool
sudo virsh pool-autostart nfs-pool
```
#### 使用 `virsh` 创建 iSCSI 存储池
1. **创建 iSCSI 存储池**
创建一个 iSCSI 存储池的 XML 配置文件,例如 `iscsi-pool.xml`
```xml
<pool type='iscsi'>
<name>iscsi-pool</name>
<source>
<host name='iscsi-server'/>
<device path='/dev/sdX'/>
</source>
<target>
<path>/dev/disk/by-path/</path>
</target>
</pool>
```
2. **定义并启动存储池**
使用 `virsh` 命令定义并启动 iSCSI 存储池:
```shell
sudo virsh pool-define iscsi-pool.xml
sudo virsh pool-start iscsi-pool
sudo virsh pool-autostart iscsi-pool
```
#### 配置网络存储池
1. **查看存储池信息**
```shell
sudo virsh pool-info nfs-pool
sudo virsh pool-info iscsi-pool
```
2. **查看存储池中的存储卷**
```shell
sudo virsh vol-list nfs-pool
sudo virsh vol-list iscsi-pool
```
3. **创建存储卷**
```shell
sudo virsh vol-create-as nfs-pool volume1 10G
sudo virsh vol-create-as iscsi-pool volume2 20G
```
## 配置存储卷
### 存储卷的概念
**存储卷Storage Volume是存储池Storage Pool中的一个逻辑单元类似于传统文件系统中的文件。**存储卷为虚拟机提供存储空间,用于存储操作系统、应用程序和数据。每个存储卷可以对应一个磁盘映像文件、逻辑卷或网络存储块。通过存储卷,管理员可以灵活管理和分配存储资源。
### 创建和管理磁盘映像文件
#### 使用 `virsh` 创建磁盘映像文件
1. **创建磁盘映像文件**
使用 `virsh` 创建一个磁盘映像文件:
```shell
sudo virsh vol-create-as dir-pool mydisk.qcow2 20G --format qcow2
```
以上命令将在 `dir-pool` 存储池中创建一个名为 `mydisk.qcow2` 的磁盘映像文件,大小为 20GB格式为 qcow2。
2. **查看磁盘映像文件信息**
查看创建的磁盘映像文件信息:
```shell
sudo virsh vol-info mydisk.qcow2 --pool dir-pool
```
#### 配置磁盘映像文件的大小和格式
1. **调整磁盘映像文件大小**
可以使用 `qemu-img` 工具调整磁盘映像文件的大小:
```shell
qemu-img resize /path/to/mydisk.qcow2 +10G
```
以上命令将 `mydisk.qcow2` 的大小增加 10GB。
2. **转换磁盘映像文件格式**
可以使用 `qemu-img` 工具转换磁盘映像文件的格式:
```shell
qemu-img convert -f qcow2 -O raw /path/to/mydisk.qcow2 /path/to/mydisk.raw
```
以上命令将 `mydisk.qcow2` 转换为 `mydisk.raw`,格式从 qcow2 转换为 raw。
### 创建和管理逻辑卷
#### 使用 `virsh` 创建逻辑卷
1. **创建逻辑卷**
使用 `virsh` 创建一个逻辑卷:
```shell
sudo virsh vol-create-as lvm-pool lv_mydisk 20G
```
以上命令将在 `lvm-pool` 存储池中创建一个名为 `lv_mydisk` 的逻辑卷,大小为 20GB。
2. **查看逻辑卷信息**
查看创建的逻辑卷信息:
```shell
sudo virsh vol-info lv_mydisk --pool lvm-pool
```
#### 配置逻辑卷的大小和格式
1. **调整逻辑卷大小**
可以使用 `lvresize` 工具调整逻辑卷的大小:
```shell
sudo lvresize -L +10G /dev/vg_kvm/lv_mydisk
```
以上命令将 `lv_mydisk` 的大小增加 10GB。
2. **格式化逻辑卷**
在使用逻辑卷之前,需要对其进行格式化:
```shell
sudo mkfs.ext4 /dev/vg_kvm/lv_mydisk
```
通过以上步骤,可以使用 `virsh` 创建和管理磁盘映像文件和逻辑卷,并灵活配置其大小和格式。这些存储卷为虚拟机提供了可靠和高效的存储解决方案。
## 虚拟机的存储配置
### 使用 `virsh` 添加和删除虚拟机磁盘
**添加虚拟机磁盘**
1. 创建一个新的磁盘映像文件(如果需要):
```shell
sudo qemu-img create -f qcow2 /var/lib/libvirt/images/mydisk.qcow2 20G
```
2. 使用 `virsh` 命令编辑虚拟机的 XML 配置文件:
```shell
sudo virsh edit <vm_name>
```
3.`<devices>` 部分中添加以下内容,指定新的磁盘设备:
```xml
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/mydisk.qcow2'/>
<target dev='vdb' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
</disk>
```
4. 保存并退出编辑器,启动或重启虚拟机以使新磁盘生效:
```shell
sudo virsh start <vm_name>
```
**删除虚拟机磁盘**
1. 使用 `virsh` 命令编辑虚拟机的 XML 配置文件:
```shell
sudo virsh edit <vm_name>
```
2. 找到需要删除的 `<disk>` 节点,并将其删除:
```xml
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/mydisk.qcow2'/>
<target dev='vdb' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
</disk>
```
3. 保存并退出编辑器,启动或重启虚拟机以应用更改:
```shell
sudo virsh start <vm_name>
```
### `virsh` 配置虚拟机的启动磁盘
1. 使用 `virsh` 命令编辑虚拟机的 XML 配置文件:
```shell
sudo virsh edit <vm_name>
```
2.`<os>` 部分中,找到 `<boot dev='...'>` 节点并调整顺序。例如,将磁盘设备设为首选启动设备:
```xml
<os>
<type arch='x86_64' machine='pc-i440fx-2.9'>hvm</type>
<boot dev='hd'/>
<boot dev='cdrom'/>
</os>
```
3. 保存并退出编辑器,启动或重启虚拟机以应用更改:
```shell
sudo virsh start <vm_name>
```
#### 配置虚拟机 BIOS 设置
1. 使用 `virsh` 命令编辑虚拟机的 XML 配置文件:
```shell
sudo virsh edit <vm_name>
```
2.`<os>` 部分中,添加或修改 `<bios>` 节点。例如,启用 BIOS 引导菜单:
```xml
<os>
<type arch='x86_64' machine='pc-i440fx-2.9'>hvm</type>
<loader readonly='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE.fd</loader>
<nvram>/var/lib/libvirt/qemu/nvram/<vm_name>.fd</nvram>
<bootmenu enable='yes'/>
</os>
```
3. 保存并退出编辑器,启动或重启虚拟机以应用更改:
```shell
sudo virsh start <vm_name>
```
## 高级存储管理
### 快照管理
#### 创建和管理磁盘快照
快照是虚拟机在某一时刻的状态,包括虚拟机的磁盘和内存状态。通过快照,您可以在需要时恢复虚拟机到之前的状态。
**创建磁盘快照**
使用 `virsh` 创建磁盘快照:
```shell
sudo virsh snapshot-create-as <vm_name> <snapshot_name> --disk-only --atomic
```
以上命令创建一个仅包含磁盘状态的快照。
**管理磁盘快照**
使用 `virsh` 列出所有快照:
```shell
sudo virsh snapshot-list <vm_name>
```
**恢复快照**
使用 `virsh` 恢复快照:
```shell
sudo virsh snapshot-revert <vm_name> <snapshot_name>
```
#### 扩展存储池容量
**扩展目录存储池**
确保文件系统有足够的空间,然后直接添加更多存储卷到目录存储池即可。
**扩展 LVM 存储池**
1. 添加新的物理卷到卷组:
```shell
sudo pvcreate /dev/sdX
sudo vgextend vg_kvm /dev/sdX
```
2. 更新存储池配置:
```shell
sudo virsh pool-refresh lvm-pool
```
**扩展网络存储池**
对于 NFS 和 iSCSI直接在网络存储服务器上扩展存储容量然后刷新存储池即可。
#### 缩减存储池容量
**缩减 LVM 存储池**
1. 移动逻辑卷中的数据到其他物理卷:
```shell
sudo pvmove /dev/sdX
```
2. 移除物理卷并减少卷组大小:
```shell
sudo vgreduce vg_kvm /dev/sdX
sudo pvremove /dev/sdX
```
**缩减目录存储池和网络存储池**
一般不直接缩减这些存储池,建议清理不需要的存储卷以释放空间。
### 磁盘镜像和克隆
#### 创建磁盘镜像
**创建磁盘镜像**
使用 `qemu-img` 创建磁盘镜像:
```shell
qemu-img create -f qcow2 /var/lib/libvirt/images/mydisk.qcow2 20G
```
**转换磁盘镜像格式**
使用 `qemu-img` 转换磁盘镜像格式:
```shell
qemu-img convert -f qcow2 -O raw /path/to/mydisk.qcow2 /path/to/mydisk.raw
```
#### 克隆虚拟机磁盘
1. 使用 `qemu-img` 克隆磁盘映像:
```shell
qemu-img create -f qcow2 -b /var/lib/libvirt/images/source-disk.qcow2 /var/lib/libvirt/images/clone-disk.qcow2
```
2. 使用 `virsh` 定义新的虚拟机,并指定克隆的磁盘映像:
创建虚拟机 XML 文件:
```xml
<domain type='kvm'>
<name>clone-vm</name>
<memory unit='KiB'>1048576</memory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-2.9'>hvm</type>
</os>
<devices>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/clone-disk.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</disk>
</devices>
</domain>
```
3. 使用 `virsh` 定义并启动新的虚拟机:
```shell
sudo virsh define /path/to/clone-vm.xml
sudo virsh start clone-vm
```