lvm详解


难度 中等

lvm是什么

LVM(Logical Volume Manager)逻辑卷管理,是在硬盘分区和文件系统之间添加的一个逻辑层,为文件系统屏蔽下层硬盘分区布局,并提供一个抽象的盘卷,在盘卷上建立文件系统。它提供了一种灵活的方式来管理和操作磁盘空间,使管理员能够动态地创建、调整大小、合并和移动逻辑卷,而无需中断系统。

LVM的主要目标是将物理存储设备(如硬盘、SSD等)抽象为逻辑卷(Logical Volume),屏蔽了物理磁盘和分区的细节,使用户和系统能够以逻辑上的方式管理存储空间。当我们对底层的物理硬盘进行操作时,不再是针对分区进行操作,而是通过逻辑卷对底层硬盘进行管理操作。

lvm其实跟ext4这样的文件系统类似,抽象成一个个分区后,将这些分区挂载到某个目录下,就可以像操作目录一样操作磁盘了。

lvm与ext4这样的文件系统最大的区别是,ext4针对是某个磁盘的一部分的抽象,而lvm则是针对一个或多个磁盘的一部分或者整体的抽象,lvm能够将多个磁盘抽象成同一个逻辑卷。

关键术语

  • 物理存储介质(The physical media):其实就是硬盘或者ssd,LVM存储介质,可以是硬盘分区、整个硬盘、raid阵列或SAN硬盘。设备必须初始化为LVM物理卷,才能与LVM结合使用。
  • 物理卷PV(physical volume):物理卷就是LVM的基本存储逻辑块,但和基本的物理存储介质比较却包含与LVM相关的管理参数,创建物理卷可以用硬盘分区,也可以用硬盘本身。
  • 卷组VG(Volume Group):LVM卷组类似于非LVM系统中的物理硬盘,一个卷组VG由一个或多个物理卷PV组成。可以在卷组VG上建立逻辑卷LV。
  • 逻辑卷LV(logical volume):类似于非LVM系统中的硬盘分区,逻辑卷LV建立在卷组VG之上。在逻辑卷LV之上建立文件系统。

lvm的搭建流程

graph TB a(磁盘/分区)-->b(创建物理卷pv)-->c(创建逻辑卷vg,vg可以有多个pv组成)-->d(创建逻辑卷lv)-->e(格式化并挂载)

lvm有什么用

  1. 卷组VG可以使多个硬盘空间看起来像是一个大硬盘。

  2. 逻辑卷LV可以创建跨多个硬盘空间的分区。

  3. 在使用逻辑卷LV时,可以在空间不足时动态调整大小,不需要考虑逻辑卷LV在硬盘上的位置,不用担心没有可用的连续的空间。

  4. 可以在线对卷组VG、逻辑卷LV进行创建、删除、调整大小等操作。但LVM上的文件系统也需要重新调整大小。

  5. LVM允许创建快照,用来保存文件系统的备份。

如何使用lvm

  1. 使用lsblk查看磁盘分区,确定要使用的磁盘或者分区,可以是没有创建过分区的物理磁盘,也可以已经创建出来的分区;

  2. 选择磁盘或者分区利用pvcreate创建物理卷PV,创建完成后可以使用pvs查看pv

pvcreate /dev/sda
pvs

创建完成后,使用lsblk -f查看文件系统类型时已经变更为了LVM2_member.

(base) ➜  ~ lsblk -f
NAME            FSTYPE      LABEL UUID                                   MOUNTPOINT
sda                                                                      
└─sda1          LVM2_member       6xxxxxxxxxxxxxxxx

可以使用pvdisplay查看pv的详细情况。

pvdisplay /dev/sda1
  1. 创建vg

使用vgcreate创建vg,命令如下:

# 这里的vg_data就是vg的名称
vgcreate vg_data /dev/sda1

创建完成后使用如下命令查看vg的详细情况:

vgs
vgdisplay vg_data
  1. 创建逻辑卷lv
lvcreate -n lvname -L lvsize(M,G) vgname
lvcreate -n lv_data -L 64M vg_data
  1. 格式化分区,并将其挂载
mkfs.ext4 /dev/vg/lv_data
mkdir /data
mount /dev/vg/lv_data /data
  1. lv扩容

lvm最重要的功能就是动态调整分区大小,如果之前创建的vg还有剩余的空间,则可以直接在原有lv的基础上扩容,使用如下命令扩展:

lvextend -L +100M /dev/vg/lv_data
resize2fs /dev/vg/lv_data

如果vg里的所有空间都已经分配完了,则需要先扩展vg,再扩展lv。

缩容则采用如下命令:

lvreduce -L 100M  /dev/vg/lv_data
resize2fs /dev/vg/lv_data
  1. 扩展vg

扩展vg一般是增加了一块磁盘,这个时候就可以把这块磁盘扩展到vg里,比如sdb。

pvcreate /dev/sdb
vgextend vg_data /dev/sdb

关于lvm的一些疑问

lvm创建的文件是如何分配到具体的物理磁盘上的

lvm创建的文件分配到磁盘上有多个策略,具体如下:

  1. 线性分配(linear)

这是默认的分配策略,无需特别设置,数据按顺序依次放到各个物理磁盘上,一个物理磁盘放满后才会放在另外一个物理磁盘。

  1. 条带分配(striped)

需要在使用lvcreate时用-i指定条带数,存储文件时会将数据均匀地存储在各个磁盘上。比如有两个物理磁盘,创建lv时使用如下命令:

lvcreate -n lv_data -L 64M vg_data -i 2
  1. 镜像分配(mirrored)

每一份数据都会有多个镜像副本存储,提高数据容错性。需要在使用lvcreate时用-m指定镜像数。

