详解Linux LVM (Logical Volume Manager)

Linux LVM (Logical Volume Manager) 的详细讲解,内容涵盖了核心概念、架构、实战操作、高级功能以及常用命令,旨在帮助你全面理解和掌握 LVM。


第一部分:LVM 是什么?为什么需要它?

1. LVM 是什么?

LVM,即逻辑卷管理器 (Logical Volume Manager),是 Linux 系统下一种功能强大的存储管理工具。它并非一个文件系统(如 ext4 或 XFS),而是一个位于物理存储设备(如硬盘、SSD)和文件系统之间的抽象层

你可以把它想象成一个"存储虚拟化"技术。它让你不再直接与 /dev/sda1/dev/sdb1 这样的物理分区打交道,而是将它们组合成一个大的"存储池",然后根据需要从这个池子里"切割"出任意大小的逻辑分区来使用。

2. 为什么需要 LVM?(LVM 的核心优势)

传统的磁盘分区方式非常僵化。一旦分区大小确定,想要调整(特别是扩大)会非常困难,往往需要备份数据、删除分区、重建分区、恢复数据,过程繁琐且风险高。LVM 的出现正是为了解决这些问题。

  • 动态调整大小: 这是 LVM 最核心的优势。你可以轻松地在线扩大逻辑卷(LV)的大小,甚至在某些情况下可以缩小它,而无需停机或重新格式化。
  • 跨物理磁盘: 一个 LVM 卷组(VG)可以包含多个物理硬盘或分区。这意味着你可以创建一个跨越多个硬盘的巨大逻辑卷,从而突破单个硬盘的容量限制。
  • 快照功能 (Snapshots): LVM 允许你对一个逻辑卷创建"即时"快照。这个快照是一个逻辑上独立的、在创建瞬间与原卷内容完全相同的副本。这对于进行无风险的系统升级、测试或进行一致性备份非常有用。
  • 精简配置 (Thin Provisioning): 你可以创建一个比实际可用物理空间更大的逻辑卷。系统只在数据被实际写入时才分配物理空间。这对于虚拟化和云环境非常有用,可以有效提高存储利用率。
  • 数据迁移: LVM 可以在不中断服务的情况下,将数据从一个物理磁盘迁移到另一个(例如,从旧硬盘迁移到新硬盘)。

第二部分:LVM 的核心架构

要理解 LVM,必须掌握它的三个核心组件,它们构成了 LVM 的层级结构。

  1. 物理卷 (Physical Volume, PV)

    • 定义: LVM 的最底层,是 LVM 的基本存储单元。通常是一个完整的硬盘(如 /dev/sdb)或一个硬盘分区(如 /dev/sdc1)。
    • 作用: 在使用 LVM 之前,你必须先将一个物理设备"初始化"或"标记"为 PV,这样 LVM 才能识别和使用它。
    • 命令: pvcreate, pvdisplay, pvs
  2. 卷组 (Volume Group, VG)

    • 定义: LVM 的中间层,可以看作一个大的"存储池"。一个卷组由一个或多个物理卷组成。
    • 作用: 它将底层的多个 PV 整合在一起,向上层提供统一的、连续的存储空间。你可以动态地向 VG 中添加新的 PV 来扩大存储池的总容量。
    • 命令: vgcreate, vgdisplay, vgs, vgextend
  3. 逻辑卷 (Logical Volume, LV)

    • 定义: LVM 的最顶层,这是最终用户可以格式化并使用的"设备"。逻辑卷是从卷组这个大存储池中"划分"或"切割"出来的。
    • 作用: 对于操作系统和应用程序来说,一个 LV 看起来就像一个普通的物理分区(例如 /dev/my_vg/my_lv)。你可以在它上面创建文件系统(如 ext4, XFS),然后挂载使用。
    • 命令: lvcreate, lvdisplay, lvs, lvextend, lvreduce

一个形象的比喻:

  • 物理卷 (PVs) :像是一块块独立的乐高积木。
  • 卷组 (VG) :像是你把所有乐高积木都倒进去的一个大盒子,形成了一个积木池。
  • 逻辑卷 (LVs) :像是你从这个大盒子里拿出一些积木,拼成你想要的模型(比如一辆车或一座房子)。你可以随时从盒子里拿更多积木来把模型造得更大。

第三部分:LVM 实战:从零创建并管理逻辑卷

假设我们有两块新的空硬盘 /dev/sdb/dev/sdc,每块 100GB。

步骤 1: 准备物理设备

首先,确认设备存在。

Bash

复制代码
lsblk

步骤 2: 创建物理卷 (PV)

将这两块硬盘初始化为 LVM 的物理卷。

Bash

shell 复制代码
sudo pvcreate /dev/sdb /dev/sdc
# 输出会提示 "Physical volume "/dev/sdb" successfully created" 等信息

验证一下:

Bash

bash 复制代码
sudo pvs
# 或者 sudo pvdisplay

步骤 3: 创建卷组 (VG)

将刚刚创建的两个 PV 添加到一个名为 data_vg 的卷组中。

Bash

bash 复制代码
sudo vgcreate data_vg /dev/sdb /dev/sdc
# 输出会提示 "Volume group "data_vg" successfully created"

现在我们有了一个总容量约为 200GB 的存储池。

验证一下:

Bash

bash 复制代码
sudo vgs
# 或者 sudo vgdisplay data_vg

步骤 4: 创建逻辑卷 (LV)

data_vg 卷组中创建一个大小为 50GB,名为 web_data_lv 的逻辑卷。

Bash

