# LVM 管理

URL: https://caijiao.org/rockylinux/lvm-management
Source: docs/rockylinux/lvm-management.md
Description: 详细介绍 Rocky Linux 中 LVM（逻辑卷管理）的基本概念、创建与管理逻辑卷的方法

LVM（Logical Volume Manager，逻辑卷管理）是 Linux 系统中的一种高级磁盘管理技术，它允许用户创建、调整大小、管理逻辑卷，提供了比传统分区方式更灵活的存储管理方案。本教程将详细介绍 LVM 的基本概念、安装配置以及日常管理操作。

## LVM 基础概念

### 基本组件

LVM 由以下三个主要组件组成：

1. **物理卷（PV - Physical Volume）**：底层存储设备，可以是硬盘分区、整个硬盘或 RAID 设备
2. **卷组（VG - Volume Group）**：由一个或多个物理卷组成的存储池
3. **逻辑卷（LV - Logical Volume）**：从卷组中分配的空间，可以作为常规文件系统挂载使用

### 为什么使用 LVM？

LVM 提供了许多传统分区管理无法实现的功能：

- 无需卸载即可调整文件系统大小
- 在线移动数据而不中断服务
- 创建快照以备份或测试更改
- 将多个物理硬盘合并为一个逻辑存储池
- 提供更好的存储利用率和灵活性

### LVM 工作原理

LVM 通过以下步骤工作：

1. 将物理存储设备初始化为物理卷（PV）
2. 将多个物理卷组合成卷组（VG）
3. 从卷组中分配逻辑卷（LV）
4. 在逻辑卷上创建文件系统并挂载使用

## 安装 LVM 工具

在 Rocky Linux 中，LVM 工具已经预装在大多数系统中，但如果需要，可以使用以下命令安装：

```bash
# 安装 LVM 工具
sudo dnf install lvm2 -y

# 确保服务已启动
sudo systemctl enable --now lvm2-lvmetad.service
```

## LVM 基本操作

### 物理卷管理

#### 创建物理卷

```bash
# 列出所有可用的磁盘设备
sudo fdisk -l

# 选择要使用的磁盘或分区，例如 /dev/sdb 和 /dev/sdc
sudo pvcreate /dev/sdb /dev/sdc

# 如果要使用整个磁盘，也可以指定分区，如 /dev/sdb1
# sudo pvcreate /dev/sdb1
```

#### 查看物理卷

```bash
# 查看所有物理卷的摘要信息
sudo pvs

# 查看详细信息
sudo pvdisplay

# 以列表格式显示
sudo pvscan
```

#### 物理卷维护

```bash
# 从物理卷中移除数据（迁移到其他物理卷）
sudo pvmove /dev/sdb

# 删除物理卷（仅在已从卷组中移除后）
sudo pvremove /dev/sdb

# 检查物理卷一致性
sudo pvck /dev/sdb
```

### 卷组管理

#### 创建卷组

```bash
# 创建名为 myvg 的卷组，使用 /dev/sdb 和 /dev/sdc 作为物理卷
sudo vgcreate myvg /dev/sdb /dev/sdc

# 指定物理扩展（PE）大小创建卷组（默认为 4MB）
sudo vgcreate -s 16M myvg /dev/sdb /dev/sdc
```

#### 查看卷组

```bash
# 查看所有卷组摘要信息
sudo vgs

# 查看详细信息
sudo vgdisplay

# 扫描所有卷组
sudo vgscan
```

#### 扩展卷组

```bash
# 向现有卷组添加新物理卷
sudo vgextend myvg /dev/sdd
```

#### 缩小卷组

```bash
# 从卷组中移除物理卷（确保先移动数据）
sudo pvmove /dev/sdc
sudo vgreduce myvg /dev/sdc
```

#### 卷组维护

```bash
# 重命名卷组
sudo vgrename myvg newvg

# 检查卷组一致性
sudo vgck myvg

# 停用卷组
sudo vgchange -a n myvg

# 重新激活卷组
sudo vgchange -a y myvg
```

### 逻辑卷管理

#### 创建逻辑卷

```bash
# 创建大小为 100GB 的逻辑卷
sudo lvcreate -L 100G -n mylv myvg

# 创建占用卷组中 50% 空间的逻辑卷
sudo lvcreate -l 50%VG -n mylv myvg

# 创建占用剩余空间的逻辑卷
sudo lvcreate -l 100%FREE -n mylv myvg
```

