什么是LVM?

我们在实际使用 Linux 服务器的时候,总会有一个让人头疼的问题,随着业务的增加,文件系统负载会越来越大,当到了空间不足的时候,如果我们还在使用传统的分区方式管理硬盘,就不得不将现有的所有分区全部删除,并重新规划新的存储方案。不仅如此,分区到底应该分多大呢?分得太大,会浪费硬盘空间;分得太小,又会面临不够使用的情况。如果在安装系统时规划不合理,这种困扰就会经常出现。如果真出现了分区不够用的情况,应该怎么解决呢? 在以往(2.4 内核以前)要想调整分区大小,要么先新建立一个更大的分区,然后复制旧分区中的内容到新分区,最后使用软链接来替代旧分区;要么使用调整分区大小的工具(如 parted),parted 虽然可以调整分区大小,但是它需要卸载分区之后才可以进行,也就是说需要停止服务。

其实,从一开始,我们就需要有一种管理机制来帮助我们动态地管理存储,LVM 就提供了这种功能。LVM 最大的好处就是可以随时调整分区的大小,分区中的现有数据不会丟失,并且不需要卸载分区、停止服务。LVM 是 Logical Volume Manager 的简称,译为中文就是逻辑卷管理。它是 Linux 下对硬盘分区的一种管理机制。LVM 适合于管理大存储设备,并允许用户动态调整文件系统的大小。此外,LVM 的快照功能可以帮助我们快速备份数据。LVM 为我们提供了逻辑概念上的磁盘,使得文件系统不再关心底层物理磁盘的概念。Linux LVM 允许我们在逻辑卷在线的状态下将其复制到另一设备上,此成功被称为快照功能。快照允许我们在复制的同时,保证运行关键任务的 Web 服务器或数据库服务继续工作。

那么到底什么是LVM呢?

什么是LVM?

LVM基本概念