bash 复制代码
sudo lvcreate -L 50G -n web_data_lv data_vg
# -L: 指定大小 (G, M, T)
# -n: 指定名称
# 最后一个参数是 VG 的名称

验证一下:

Bash

shell 复制代码
sudo lvs
# 或者 sudo lvdisplay /dev/data_vg/web_data_lv

现在,系统里多了一个设备:/dev/data_vg/web_data_lv

步骤 5: 格式化与挂载

像普通分区一样,格式化这个逻辑卷并挂载它。

Bash

bash 复制代码
# 格式化为 ext4 文件系统
sudo mkfs.ext4 /dev/data_vg/web_data_lv

# 创建挂载点
sudo mkdir /data/web

# 挂载
sudo mount /dev/data_vg/web_data_lv /data/web

# (可选) 设置开机自动挂载,编辑 /etc/fstab 文件
# 添加一行:
# /dev/data_vg/web_data_lv   /data/web   ext4    defaults    0 0

现在你就可以在 /data/web 目录下使用这个 50GB 的空间了。

步骤 6: 动态扩容 (LVM 的魅力所在)

假设 50GB 的空间不够用了,我们需要增加 20GB。

第一步:扩展逻辑卷 (LV)

Bash

bash 复制代码
# 将 web_data_lv 的容量增加 20GB
sudo lvextend -L +20G /dev/data_vg/web_data_lv
# 或者扩展到总共 70GB: sudo lvextend -L 70G ...

第二步:扩展文件系统 (至关重要!)

仅仅扩大 LV 是不够的,文件系统并不知道底层的空间变大了。你必须通知文件系统去使用这部分新增的空间。

  • 对于 ext4 文件系统:

    Bash

    bash 复制代码
    sudo resize2fs /dev/data_vg/web_data_lv
  • 对于 XFS 文件系统:

    Bash

    bash 复制代码
    sudo xfs_growfs /data/web  # 注意,xfs_growfs 使用挂载点

现在,使用 df -h 查看,你会发现 /data/web 的容量已经变成了 70GB。整个过程在线完成,无需卸载


第四部分:LVM 高级功能简介

1. LVM 快照 (Snapshot)

在对 /data/web 进行重要更新前,创建一个快照以防万一。

Bash

bash 复制代码
# 创建一个名为 web_backup 的快照,大小为 5GB (快照大小只需能容纳变更的数据即可)
sudo lvcreate -s -L 5G -n web_backup /dev/data_vg/web_data_lv
# -s: 表示创建快照

现在你可以挂载这个快照,它包含了创建瞬间 /data/web 的所有数据。

Bash

bash 复制代码
sudo mkdir /mnt/backup
sudo mount /dev/data_vg/web_backup /mnt/backup

如果更新搞砸了,你可以用这个快照来恢复数据,或者直接回滚。

2. 精简配置 (Thin Provisioning)

创建一个 1TB 的 Thin Pool,即使你的 VG 总共只有 200GB。

Bash

bash 复制代码
# 1. 创建一个名为 thin_pool 的 Thin Pool
sudo lvcreate -L 190G -T data_vg/thin_pool

# 2. 从 Thin Pool 中创建一个 500GB 的 Thin LV
sudo lvcreate -V 500G -T data_vg/thin_pool -n thin_lv_1

这个 thin_lv_1 对外声称有 500GB,但它只有在写入数据时才会真正从 thin_pool 中消耗空间。


第五部分:常用命令速查

用途 PV 相关命令 VG 相关命令 LV 相关命令
创建 pvcreate /dev/sdX vgcreate <vg_name> /dev/sdX lvcreate -L <size> -n <lv_name> <vg_name>
显示(简) pvs vgs lvs
显示(详) pvdisplay vgdisplay lvdisplay
扩展 (无,直接加到VG) vgextend <vg_name> /dev/sdY lvextend -L +<size> /dev/vg/lv
缩减 pvmove /dev/sdX vgreduce <vg_name> /dev/sdX lvreduce -L -<size> /dev/vg/lv
移除 pvremove /dev/sdX vgremove <vg_name> lvremove /dev/vg/lv
扫描 pvscan vgscan lvscan

总结

LVM 是一个非常强大和灵活的存储管理工具,是现代 Linux 服务器和虚拟化环境中的标配。虽然它增加了一个管理层,初看起来比传统分区复杂,但它带来的动态调整、快照等能力,极大地提升了系统运维的灵活性和安全性,是每一个 Linux 系统管理员都应该熟练掌握的技能。

相关推荐
艾醒几秒前
大模型面试题剖析:大模型微调与训练硬件成本计算
人工智能·后端·算法
自由生长20244 分钟前
每日知识-设计模式-状态机模式
后端
用户298698530149 分钟前
如何使用 Spire.Doc 在 C# 中创建、写入和读取 Word 文档?
后端
林太白34 分钟前
项目中的层级模块到底如何做接口
前端·后端·node.js
一枚小小程序员哈40 分钟前
基于Android的车位预售预租APP/基于Android的车位租赁系统APP/基于Android的车位管理系统APP
android·spring boot·后端·struts·spring·java-ee·maven
二闹1 小时前
从@Transactional失效场景到传播行为原理
java·后端
赵星星5201 小时前
synchronized锁的是谁,看完这篇就明白了
java·后端
小张学习之旅1 小时前
线程池简单讲解
java·后端
李九四1 小时前
章节11:使用括号()标明优先级
后端
拾光师1 小时前
flume监控目录文件实战:三种 Source 方案对比与配置指南
后端