lvcreate -n lv_data -L 64M vg_data -m 2
  1. 条带镜像分配

这个是条带分配和镜像分配的结合,需要使用lvcreate时用-m指定镜像数,用-i指定条带数

lvcreate -n lv_data -L 64M vg_data -i 2 -m 2

若要查看lvm当前的磁盘分配策略,可以使用如下命令查看:

lvdisplay type

比如下面的就是linear

--- Segments ---
 Logical extents 0 to 12800:
   Type                linear
   Physical volume     /dev/nvme0n1p3
   Physical extents    475271 to 488071
  
 Logical extents 12801 to 537087:
   Type                linear
   Physical volume     /dev/sda1
   Physical extents    0 to 524286
  • 线性方式(linear):以一块盘为基础进行读写。当数据写入到一个物理卷(盘)时,写满后才会开始写入下一个物理卷。这种方式的性能较低,因为它无法充分利用多个盘的并行读写能力。

  • 条带方式(striped):以多块盘并行读写数据。数据被分成大小相等的条带,然后同时写入到多个物理卷中的相应条带位置。这样可以充分利用多个盘的并行读写能力,从而提高读写性能。

一般来说,随机读写比较多的场景下,条带方式通常比线性方式具有更高的性能。顺序读写且文件较大的场景下,线性方式通常比条带方式具有更高的性能。

是否可以将lvm的磁盘空间回收,创建新的lvm

如果lvm创建时使用的是整块磁盘,那无法将未使用的空间回收回来重新重建vg,进而创建lv。
因而在创建pv时尽量先创建分区,不要一开始就使用整个磁盘,后面再按需进行添加和扩展。

当使用条带方式(striped)存储策略时,若某个物理盘损坏是否会影响数据可读性

当使用 Striped(条带化)方式在多个物理磁盘上分配数据时,如果其中一块物理磁盘发生故障,将会影响全量数据的可用性和完整性。 这是因为条带化将数据分割成多个块,并将这些块分散存储在各个物理磁盘上。如果某个物理磁盘发生故障,相应的数据块将无法访问。这可能导致条带化卷中所有的数据块都变得不完整,从而影响到全量数据的可用性。具体影响程度将取决于使用的条带大小、故障磁盘的位置以及卷的冗余配置。

要减少物理磁盘损坏对全局数据的影响,可采取如下措施:

  • 冗余备份
  • 定期备份

文章作者: growdu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 growdu !
  目录
分类导航
随笔3 AI29 计算机基础13 算法1 博客搭建7 ChatGPT2 集群63 计算机通信1 数据库59 数据库深入93 数据库93 Docker11 DPDK26 编辑工具4 Elasticsearch4 FAQ1 Go Web1 hometown2 编程语言16 人生11 网络9 Linux38 OPC1 openGauss4 页面12 PostgreSQL54 程序员自我修养1 协议11 stock1 存储5 成长之路1 工具20 视频作品1 VPP18 Vue13 Web1 代码示例11 BenchmarkSQL1 PostgreSQL 源码修炼之路14
最热文章
1
PostgreSQL 逻辑复制全链路:以一个真实事务为例,从 `INSERT` 到 `apply` 的源码级旅程
数据库🔥 2162
2
PostgreSQL 逻辑复制 Stream 执行逻辑源码级拆解:从 reorderbuffer 触发到订阅端落盘回放
数据库🔥 1765
3
PostgreSQL 行锁机制源码级深度拆解:4 种锁模式 + xmax + MultiXact 的完整链路
数据库🔥 1656
4
PostgreSQL reorderbuffer.c 函数级源码全集:5615 行 / 95 个函数的逐函数解析
数据库深入🔥 1650
5
PostgreSQL 目录快照源码级深度拆解:系统表读取的 MVCC 真相与失效机制
数据库🔥 1604
6
13 逻辑复制深入
数据库深入🔥 1570
7
0 Postgresql存储、索引及系统优化、主备切换
PostgreSQL🔥 1495
8
PostgreSQL 读一行数据源码级深度拆解:MVCC 在每个环节的落点
数据库🔥 1464
9
PostgreSQL WAL 记录类型完全指南:21 个 RMGR × 80+ 种记录的源码级拆解
数据库🔥 1431
10
一文读懂openguass dcf网络模块
集群🔥 1420
11
PostgreSQL 元数据存储机制:从磁盘文件到内存缓存,`pg_class` 撑起的整个系统表体系
数据库🔥 1411
12
openGauss 并行解码设计原理深度拆解:reader + 多 worker + CSN 三层架构的源码级剖析
数据库深入🔥 1344
13
逻辑复制源码分析
数据库深入🔥 1327
14
PostgreSQL 逻辑复制:catalog 改动、可见性判定与 xmin/xmax 推进全景
数据库深入🔥 1317
15
自托管服务全家桶:从原文方案到可复制实操手册
人生🔥 1278
16
PostgreSQL CREATE_REPLICATION_SLOT 端到端源码分析:从 SQL 到 snapbuild 状态机的完整链路(每个函数每个参数)
数据库深入🔥 1277
17
PostgreSQL syscache 模块源码深度拆解:CatCache 数据结构、LRU 哈希表、cache invalidation 全链路
数据库深入🔥 1216
18
PostgreSQL 18 内核数据结构全景:RangeVar 与 20+ 个核心数据结构源码级拆解
数据库🔥 1158
19
PostgreSQL 逻辑复制里 `RUNNING_XACTS` 写入机制与快照 `xmin / xmax / xip` 的演化:源码级深度拆解
数据库🔥 1119
20
PostgreSQL 分区表:从一行 `PARTITION BY` 到路由热路径的全链路拆解
数据库🔥 1094