LVM磁盘空间管理

什么是LVM,以及PV,PE,VG,LV等重要概念。

LVM(Logical Volume Manager)本文译作逻辑卷管理器,是一种磁盘管理技术,为操作系统提供了更为灵活的管理存储设备方式。LVM提供了如下组件:

物理卷(Physical Volume, PV),LVM 的基础存储设备,通常是物理硬盘、分区或 LVM 兼容的设备。

卷组(Volume Group, VG),由一个或多个物理卷组成的逻辑存储池。卷组中的空间可以被多个逻辑卷共享。

逻辑卷(Logical Volume, LV),从卷组中划分出的存储单元,类似于传统分区。逻辑卷可以格式化为文件系统并用于存储数据。

物理扩展(Physical Extent, PE),物理卷被划分为多个相同大小的块,这些块就是物理扩展。每个物理扩展的大小通常是 4 MB 或 8 MB,具体取决于系统配置。

LVM技术流程:磁盘划分为PV —> PV组成了VG,同时设置了PE大小 —> 从VG中划分出LV,其结构示意图如下所示:

image

LVM的原理

将底层的物理硬盘封装起来,然后以逻辑卷的方式呈现给上层应用。 通过这种方式可以只关心封装后的逻辑卷,而不去关注物理底层。这样做的优点有2个:

  1. 文件系统可以跨磁盘存储,存储空间利用率得到提升;
  2. 可以灵活对系统磁盘扩容,逻辑层面上不受任何影响;

文件系统创建流程:

  1. 设置待操作磁盘或分区的SYSTEM ID(8e)

    1
    2
    3
    4
    fdisk [disk/partion] # 磁盘或分区的绝对路径

    输入n -> p -> [可用分区号] -> [first sector] -> [last sector]或+size{K,M,G} ->
    t -> 83(Linux)或8e(Linux LVM) -> w # m查看帮助 n+p选择主分区
  2. 创建PV

    1
    2
    3
    pvcreate [disk/partion] # 磁盘或分区的绝对路径

    pvs # 查看物理卷
  3. 创建VG

    1
    2
    3
    4
    5
    6
    7
    #使用默认的PE大小
    vgcreate [vg_name] [pv_name] # pv_name表示磁盘或分区的绝对路径

    #指定PE大小
    vgcreate -s [size] [new_vg] [pv_name] # size可以是m,g,t

    vgs # 查看卷组
  4. 创建LV

    1
    2
    3
    4
    #指定lv大小
    lvcreate -n [lv_name] -L [lv_size] [vg_name] # lv_size为lv的实际大小

    lvs # 查看逻辑卷
  5. 格式化LV

    1
    2
    3
    mkfs -t [ext3/ext4/xfs] /dev/[vg_name]/[lv_name]
    或者
    mkfs.[ext3/ext4/xfs] /dev/[vg_name]/[lv_name]
  6. 文件系统挂载到系统目录

    1
    2
    3
    4
    mount [lv_name] [absolute_path]

    #查看文件系统
    df -hT # h人性化的大小,m,g,t;T文件系统类型(xfs...)

以下为上述流程的示意图:

image-20241031152224-qmf0leb

LVM扩容

在LVM扩容之前,需要思考的是:VG剩余大小是否大于所需大小,本文首先给出满足此条件下的情形:

  1. 追加LV

    1
    2
    3
    4
    5
    #追加lv大小
    lvextend -L +[lv_size] /dev/[vg_name]/[lv_name] # lv_size为lv的增加大小

    #指定lv最终大小
    lvextend -L [lv_size] /dev/[vg_name]/[lv_name] # lv_size为lv的最终大小
  2. 在LV扩容后,文件系统也要扩容,才能真正使用

    1
    2
    3
    4
    5
    #xfs
    xfs_growfs /dev/[vg_name]/[lv_name]

    #ext3/ext4
    resize2fs /dev/[vg_name]/[lv_name]

接下来是不满足此条件的情形:

  1. 首先确定有多余的磁盘或者分区,按文件系统创建流程建立PV
  2.  #扩充卷组池
     vgextend [vg_name] [pv_name] # pv_name为新创建未使用的PV
    
  3. 扩充之后如果VG剩余大小仍然不满足,继续扩充,反之则按满足此条件的情形进行扩容。

参考

LVM——让Linux磁盘空间的弹性管理 - 知乎