#### 查看逻辑卷

```bash
# 查看所有逻辑卷摘要信息
sudo lvs

# 查看详细信息
sudo lvdisplay

# 扫描所有逻辑卷
sudo lvscan
```

#### 扩展逻辑卷

```bash
# 扩展逻辑卷到 200GB
sudo lvextend -L 200G /dev/myvg/mylv

# 增加逻辑卷大小 50GB
sudo lvextend -L +50G /dev/myvg/mylv

# 扩展逻辑卷以使用卷组中所有可用空间
sudo lvextend -l +100%FREE /dev/myvg/mylv

# 扩展后调整文件系统大小
sudo resize2fs /dev/myvg/mylv  # 对于 ext2/ext3/ext4
sudo xfs_growfs /dev/myvg/mylv  # 对于 XFS
```

#### 缩小逻辑卷

注意：缩小逻辑卷存在风险，需要谨慎操作。在缩小前，确保备份数据。

```bash
# 对于 ext2/ext3/ext4 文件系统
# 1. 卸载文件系统
sudo umount /dev/myvg/mylv

# 2. 检查文件系统
sudo e2fsck -f /dev/myvg/mylv

# 3. 调整文件系统大小
sudo resize2fs /dev/myvg/mylv 100G

# 4. 缩小逻辑卷
sudo lvreduce -L 100G /dev/myvg/mylv

# 5. 重新挂载
sudo mount /dev/myvg/mylv /mount/point

# 对于 XFS 文件系统
# XFS 只能扩展，不能缩小。需要备份数据，重新创建较小的逻辑卷，然后恢复数据。
```

#### 逻辑卷维护

```bash
# 重命名逻辑卷
sudo lvrename myvg mylv newlv

# 移除逻辑卷（确保已卸载且不再需要）
sudo umount /dev/myvg/mylv
sudo lvremove /dev/myvg/mylv

# 创建逻辑卷快照（用于备份或测试）
sudo lvcreate -L 10G -s -n mysnapshot /dev/myvg/mylv

# 合并快照（如果需要）
sudo umount /dev/myvg/mysnapshot
sudo lvconvert --merge /dev/myvg/mysnapshot

# 检查逻辑卷一致性
sudo lvck /dev/myvg/mylv
```

## 逻辑卷文件系统管理

### 创建文件系统

在创建逻辑卷后，需要在其上创建文件系统才能使用：

```bash
# 创建 ext4 文件系统
sudo mkfs.ext4 /dev/myvg/mylv

# 创建 XFS 文件系统（Rocky Linux 默认）
sudo mkfs.xfs /dev/myvg/mylv

# 创建 Btrfs 文件系统
sudo mkfs.btrfs /dev/myvg/mylv
```

### 挂载逻辑卷

```bash
# 创建挂载点
sudo mkdir -p /mnt/mylv

# 临时挂载
sudo mount /dev/myvg/mylv /mnt/mylv

# 永久挂载（添加到 /etc/fstab）
echo "/dev/myvg/mylv /mnt/mylv xfs defaults 0 0" | sudo tee -a /etc/fstab

# 使用 UUID 挂载（更安全）
sudo blkid /dev/myvg/mylv
# 复制 UUID 并添加到 /etc/fstab
echo "UUID=your-uuid /mnt/mylv xfs defaults 0 0" | sudo tee -a /etc/fstab
```

## LVM 高级功能

### LVM 快照

LVM 快照允许创建逻辑卷的只读或读写副本，可以用于备份或测试系统更改而不影响原始数据。

```bash
# 创建只读快照
sudo lvcreate -L 10G -s -n snapshot_ro -pr /dev/myvg/mylv

# 创建读写快照
sudo lvcreate -L 10G -s -n snapshot_rw /dev/myvg/mylv

# 挂载快照进行访问
sudo mount /dev/myvg/snapshot_rw /mnt/snapshot

# 删除快照
sudo lvremove /dev/myvg/snapshot_rw
```

### 条带化逻辑卷

条带化可以提高性能，特别是对于大型文件的 I/O 操作：

```bash
# 创建条带化逻辑卷，跨 2 个物理卷，条带大小为 64KB
sudo lvcreate -L 200G -i 2 -I 64K -n striped_lv myvg
```

### 镜像逻辑卷

镜像提供数据冗余，可以防止单个物理磁盘故障导致数据丢失：