LVM是逻辑盘卷管理(LogicalVolumeManager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。通过LVM,系统管理员可以轻松管理磁盘分区,如:将若干个磁盘分区连接为一个整块的卷组(volumegroup),形成一个存储池。管理员可以在卷组上随意创建逻辑卷组(logicalvolumes),并进一步在逻辑卷组上创建文件系 统。管理员通过LVM可以方便的调整存储卷组的大小,并且可以对磁盘存储按照组的方式进行命名、管理和分配,例如按照使用用途进行定义:“development”和“sales”,而不是使用物理磁盘名“sda”和“sdb”。而且当系统添加了新的磁盘,通过LVM管理员就不必将磁盘的 文件移动到新的磁盘上以充分利用新的存储空间,而是直接扩展文件系统跨越磁盘即可。

前面我们说了LVM 是建立在硬盘分区之上的一个逻辑层,这个逻辑层让多个硬盘或分区看起来像一块逻辑硬盘,然后将这块逻辑硬盘分成逻辑卷之后使用,从而大大提高了分区的灵活性。我们把真实的物理硬盘或分区称作物理卷(PV);由多个物理卷组成一块大的逻辑硬盘,叫作卷组(VG);将卷组划分成多个可以使用的分区,叫作逻辑卷(LV)。而在 LVM 中最小的存储单位不再是 block,而是物理扩展块(Physical Extend,PE)。我们通过下图看看这些概念之间的联系:

img

LVM基本组成

物理存储介质(PhysicalStorageMedia):指系统的物理存储设备:磁盘,如:/dev/hda、/dev/sda等,是存储系统最底层的存储单元。

物理卷(Physical Volume,PV):指磁盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数;通俗讲就是真正的物理硬盘或分区。

卷组(Volume Group,VG):类似于非LVM系统中的物理磁盘,其由一个或多个物理卷PV组成。可以在卷组上创建一个或多个LV(逻辑卷);我们可以把卷组想象为一块逻辑硬盘。

逻辑卷(Logical Volume,LV):卷组是一块逻辑硬盘,硬盘必须分区之后才能使用。而LV就类似于非LVM系统中的磁盘分区,逻辑卷建立在卷组VG之上。在逻辑卷LV之上可以建立文件系统(比如/home或者/usr等)。

物理块(Physical Extent,PE):每一个物理卷PV被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。所以物理卷(PV)由大小等同的基本单元PE组成。

逻辑块(Logical Extent,LE)LVM抽象模型:逻辑卷LV也被划分为可被寻址的基本单位,称为LE。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。

注:LVM的创建顺序一定是磁盘分区–>创建物理卷–>划分为卷组–>划分成逻辑卷–>格式化、挂载–>扩容。当然,后面我们会详细讲解LVM的创建过程。

LVM的优缺点

比起普通的硬盘分区管理方式,LVM更富于灵活性,优点如下:

  • 可以将多块硬盘看作一块大硬盘;
  • 使用逻辑卷(LV),可以创建跨越众多硬盘空间的分区;
  • 可以创建小的逻辑卷(LV),在空间不足时再动态调整它的大小;
  • 在调整逻辑卷(LV)大小时可以不用考虑逻辑卷在硬盘上的位置,不用担心没有可用的连续空间;
  • 可以在线(online)对逻辑卷(LV)和卷组(VG)进行创建、删除、调整大小等操作。不过LVM上的文件系统也需要重新调整大小,好在某些文件系统(例如ext4,xfs)也支持在线操作;
  • 无需重新启动服务,就可以将服务中用到的逻辑卷(LV)在线(online)/动态(live)迁移至别的硬盘上;
  • 允许创建快照,可以保存文件系统的备份,同时使服务的下线时间(downtime)降低到最小;
  • 支持各种设备映射目标(device-mapper targets),包括透明文件系统加密和缓存常用数据(caching of frequently used data)。这将允许你创建一个包含一个或多个磁盘、并用LUKS加密的系统,使用 LVM on top 可轻松地管理和调这些整独立的加密卷 (例如. /, /home, /backup等 ) 并免去开机时多次输入密钥的麻烦。

相反,LVM的缺点也很明显:

  • 在系统设置时需要更复杂的额外步骤;
  • Windows系统并不支持LVM,若使用双系统,你将无法在Windows上访问LVM分区。

LVM的结构

说了这么多、下面我们来看看LVM的结构。通常LVM会被组织为以下三种元素:

  • 卷(Volume):物理 和逻辑卷 和卷组;
  • 区段(Extent):物理 和逻辑区段;
  • 设备映射器(Device mapper):Linux 内核模块。

那么,什么是卷,区段和设备映射器呢?Linux LVM 把卷组织为物理卷(PV)、卷组(VG)和逻辑卷(LV)。物理卷是物理磁盘或物理磁盘分区(比如 /dev/hda 或 /dev/hdb1);卷组是物理卷的集合;而卷组又可以在逻辑上划分成多个逻辑卷。

例如下图中,物理磁盘 physical disk 0 上的所有四个分区(/dev/hda[1-4])以及完整的物理磁盘 1(/dev/hdb)和物理磁盘 2(/dev/hdd)被作为物理卷添加到卷组 VG0 中。这里我们创建了一个称为 LV0 的卷组,并给其他 LV 留下了一些空间(这些空间也可以用来应付 LV0 以后的增长)。

img

图:物理到逻辑卷的映射

注:卷组是实现 n-to-m 映射的关键(也就是,将 n 个 PV 看作 m 个 LV);在将 PV 分配给卷组之后, 就可以创建任意大小的逻辑卷(只要不超过 VG 的大小)。

在创建 LV 之后,我们就可以使用任何文件系统对它进行格式化并将它挂载在某个挂载点上,然后就可以开始使用它了。

img

图:物理卷到文件系统的映射

为了实现 n-to-m 物理到逻辑卷映射,PV 和 VG 的基本块必须具有相同的大小;这些基本块称为物理区段(PE)和逻辑区段(LE)。尽管 n 个物理卷映射到 m 个逻辑卷,但是 PE 和 LE 总是一对一映射的。

在使用 LVM 时,对于每个 PV/LV 的最大区段数量并没有限制。默认的区段大小是 4MB,对于大多数配置不需要修改这个设置,因为区段的大小并不影响 I/O 性能。但是,区段数量太多会降低 LVM 工具的效率,所以可以使用比较大的区段,从而降低区段数量。但是注意,在一个 VG 中不能混用不同的区段大小,而且用 LVM 修改区段大小是一种不安全的操作,会破坏数据。所以建议在初始设置时选择一个区段大小,以后不再修改。

不同的区段大小意味着不同的 VG 粒度。例如,如果选择的区段大小是 4GB,那么只能以 4GB 的整数倍缩小或扩展 LV。例如下图中,我们用 PE 和 LE 显示与前一个示例相同的布局(VG0 中的空闲空间也由空闲 LE 组成,尽管图中没有显示它们)。

img

图:物理到逻辑区段的映射

注:从上图的区段分配策略中可以看到,LVM 并非总是连续分配 PE;细节参见关于 lvm 的 Linux 手册页(见 参考资料 中的链接)。当然我们也可以设置不同的分配策略,但是一般不需要这么做,因为默认策略(名为一般分配策略(normal allocation policy))使用符合常规的规则,比如不把并行的条带放在同一物理卷上。

如果我们需要创建第二个LV(LV1),分配完成后的PE布局如下图所示:

img

图:物理到逻辑区段的映射

设备映射器(也称为 dm_mod)是一个 Linux 内核模块(也可以是内置的),最早出现在 2.6.9 内核中。它的作用是对设备进行映射 —— LVM2 必须使用这个模块。

在大多数主流发行版中,设备映射器会被默认安装,常常会在引导时或者在安装或启用 LVM2/EVMS 包时自动装载(EVMS 是一种替代 LVM 的工具)。如果没有启用这个模块,那么对 dm_mod 执行 modprobe 命令,在发行版的文档中查找在引导时启用它的方法:modprobe dm_mod。

在创建 VG 和 LV 时, 我们可以给它们起一个有意义的名称(而不是像前面的示例那样使用 VG0、LV0 和 LV1 等名称)。设备映射器的作用就是将这些名称正确地映射到物理设备。对于前面的示例,设备映射器会在 /dev 文件系统中创建下面的设备节点:

  • /dev/mapper/VG0-LV0
    • /dev/VG0/LV0 是以上节点的链接
  • /dev/mapper/VG0-LV1
    • /dev/VG0/LV1 是以上节点的链接

注:名称的格式标准为 /dev/{vg_name}/{lv_name} -> /dev/mapper/{vg_name}{lv_name}。与物理磁盘相反,无法直接访问卷组(这意味着没有 /dev/mapper/VG0 这样的文件,也不能执行 dd if=/dev/VG0 of=dev/VG1)。

LVM基本操作

在彻底了解了LVM的结构之后,下面我们一起来看看LVM的基本使用方法。LVM的常用基本操作包括创建、查看和删除。在开始操作之前我们需要提前准备两块硬盘并分区(添加硬盘这里就不再演示了,比如我们给虚拟机添加一块硬盘,给云主机添加一个存储硬盘等),这里我们给主机添加两块硬盘方便我们下面的试验(添加完成之后记得重启主机):

img

添加完成之后我们去主机上通过 fdisk -l 命令查看硬盘详情。我们可以看到、主机已经识别出我们刚才添加的两块200G的硬盘(实际磁盘大小比看到磁盘要小是因为计算方式不一样,这里不用纠结)、分别是/dev/sdc和/dev/ddb。现在我们开始对磁盘进行分区:img

我们直接输入 fdisk /dev/sdb ,fdisk /dev/sdc 命令分别对两块硬盘进行分区,进入之后我们可以通过m命令查看fdisk命令的子命令。输入命令p查看硬盘分区、我们可以看到当前硬盘并没有分区:

img

注:fdisk的交互操作方式下可以使用若干子命令如下:

  • a:调整硬盘的启动分区;
  • d:删除一个硬盘分区;
  • l:列出所有支持的分区类型;
  • m:列出所有命令;
  • n:创建一个新的分区;
  • p:列出硬盘分区表;
  • q:退出fdisk,不保存更改;
  • t:更改分区类型;
  • u:切换所显示的分区大小的单位;
  • w:把设置写入硬盘分区表,然后退出。

输入n创建一个新的磁盘分区;选择p创建主分区(p代表创建主分区,当然你也可以选择e创建延展分区,后面我们也会演示延展分区的用法);然后选择分区序号(这里因为是第一个,我们可以输入1,也可以直接回车默认),继续回车选择第一个扇区和最后一个扇区。我们可以看到系统提示分区1,类型Linux,大小为200GiB的分区已经设置成功;我们输入p查看当前分区,可以看到下面的分区/dev/sdb1已经出现了:

img

然后我们需要把分区格式调整为Linux LVM,继续输入命令 t 选择默认分区 1,然后输入命令 l 查看分区类型列表,这里我们可以看到Linux LVM的分区类型16进制编码为 8e ,输入 8e 我们可以看到,系统提示我们分区类型Linux已经修改为Linux LVM。当然,通过命令 p 我们也可以看到分区详情,输入 w 保存分区并退出(退出之后我们通过 fdisk -l 命令也可以看到分区详情):

img

img

注:若使用MBR,设置 分区类型为8e (在”fdisk”中为Linux LVM;若使用GPT, 设置分区类型为E6D6D379-F507-44C2-A23C-238F2A3DF928 (在”fdisk”中为Linux LVM;在”gdisk”中为8e00).

好了,分区创建完成以后我们就可以来创建PV物理卷,VG卷组和LV逻辑卷了。

PV物理卷操作

创建PV物理卷

创建PV物理卷的命令是 pvcreate /dev/sdb1 /dev/sdc1 ,pvcreate后面可以接多个分区:

img

查看PV物理卷

创建完PV物理卷之后,我们可以通过 pvs 命令看到PV的基础信息,如果想看PV的详细信息则需要通过 pvdisplay 命令来查看:

img

注:如果你用的是未格式化过且擦除块(erase block)大小小于1M的SSD,需要采用以下命令pvcreate –dataalignment 1m /dev/sda来设置对齐(alignment)。

PV物理卷相关操作命令如下:

  • pvchange:更改物理卷的属性;
  • pvc:用来检测物理卷的LVM元数据的一致性。默认情况下,物理卷中的前4个扇区保存着LVM卷标;
  • pvcreate:用于将物理硬盘分区初始化为物理卷,以便LVM使用;
  • pvdisplay:用于显示物理卷的属性 -s以短格式输出 -m:显示PE到LE的映射;
  • pvmove:移动物理区段;
  • pvremove:删除一个物理卷;
  • pvresize:根据LVM2调整磁盘或分区的大小;
  • pvs:报告关于物理卷的信息;
  • pvscan:扫描所有磁盘的物理卷。

VG卷组操作

创建VG卷组

创建完成物理卷(PV)之后,下一步就是在该物理卷创建卷组(VG)了。 首先必须先在其中一个物理卷(PV)创建一个卷组。创建VG卷组的命令是 vgcreate vg-sdb1 /dev/sdb1 ;创建VG卷组的命令格式如下:

# 创建VG卷组
vgcreate <volume_group> <physical_volume>

这里我们分别创建vg-sdb1和vg-sdc1(其中,“vg-sdb1和vg-sdc1”名字换成你自己起的名字即可):

img

注:你也可以创建多个的卷组,但这将使你的硬盘空间分布在不同(逻辑)磁盘上。

查看VG卷组

创建完PV物理卷之后,我们可以通过 vgs 命令看到VG的基础信息,如果想看VG的详细信息则需要通过 vgdisplay 命令来查看:

img

注:LVM支持将卷组与物理卷的创建聚合在一个命令中。例如,我们创建名为VolGroup00的卷组,可以执行下面的命令。该命令首先会在分区上创建物理卷(如果之前没有创建过),再创建一个包含三个物理卷的卷组。如果设备上已经存在文件系统,命令会提出警告:

vgcreate VolGroup00 /dev/sdb1 /dev/sdc1

VG卷组相关操作命令如下:

  • vgcfgbackup:备份卷组描述符区域;
  • vgcfgrestore:恢复卷组描述符区域;
  • vgchange:vgchange命令用于修改卷组的属性,经常被用来设置卷组是处于活动状态或非活动状态。处于活动状态的卷组无法被删除,必须使用vgchange命令将卷组设置为非活动状态后才能删除;例如: vgchange -ay vg1 #将卷组”vg1″设置为活动状态 (-an 设置为非活动状态 )。
  • vgck:检查卷组元数据;
  • vgconvert:转换卷组元数据格式;
  • vgcreate:用于创建LVM卷组;后面可以接如下参数:-l(卷组上允许创建的最大逻辑卷数);-p(卷组中允许添加的最大物理卷数);-s(卷组上的物理卷的PE大小);例如:vgcreate -s 16M vg1 /dev/sdb1;
  • vgdisplay:显示卷组的属性;
  • vgexport:Make volume Groups unknown to the system;
  • vgextend:向卷组中添加物理卷(PV)来增加卷组(VG)的容量;
  • vgimport:Make exported Volume Groups known to the system;
  • vgimportclone:导入和重命名重复的卷组(例如,硬件快照);
  • vgmerge:合并两个卷组;
  • vgmknodes:重新创建卷组目录和逻辑卷特殊文件;
  • vgreduce:删除LVM卷组中的物理卷来减少卷组容量;不能删除LVM卷组中剩余的最后一个物理卷;
  • vgremove:用于用户删除LVM卷组。当要删除的卷组上已经创建了逻辑卷时,vgremove命令需要进行确认删除,防止误删除数据;
  • vgrename:重命名卷组 例如:vgrename vg vg1 把vg的名字改为vg1;
  • vgs:报告有关卷组的信息;
  • vgscan:扫描所有磁盘的卷组并重新构建缓存;
  • vgsplit:将一个卷组分成两个,通过移动整个物理卷将任何逻辑卷从一个卷组移动到另一个卷组 ;

LV逻辑卷操作

创建LV逻辑卷

创建完卷组(VG)之后,就可以开始创建逻辑卷(LV)了。输入下面命令以指定新逻辑卷的名字、大小及其所在的卷组。命令格式为:

lvcreate -L <卷大小> <"卷组名> -n <卷名>

你可以指定一个或多个物理卷来限制LVM分配数据空间的位置。比如你希望在较小的SSD硬盘上创建根文件系统,并在较慢的机械硬盘上创建家目录卷,仅需把物理卷设备加入到命令中,例如:

lvcreate -L 100G vg-sdc1 -n lv-sdc1

如果你想让要创建的逻辑卷拥有卷组(VG)的所有未使用空间,请使用以下命令:

lvcreate -l +100%FREE  <volume_group> -n <logical_volume>

这里我们创建一个100G的 lv-sdb1 逻辑卷和一个100G的 lv-sdc1 逻辑卷:

img

img

该逻辑卷创建完后,你就可以通过 ls /dev/vg-sdb1/lv-sdb1 或 ls /dev/vg-sdc1/lv-sdc1 来查看它;与卷组命名类似,你可以按你的需要将逻辑卷命名。牢记一开始可以创建小一点的逻辑卷,在卷组里留下一部分未使用空间,以后就可以根据需要再作扩展了。

查看LV逻辑卷

创建完LV逻辑卷之后,我们可以通过 lvs 命令看到LV的基础信息,如果想看LV的详细信息则需要通过 lvdisplay 命令来查看:

img

注:为了使上述命令能正常运行,你可能需要加载device-mapper内核模块(请使用命令modprobe dm-mod)。

LV逻辑卷相关操作命令如下:

  • lvchange:更改逻辑卷的属性;
  • lvconvert:将逻辑卷从线性转换为镜像或快照;
  • lvcreate:用于创建LVM的逻辑卷. -L:指定逻辑卷的大小,单位为“kKmMgGtT”字节;-l:指定逻辑卷的大小(PE数);例如:lvceate [ -L l ] [-n LV 名称] VG 名称。
  • lvdisplay:显示逻辑卷的属性;
  • lvextend:在线扩展逻辑卷的空间大;
  • lvreduce:用于减少LVM逻辑卷占用的空间大小. 收缩逻辑卷的空间大小有可能会删除逻辑卷上已有的数据; -L:指定逻辑卷的大小,单位 为“kKmMgGtT”字节;-l:指定逻辑卷的大小(PE数);
  • lvmchange:更改逻辑卷管理器的属性;
  • lvmconfig:加载后显示配置信息;
  • lvmdiskscan:扫描LVM2可见的所有设备;
  • lvmdump:创建用于诊断目的的lvm2信息转储;
  • lvremove:删除一个LV;
  • lvrename:改LV名;
  • lvresize:对LV进行容量大小的调整;
  • lvs:报告有关逻辑卷的信息;
  • lvscan:扫描(所有磁盘)逻辑卷。

文件系统挂载

LV逻辑卷创建完成之后我们就可以在LV逻辑卷上面创建文件系统了;这里我们创建一个xfs类型的文件系统:

# mkfs.<类型> /dev/mapper/<卷组名>-<卷名>

img

LV逻辑卷挂载(临时挂载)

xfs文件系统创建完成之后,我们只需要将该文件系统挂载到任意的文件目录下面就可以使用了:

# mount /dev/mapper/<卷组名>-<卷名> <挂载点>
# mount /dev/vg-sdb1/lv-sdb1 /mnt

img

从上图我们可以看到,我们把 /dev/vg-sdb1/lv-sdb1 逻辑卷挂载到了 /mnt目录下面。但是为什么挂载名称和我们创建的LV逻辑卷名称不一致呢?我们通过 ls -l 命令来分别看看这两个逻辑卷的详细信息:

img

通过上面的信息我们可以看到、/dev/mapper/vg–sdb1-lv–sdb1 和 /dev/vg-sdb1/lv-sdb1 都同时指向了上级目录的 dm-3 文件;这也可以说明,/dev/mapper/vg–sdb1-lv–sdb1 和 /dev/vg-sdb1/lv-sdb1 本质上是一样的。

注:随着Linux的不断发展,它所支持的文件系统也在迅速扩充,Linux系统核心可以支持十多种文件系统类型:Btrfs、JFS、ReiserFS、exFAT、ext、ext2、ext3、ext4、XFS、ISO 9660、Minix、MSDOS、UMSDOS、VFAT、NTFS(Linux Kernel内置的NTFS驱动程序,写入功能不稳定)、HPFS、NFS、SMB、SysV、PROC等;感兴趣的小伙伴可以自行百度查看。

LV逻辑卷挂载(永久挂载)

通过上面的mount命令挂载之后、重启系统会丢失挂载信息。如果想要永久挂载、我们需要修改 /etc/fstab 文件并插入如下内容;如果有多条可以换行添加多条信息即可,然后我们可以重启主机并使用 df -h 命令查看一下挂载信息是否还在:

img

文件系统测试

文件系统挂载完成以后,我们去 /mnt 目录下面创建一个 a.txt 文件,并插入 “hello world” 的内容,我们可以看到文件系统已经可以正常写入:

img

删除相关操作

删除LV逻辑卷

我们可以通过 lvremove 删除LV逻辑卷,执行 lvremove /dev/vg-sdb1/lv-sdb1 命令我们发现系统提示我们文件系统正在使用中。我们需要先去卸载文件系统,通过 umount /mnt 命令卸载文件系统发现还是提示 umount: /mnt: target is busy. target繁忙无法卸载。这里我们需要用到一个工具 psmisc (没有安装的同学可以通过 yum install psmisc -y 命令自行安装)来杀掉后台进程,执行 fuser -mv -k /mnt 然后再次进入命令行状态:

img

我们再次使用 umount /mnt 命令卸载文件系统发现已经可以正常卸载了。然后我们直接使用 lvremove /dev/vg-sdb1/lv-sdb1 命令删除LV逻辑卷(删除逻辑卷的同是,文件也会被之前创建的 a.txt 文件也会被同时删除),删除完成以后我们执行 lvs 可以看到 lv-sdb1 LV逻辑卷已经成功删除:

img

删除VG卷组

然后我们来删除VG卷组,执行 vgremove vg-sdb1 命令直接删除VG卷组,然后通过vgs命令查看是否删除成功:

img

删除PV物理卷

我们继续删除PV物理卷,执行 pvremove /dev/sdb1 命令阐述PV物理卷,然后通过 lvs 命令查看是否删除成功:

img

好了,到这里我们就讲完了LVM的基本操作,感兴趣的小伙伴赶紧去试试吧。

推荐文章