```bash
# 创建带有单个镜像的逻辑卷
sudo lvcreate -L 100G -m 1 -n mirror_lv myvg

# 查看镜像状态
sudo lvdisplay -m /dev/myvg/mirror_lv
```

### 缓存逻辑卷

可以使用更快的存储设备（如 SSD）作为较慢存储设备（如 HDD）的缓存：

```bash
# 假设 /dev/nvme0n1 是 SSD，用于缓存
# 1. 创建物理卷
sudo pvcreate /dev/nvme0n1

# 2. 将 SSD 添加到卷组
sudo vgextend myvg /dev/nvme0n1

# 3. 创建缓存池
sudo lvcreate -L 50G -n cache_pool myvg /dev/nvme0n1

# 4. 创建缓存元数据
sudo lvcreate -L 1G -n cache_meta myvg /dev/nvme0n1

# 5. 将逻辑卷转换为缓存逻辑卷
sudo lvconvert --type cache --cachepool myvg/cache_pool --cachemetadata myvg/cache_meta myvg/mylv
```

## LVM 故障排除

### 常见问题及解决方案

1. **无法创建物理卷**

   - 确保磁盘未被使用或挂载
   - 检查是否有分区表，如果有，可以使用 `pvcreate --force` 强制创建

2. **卷组空间不足**

   - 向卷组添加新的物理卷：`vgextend myvg /dev/sdd`
   - 移除不必要的逻辑卷并释放空间

3. **逻辑卷无法挂载**

   - 检查文件系统是否损坏：`fsck /dev/myvg/mylv`
   - 验证逻辑卷是否激活：`lvchange -a y /dev/myvg/mylv`

4. **LVM 元数据损坏**
   - 使用 `vgcfgrestore` 从备份恢复元数据
   - 在极端情况下，可能需要重建 LVM 结构并恢复数据

### 监控 LVM 状态

```bash
# 监控物理卷健康状态
sudo pvs --sort pv_used

# 监控卷组剩余空间
sudo vgs --sort vg_free

# 监控逻辑卷使用情况
sudo lvs -o +devices
```

### 备份 LVM 配置

```bash
# 备份卷组配置
sudo vgcfgbackup

# 将卷组配置备份到特定文件
sudo vgcfgbackup -f /path/to/backup/myvg.conf myvg

# 恢复卷组配置
sudo vgcfgrestore -f /path/to/backup/myvg.conf myvg
```

## LVM 最佳实践

1. **规划 LVM 结构**

   - 在创建前规划物理卷、卷组和逻辑卷的大小和数量
   - 考虑未来的扩展需求，预留足够空间

2. **选择适当的文件系统**

   - 对于大多数用途，XFS 是一个好选择，它在大数据量下性能良好
   - 对于需要频繁调整大小的场景，ext4 提供更好的收缩支持

3. **使用多个物理卷**

   - 分布在多个物理磁盘上的卷组提供更好的性能和冗余
   - 考虑使用 RAID 设备作为物理卷以增加数据安全性

4. **设置合理的物理扩展大小**

   - 较小的 PE 大小（如 4MB）提供更好的空间利用率
   - 较大的 PE 大小（如 16MB 或 32MB）在处理大文件时性能更好

5. **定期监控和维护**

   - 定期检查 LVM 状态和可用空间
   - 备份重要的 LVM 配置

6. **快照管理**

   - 快照大小应足以容纳预期的变更量
   - 不要让快照存在太长时间，因为它们会随时间增长并降低性能

7. **数据备份策略**
   - 尽管 LVM 提供了一些数据保护功能，但仍应实施独立的备份策略
   - 定期备份重要数据到外部存储

## 总结

LVM 是 Rocky Linux 中强大的存储管理工具，提供了比传统分区方式更大的灵活性和功能性。通过本教程，您学习了 LVM 的基本概念、物理卷、卷组和逻辑卷的创建与管理，以及高级功能如快照、条带化和镜像。

正确使用 LVM 可以帮助您更好地管理服务器存储空间，轻松应对未来的存储需求变化，提高系统的可靠性和性能。在实际应用中，应根据具体的业务需求和硬件条件，设计合适的 LVM 结构，并遵循最佳实践确保系统稳定运行。

对于企业级环境，LVM 通常与其他存储技术（如 RAID、存储区域网络 SAN）结合使用，以提供更全面的存储解决方案。随着您对 LVM 的深入了解，您可以进一步探索其高级功能，为您的系统构建更加灵活、高效的存储架构。
