1. 基础概念

LVM利用Linux内核的device-mapper来实现存储系统的虚拟化(系统分区独立于底层硬件)。 通过LVM , 你可以实现存储空间的抽象化并在上面建立虚拟分区 ( virtual partitions ) , 可以更简便地扩大和缩小分区 , 可以增删分区时无需担心某个硬盘上没有足够的连续空间。

LVM的基本组成块 ( building blocks ) 如下:

  • 物理卷Physical volume (PV) : 可以在上面建立卷组的媒介 , 可以是硬盘分区 , 也可以是硬盘本身或者回环文件(loopback file ) 。物理卷包括一个特殊的header , 其余部分被切割为一块块物理区域 ( physical extents ) 。

  • 卷组Volume group (VG) : 将一组物理卷收集为一个管理单元。

  • 逻辑卷Logical volume (LV) : 虚拟分区 , 由物理区域 ( physical extents ) 组成。

  • 物理区域Physical extent (PE) : 硬盘可供指派给逻辑卷的最小单位 ( 通常为4MB ) 。

  • 逻辑存储单元logical extent(LE): PE是物理存储单元 , 而LE则是逻辑存储单元 , 也即为lv中的逻辑存储单元 , 和pe的大小是一样的。从vg中划分lv , 实际上是从vg中划分vg中的pe , 只不过划分lv后它不再称为pe , 而是成为le。`

  • dm(device mapper) : 将一个或多个底层块设备组织成一个逻辑设备的模块

linux 中设备名 : /dev/dm-# 。为了方便使用 , LVM 存在两个软链接

  1. /dev/mapper/VG_NAME-LV_NAME

  2. /dev/VG_NAME/LV_NAME

1.1 物理卷

LVM 逻辑卷的基本物理存储单元是块设备 , 比如一个分区或者整个磁盘。要将设备作为 LVM 逻辑卷使用 , 需要首先将其初始化为物理卷 (PV ) 。将块设备初始化为物理卷会在接近设备起始的位置放置一个标签。

默认情况下 ,LVM 标签是放在第二个 512 字节扇区。在创建物理卷时 , 您可以将标签放置在前 4 个扇区的任何一个上 , 来覆盖此默认设置。如果需要 ,LVM 卷可与其它使用这些扇区的用户共同存在。

LVM 标签为物理设备提供正确的识别和设备排序 , 因为在系统启动时设备可以以任何顺序出现。LVM 标签在重新引导时具有持久性并在整个集群中可用。

LVM 标签可将该设备识别为LVM 物理卷。它包含物理卷的随机唯一识别符 (UUID ) 。它还以字节为单位保存块设备的大小 , 并记录 LVM 元数据存储在该设备中的位置。

LVM 元数据包含您系统中LVM卷组的配置详情。默认情况下 , 卷组中的每个物理卷的元数据区域都会保留一个一样的元数据副本。LVM 元数据很小 , 它以 ASCII 格式保存。

目前 , LVM 允许您在每个物理卷中保存 0、1 或者 2 个元数据副本。默认为 1 个副本。当您在物理卷中配置元数据副本数后 , 您将无法再更改该号码。第一个副本保存在设备的起始位置 , 紧随在标签后面。如果有第二个副本 , 会将其放在设备的末尾。如果您不小心写入了不同于您想要写入的磁盘覆盖了磁盘起始部分 , 那么您可以使用在设备末尾的元数据的第二个副本恢复元数据。

1.1.1 LVM物理卷布局

图中显示LVM物理卷的布局。LVM标签在第二个扇区 , 接下来是元数据区域 , 后面是设备的可用空间。

physvol

注: 在Linux内核中 ( 以及整个此文档中 ) ,每个扇区的大小为 512K。

1.1.2 一个磁盘上的多个分区

LVM允许您在磁盘分区外创建物理卷。建议您创建一个覆盖整个磁盘的单一分区 , 将其标记为LVM物理卷 , 理由如下:

  • 方便管理

    如果每个真实磁盘只出现一次 , 那么在系统中追踪硬件就比较容易。特别是当磁盘失败时。另外 , 单一磁盘中有多个物理卷可导致内核在引导时发出未知分区类型警告。

  • 条带化性能

    LVM无法告知两个物理卷位于同一个物理磁盘中。如果您在两个物理卷位于同一物理磁盘时创建了条状逻辑卷 , 那么条带就可能在同一磁盘的不同分区中。这可能会降低性能 , 而不是提高性能。

虽然不建议您这样做 , 但在某些情况下可能需要将磁盘分成独立的 LVM 物理卷。例如 : 在有多个磁盘的系统中 , 当您要将现有系统迁移到 `LVM 卷时 , 可能需要将数据在分区间转移。另外 , 如果您有一个很大的磁盘 , 并且因为管理的原因想要有一个以上卷组 , 那么对磁盘进行分区是很必要的。如果您的磁盘有一个以上的分区 , 且这些分区在同一卷组中, 在创建条状卷时指定逻辑卷中应包含哪些分区。

1.2 卷组

物理卷合并为卷组(VG)。这样就创建了一个磁盘空间池 , 可使用它分配逻辑卷。

在卷组中 , 可用于分配的磁盘空间被分成固定大小的单元 , 我们称之为扩展。一个扩展就是可被分配的最小空间单位。在物理卷中 , 扩展被称为物理扩展。

逻辑卷被分配成与物理卷扩展大小相同的逻辑扩展。因此卷组中的所有逻辑卷的扩展大小都是一样的。卷组将逻辑扩展与物理扩展匹配。

1.3 逻辑卷

在 LVM 中 , 卷组被分成逻辑卷。下面的部分描述了不同类型的逻辑卷类型。

1.3.1. 线性卷

线性卷将来自一个或多个物理卷的空间集合到一个逻辑卷中。例如 : 如果您有两个 60GB 的磁盘 , 您可以创建一个 120GB 的逻辑卷。物理存储是连在一起的。

创建一个线性卷 , 按顺序为逻辑卷的区域分配物理扩展范围。例如 : 如 图 1.1“扩展映射”中所示 , 逻辑扩展 1 到 99 可映射到一个物理卷 , 逻辑扩展 100 到 198 可映射到第二个物理卷。从应用程序的角度来看 , 它是一个大小为 198 个扩展的设备。

图 1.1 扩展映射

extent-map

构成逻辑卷的物理卷大小应该相同。图 1.2 “具有不等物理卷的线性卷” 显示了物理扩展大小为 4MB 的卷组 VG1。这个卷组包括2 个物理卷 , 名为 PV1 和 PV2。物理卷被分成 4MB 单元 , 因为这是扩展的大小。在本例中 , PV1 的大小为200 个扩展(800MB) , PV2 的大小为 100 个扩展(400MB)。您可以创建一个大小在1 到 300 个扩展 ( 4MB 到 1200MB ) 的线性卷。在这个示例中 , 名为 LV1 的线性卷的大小为300 个扩展。

图 1.2 具有不等物理卷的线性卷

uneven_pvs

您可以从物理区块池中配置多个所需大小的线性逻辑卷。图 1.3 “多个逻辑卷”显示与 图 1.2 “具有不等物理卷的线性卷”中相同的卷组 , 但在这个示例中 , 有两个逻辑卷已从卷组中分离出来 : LV1 , 大小为 250 个扩展(1000MB)和 LV2 , 大小为 50 个扩展(200MB)。

图 1.3 多个逻辑卷

uneven_vols

1.3.2 条带逻辑卷

当您向 LVM 逻辑卷写入数据时 , 文件系统会在基本物理卷之间部署数据。您可以通过创建一个条状逻辑卷来控制将数据写入物理卷的方法。对于大量连续的读取和写入 , 这样可以提高数据输入/输出的效率。

条状化通过以循环模式向预定数目的物理卷写入数据来提高性能。使用条状化 , I/O 可以并行执行。在某些情况下 , 这可能会为条状中的每个额外物理卷增加近线性能。

以下示例显示数据在三个物理卷之间进行条状分布。在这个图表中 :

  • 数据的第一条写入第一个物理卷

  • 数据的第二条写入第二个物理卷

  • 数据的第三条被写入第三个物理卷

  • 数据的第四条写入第一个物理卷

在条状逻辑卷中 , 条的大小不能超过扩展的大小。

图 1.4. 跨三个 PV 的条状数据

stripedvol

通过将另一组设备连接到第一个集合的末尾 , 可以扩展条状逻辑卷。要扩展条状逻辑卷 , 在基本物理卷集合中必须有足够的可用空间组成卷组来支持条带。例如 : 如果您有一个双向条带使用了整个卷组 , 那么向卷组中添加单一物理卷不会允许您扩展条带。反之 , 您必须在卷组中添加至少两个物理卷。

1.3.3 RAID逻辑卷

LVM 支持 RAID0/1/4/5/6/10。LVM RAID 卷有以下特征 :

  • LVM 使用 MD 内核驱动程序来创建和管理 RAID 逻辑卷。

  • RAID1 镜像可以从阵列中临时分离出来 , 之后再合并回阵列。

  • LVM RAID 卷支持快照。

1.3.4 精简配置的逻辑卷(精简卷)

逻辑卷可以使用精简模式置备。这可让您创建大于可用扩展的逻辑卷。使用精简配置 , 您可以管理一个空闲空间的存储池 , 称为精简池 , 可在应用程序需要时将其分配给任意数量的设备。然后 , 当应用程序实际写入逻辑卷时 , 您可以创建可绑定到精简池的设备以便以后分配。可在需要时动态扩展精简池 , 以便有效分配存储空间。

注 : 不支持集群中跨节点的精简卷。精简池及其所有精简卷必须只在一个集群节点中单独激活。

通过使用精简配置 , 存储管理员可过量使用物理存储 , 从而避免购买额外的存储。例如 : 如果 10 个用户为每个应用程序请求一个 100GB 文件系统 , 存储管理员可以为每个用户创建一个100GB 文件系统 , 但其后端的实际存储可以小于这个大小 , 它在需要时才使用实际的存储。

注 : 在使用精简配置时 , 存储管理员务必要监控存储池 , 并在其被完全占用时添加更多容量。

要确定可以使用所有可用空间 ,LVM支持数据丢弃功能。这允许重复使用丢弃文件或其他块范围使用的空间。

精简卷支持新的复制时写入(COW)快照逻辑卷部署 , 这将允许很多虚拟设备在精简池中共享相同数据。

1.3.5 快照卷

LVM 快照功能提供在特定时间创建设备的虚拟镜像且不会造成服务中断的功能。在提取快照后 , 当对原始设备进行修改时 , 快照功能会生成有变化的数据区域的副本 , 以便重建该设备的状态。

注意 :

LVM 支持精简配置的快照。

不支持集群中跨节点的 LVM 快照。您不能在集群卷组中创建快照卷。

因为快照只复制创建快照后修改的数据区域 , 快照功能需要的存储空间较小。例如 , 在很少更新的原始卷中 , 原始容量的 ``` 就足以维护快照。

注 : 文件系统的快照副本是虚拟副本 , 不是文件系统的实际介质备份。快照不能替代备份。

预留用来存储原始卷更改的空间的大小取决于快照的大小。例如 : 如果您要创建快照 , 且要完全覆盖原始卷 , 则快照必须至少与原始卷大小方可保存更改。您需要根据预期的更改程度调整快照大小。例如 , 一个以读为主的卷的短期快照 , 如 /usr , 与有大量写操作的卷的长期快照相比 , 如 /home , 需要较少的空间。

如果快照已满 , 则快照就会变得无效 , 因为它无法跟踪原始卷中的更改。您应该定期监控快照的大小。快照可以完全重新定义大小 , 因此如果您有存储容量 , 则可以增大快照卷以避免丢失快照。另外 , 如果您发现快照卷超过您的需要 , 您可以减小卷的大小来为其它逻辑卷最大限度腾出空间。

当您创建快照文件系统时 , 仍可对原始系统有完全的读和写访问。如果更改了快照中的块 , 则会标记那个块 , 永远不会从原始卷中复制该块。

快照有几个用途 :

  • 最典型的是。当您需要在逻辑卷中执行备份而不停止持续更新数据的 Live 系统时会提取快照。

  • 您可以对快照文件系统执行 fsck 命令 , 来检查文件系统的完整性 , 并确定原始文件系统是否需要文件系统修复。

  • 因为快照是可读/写的 , 您可以根据产品数据测试应用程序 , 方法是提取一个快照并根据快照运行测试 , 从而不会影响真实数据。

  • 您可以为虚拟机 创建 LVM 卷。LVM 快照可用来创建虚拟客体镜像的快照。这些快照可方便修改现有客户虚拟机或者使用最小附加存储创建新客户虚拟机。可以使用快照功能来备份虚拟机的储存后端 , 或测试对虚拟机映像 ( 例如用于修补程序或升级 ) 进行的更改 , 而不必修改来源逻辑卷。虚拟机必须将 LVM 逻辑卷用做其储存后端 , 以免使用虚拟磁盘文件。您可以装载 LVM 逻辑卷 , 并将它用做文件型磁盘来储存虚拟机映像;也可以指派 LVM 逻辑卷做为物理磁盘 , 以便将其视为块设备进行写入操作。

您可以使用 lvconvert 命令的 --merge 选项将快照合并到其原始卷中。这个功能的一个作用是在您丢失数据或者文件或者需要将系统恢复到之前的状态时执行系统恢复。合并快照卷后 , 得到的逻辑卷将具有原始卷的名称、次号码和 UUID , 且合并的快照被删除

1.3.6 精简配置的快照卷

CentOS支持精简配置的快照卷。精简快照卷允许将很多虚拟设备保存在同一个数据卷中。这简化了管理过程 , 并允许在快照卷间共享数据。

除了所有 LVM 快照卷以及所有精简卷一样 , 集群的节点不支持精简快照卷。快照卷必须在一个集群节点中完全激活。

精简快照卷提供以下优点 :

  • 当有相同原始卷的多个快照时 , 精简快照卷就可以减少磁盘用量。

  • 如果同一来源有多个快照 , 对原始卷的写入会导致COW操作保留数据。增加原始卷的快照数量应该不会造成很大的性能下降。

  • 精简快照卷可用于另一个快照的逻辑卷来源。这允许任意深度的递归快照 ( 快照的快照... ) 。

  • 精简逻辑卷的快照也创建一个精简逻辑卷。在要求 COW 操作前 , 或直到快照已写入前 , 并不会消耗数据空间。

  • 精简快照卷不需要使用原始卷激活 , 因此当原始快照卷有很多不活跃时 , 用户可能只激活原始卷。

  • 当您删除精简置备快照卷的原始卷时 , 该原始卷的每个快照都会变为独立的精简置备卷。这意味着 , 您不需要将快照与原始卷合并 , 而不必选择删除原始卷 , 然后使用该独立卷作为新快照的原始卷创建新置备快照。

虽然使用精简快照卷有很多优点 , 但在有些情况下 , 旧的 LVM 快照卷功能可能更适合您的需要 :

  • 您不能更改精简池的块大小。如果精简池的块大小较大 ( 例如 : 1MB ) ,且您需要一个短期存在的快照且使用大块的效率不高时 , 可以选择使用旧的快照功能。

  • 您不能限制精简快照卷的大小 ; 如果需要 , 快照将使用精简池中所有空间。这可能不适用于您的需要。

一般说来 , 在决定使用什么快照格式时 , 您应该考虑具体的要求。

1.3.7 缓存卷

LVM支持使用快速块设备(如SSD驱动器)作为大型慢块设备的 write-back 或 write-through 缓存。用户可以创建缓存逻辑卷来提高其现有逻辑卷的性能 , 或者创建由小而快速的设备组成的新缓存逻辑卷 , 再加上一个大型、较慢的设备。

2. LVM写入机制

LV是从VG中划分出来的 , LV中的PE很可能来自于多个PV。在向LV存储数据时 , 有多种存储机制 , 其中两种是 :

  • 线性模式(linear) : 先写完来自于同一个PV的PE , 再写来自于下一个PV的PE。

  • 条带模式(striped) : 一份数据拆分成多份 , 分别写入该LV对应的每个PV中 , 所以读写性能较好 , 类似于RAID 0。

尽管striped读写性能较好也不建议使用该模式 , 因为lvm的着重点在于弹性容量扩展而非性能 , 要实现性能应该使用RAID来实现 , 而且使用striped模式时要进行容量的扩展和收缩将比较麻烦。默认的是使用线性模式。

3. LVM使用

在通过磁盘创建LVM时 , 需要在修改分区本身的分区类别 , 如果直接使用磁盘 , 则不需要修改。LVM的分区类型为 : 8e。

3.1 物理卷(PV)

3.1.1 显示pv信息

用于显示pv信息的命令有:pvs,pvscan,pvdisplay

  • pvs : 显示物理卷的概要信息

    [root@localhost ~]# pvs
      PV         VG       Fmt  Attr PSize  PFree
      /dev/sda2  VolGroup lvm2 a--u 19.51g    0 
      /dev/sdb1  vg0      lvm2 a--u  5.01g 8.00m
      /dev/sdc1  vg0      lvm2 a--u  5.01g 5.01g
      /dev/sdd1  vg0      lvm2 a--u  5.01g 5.01g
      /dev/sde1  vg0      lvm2 a--u  5.01g 5.01g
  • pvscan : 扫描系统中连接的所有硬盘 , 列出找到的物理卷列表

    • -n : 仅显示不属于任何卷组的物理卷;

    • -u : 显示UUID;

    • -b : 后台运行

    [root@localhost ~]# pvscan -u
      PV /dev/sdb1 with UUID rvCk7p-MunV-2rbS-Ciwl-5zVX-USHk-0ue8Hi    VG vg0             lvm2 [5.01 GiB / 8.00 MiB free]
      PV /dev/sdc1 with UUID uEZ433-e2ou-QjwG-Faqb-OKPu-09fM-RpKF2e    VG vg0             lvm2 [5.01 GiB / 5.01 GiB free]
      PV /dev/sdd1 with UUID MM6l3C-7Okj-eYSX-PdIu-2Xki-ZnOi-u9wmUj    VG vg0             lvm2 [5.01 GiB / 5.01 GiB free]
      PV /dev/sde1 with UUID BksyNI-HUjB-0hSV-egHG-3GDw-BPkZ-S5Pand    VG vg0             lvm2 [5.01 GiB / 5.01 GiB free]
      PV /dev/sda2 with UUID 0flXKZ-P8ZB-at1K-pmnr-XTIf-LimS-i05Tn6    VG VolGroup        lvm2 [19.51 GiB / 0    free]
      Total: 5 [39.54 GiB] / in use: 5 [39.54 GiB] / in no VG: 0 [0   ]
    [root@localhost ~]# pvscan 
      PV /dev/sdb1   VG vg0             lvm2 [5.01 GiB / 8.00 MiB free]
      PV /dev/sdc1   VG vg0             lvm2 [5.01 GiB / 5.01 GiB free]
      PV /dev/sdd1   VG vg0             lvm2 [5.01 GiB / 5.01 GiB free]
      PV /dev/sde1   VG vg0             lvm2 [5.01 GiB / 5.01 GiB free]
      PV /dev/sda2   VG VolGroup        lvm2 [19.51 GiB / 0    free]
      Total: 5 [39.54 GiB] / in use: 5 [39.54 GiB] / in no VG: 0 [0   ]
  • pvdisplay :显示的详细物理卷信息包括 : 物理卷名称、所属的卷组、物理卷大小、PE大小、总PE数、可用PE数、已分配的PE数和UUID。

    • -m : 显示PE到LE的映射。

    [root@localhost ~]# pvdisplay  /dev/sdb1
      --- Physical volume ---
      PV Name               /dev/sdb1
      VG Name               vg0
      PV Size               5.01 GiB / not usable 2.10 MiB
      Allocatable           yes 
      PE Size               4.00 MiB
      Total PE              1282
      Free PE               2
      Allocated PE          1280
      PV UUID               rvCk7p-MunV-2rbS-Ciwl-5zVX-USHk-0ue8Hi
    [root@localhost ~]# pvdisplay  /dev/sdb1  -m
      --- Physical volume ---
      PV Name               /dev/sdb1
      VG Name               vg0
      PV Size               5.01 GiB / not usable 2.10 MiB
      Allocatable           yes 
      PE Size               4.00 MiB
      Total PE              1282
      Free PE               2
      Allocated PE          1280
      PV UUID               rvCk7p-MunV-2rbS-Ciwl-5zVX-USHk-0ue8Hi
       
      --- Physical Segments ---
      Physical extent 0 to 1279:
        Logical volume	/dev/vg0/lv0
        Logical extents	0 to 1279
      Physical extent 1280 to 1281:
        FREE

3.1.2 创建PV

使用pvcreate 命令创建pv

  • -f : 强制创建物理卷 , 不需要用户确认;

  • -u : 指定设备的UUID;

  • -y : 所有的问题都回答“yes”

[root@localhost ~]# pvcreate /dev/sd{b,c,d,e}1
  Physical volume "/dev/sdb1" successfully created
  Physical volume "/dev/sdc1" successfully created
  Physical volume "/dev/sdd1" successfully created
  Physical volume "/dev/sde1" successfully created

3.1.3 删除pv

使用pvremove命令删除对应的pv

用于删除一个存在的物理卷

  • -f : 强制删除;

  • -y : 对提问回答“yes”。

[root@localhost ~]# pvremove /dev/sd{b,c,d,e}1
  Labels on physical volume "/dev/sdb1" successfully wiped
  Labels on physical volume "/dev/sdc1" successfully wiped
  Labels on physical volume "/dev/sdd1" successfully wiped
  Labels on physical volume "/dev/sde1" successfully wiped

3.1.4 移动pv中的数据

使用pvmove

  • 语法 : pvmove [选项] [源PV] [目标PV...]

  • 迁移范围控制

    • [源PV] : 指定要清空的物理卷(如 /dev/sdb1 ) 。若不指定 , 则迁移所有标记为不可分配(pvchange -x n )的 PV。

    • [目标PV...] : 指定数据迁移的目标位置。若省略,LVM 自动选择 VG 中其他可分配的 PV。

  • 选项

    • -n vgname :仅移动vgname对应区域的数据 仅迁移指定逻辑卷(LV)在该源PV 上的数据 , 而非整个PV

      pvmove -n vgname /dev/sdb1 
      #将sdb1中属于vgname的数据移动到vgname逻辑卷的其他区域
    • -i ,--interval : 设置进度报告间隔(秒) , 后台运行时用于监控

      pvmove -i 5 /dev/sdb1  # 每5秒输出进度
    • -b , --background : 后台运行模式。命令立即返回 , 迁移过程在后台继续 , 适合大规模迁移避免终端断开

    • --atomic : 原子迁移模式。确保迁移过程要么完全成功 , 要么完全回滚,避免数据不一致(需要内核支持 , 较新版本提供)

    • -v ,--verbose : 详细模式 , 显示迁移的详细进度和映射变化。

    • --alloc : 控制分配策略(如 contiguous 、 anywhere 、 cling ) , 影响目标PE 的选择方式。

    • -t ,--test : 模拟运行(Dry Run)。显示将要执行的操作 , 但不实际移动数据:

示例:

更换硬盘

# 1. 标记源 PV 为不可分配(防止新数据写入)
pvchange -x n /dev/sdb1

# 2. 检查 VG 是否有足够空闲空间(或添加新硬盘)
vgs vg0  # 确认 Free PE 足够

# 3. 执行迁移(自动选择目标)
pvmove /dev/sdb1

# 4. 确认完成后,从 VG 移除旧硬盘
vgreduce vg0 /dev/sdb1
pvremove /dev/sdb1

3.1.5 扩展pv

pvresize :扩展本身的空间

[root@localhost ~]# pvcreate /dev/sde
  Physical volume "/dev/sde" successfully created
[root@localhost ~]# pvs /dev/sde
  PV         VG   Fmt  Attr PSize  PFree 
  /dev/sde        lvm2 ---- 40.00g 40.00g
#之后虚拟机扩展硬盘本身空间到50G  
[root@localhost ~]# pvresize /dev/sde
  Physical volume "/dev/sde" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized
[root@localhost ~]# pvs /dev/sde
  PV         VG   Fmt  Attr PSize  PFree 
  /dev/sde        lvm2 ---- 50.00g 50.00g

3.1.6 修改pv信息

pvchange:允许管理员改变物理卷的分配许可。如果物理卷出现故障 , 可以使用pvchange命令禁止分配物理卷上的PE。

  • -u : 生成新的UUID ;

  • -x : 是否允许分配对应磁盘的PE空间。

[root@localhost ~]# pvchange -u /dev/sde
  Physical volume "/dev/sde" changed
  1 physical volume changed / 0 physical volumes not changed
[root@localhost ~]# blkid /dev/sde
/dev/sde: UUID="eLC0Ea-brQU-bDJ6-DylC-c2yL-AcqG-0heGXE" TYPE="LVM2_member" 
[root@localhost ~]# pvchange -x n /dev/sde
  Allocatability not supported by orphan lvm2 format PV /dev/sde
  Physical volume /dev/sde not changed
  0 physical volumes changed / 1 physical volume not changed
[root@localhost ~]# pvchange -x y /dev/sde
  Allocatability not supported by orphan lvm2 format PV /dev/sde
  Physical volume /dev/sde not changed
  0 physical volumes changed / 1 physical volume not changed

3.2 卷组(VG)

3.2.1 创建VG

vgcreate:用于创建LVM卷组

  • -l : 卷组上允许创建的最大逻辑卷(lv)数;

  • -p : 卷组中允许添加的最大物理卷(pv)数;

  • -s : 卷组上的物理卷的PE大小。 示例:

[root@localhost ~]# vgcreate -p 3 -l 1 vg0 /dev/sdb1 /dev/sdc1 /dev/sde  /dev/sdd1 
  No space for '/dev/sdd1' - volume group 'vg0' holds max 3 physical volume(s).
  Unable to add physical volume '/dev/sdd1' to volume group 'vg0'.
[root@localhost ~]# vgcreate -p 3 -l 1 vg0 /dev/sdb1 /dev/sdc1 /dev/sde  
  Volume group "vg0" successfully created
[root@localhost ~]# lvcreate -L 5G -n lv0 vg0 
  Logical volume "lv0" created.
[root@localhost ~]# lvcreate -L 5G -n lv1 vg0 
  Maximum number of logical volumes (1) reached in volume group vg0
[root@localhost ~]# 

如果默认扩展大小不合适 , 您可以在 vgcreate 命令中使用 -s 选项 , 来指定扩展大小。您可以使用 vgcreate 命令的 -p 和 -l 参数来限制卷组的物理或者逻辑卷数量。

默认情况下 , 卷组根据常识分配物理扩展 , 比如不会将平行条带放在同一个物理卷中。这是正常的 分配策略。您可以使用 vgcreate 命令的 --alloc 参数指定相邻、任何位置的分配策略 , 或显示。 通常 , 只在特殊情况下需要指定不 常规 或非标准扩展分配时 , 才需要常规的分配。

3.2.2 LVM 分配

当LVM操作需要为一个或多个逻辑卷分配物理扩展时 , 分配过程如下:

  • 针对考虑 , 生成卷组中的未分配物理扩展的完整物理扩展集合。如果您在命令行末尾提供任意物理扩展范围 , 则只考虑指定物理卷中的未分配物理扩展。

  • 每个分配策略依次尝试 , 从最严格策略(连续)开始 , 并以使用 --alloc 选项指定的分配策略结束 , 或者设置为特定逻辑卷或卷组的默认设置。对于每个策略 , 使用需要填充的空逻辑卷空间的最小数值逻辑扩展进行工作 , 并尽量根据分配策略实施的限制分配空间。如果需要更多空间 , LVM会进入下一个策略。

分配策略的限制如下 :

  • 连续 分配政策要求任何逻辑扩展的物理位置不是逻辑卷的第一个逻辑扩展 , 而逻辑卷的前一个逻辑扩展就立即与逻辑扩展的物理位置相邻。

    当逻辑卷为条带或镜像时 , 连续分配限制将独立应用于每个需要空间的条状或镜像镜像(leg)。

  • 有情况的 分配策略 要求将用于任何逻辑卷的物理卷添加到现有逻辑卷中之前被一个逻辑卷使用。如果两个物理卷中都定义了配置参数 allocation/cling_tag_list , 那么如果两个物理卷上都存在任何列出的标签, 则两个物理卷将被视为匹配。这允许对有类似属性(比如其物理位置)的物理卷组进行标记并视为分配的目的。

    当逻辑卷是条带的或镜像时 , 说明分配限制将独立应用于每个需要空间的条状或镜像镜像(leg)。

  • 常规的分配策略将不会选择与已分配给并行逻辑卷(即不同的条状或者镜像镜像镜像/leg)相同的物理卷的物理范围。

    当与逻辑卷同时分配镜像日志来保存镜像数据时,正常的 分配策略首先会尝试为日志和数据选择不同的物理卷。如果这无法实现 , 并且 allocation/mirror_logs_require_separate_pvs 配置参数被设置为 0 , 则它将允许日志与部分数据共享物理卷。

    同样 , 在分配精简池元数据时 , 普通的 分配策略会遵循与分配镜像日志相同的注意事项 , 具体取决于 allocation/thin_pool_metadata_require_separate_pvs 配置参数。

  • 如果有足够的可用扩展来满足分配请求 , 但通常分配策略不使用它们 , 那么在分配策略时 , 即使这样会将两个条带放在同一个物理卷中来降低性能。

可使用 vgchange 命令更改分配策略。

注意

如果您使用没有包括在此文档中的分配策略 , 应该注意 , 它们的行为在将来的版本中可能会改变。例如 : 如果您在命令行中提供两个空物理卷 , 它们有相同数量的可用物理扩展可用于分配 ,LVM当前会以它们列出的顺序处理它们 , 但不保证在将来的版本中这个行为不会有变化。如果为特定逻辑卷获取特定布局非常重要 , 那么您应该通过 lvcreate 和 lvconvert 步骤构建它 , 以便应用到每一步骤的分配策略不会在布局中自由裁量。

3.2.3 查看vg信息

  • vgs: 命令以可配置的形式提供卷组信息 , 每行显示一个卷组。vgs 命令提供大量格式控制 , 对脚本很有用。

    [root@localhost ~]# vgs
      VG       #PV #LV #SN Attr   VSize  VFree 
      VolGroup   1   2   0 wz--n- 19.51g     0 
      vg0        3   1   0 wz--n- 60.01g 55.01g
  • vgscan : 命令扫描卷组的所有磁盘并重建 LVM 缓存文件 , 也会显示卷组。

    [root@localhost ~]# vgscan
      Reading all physical volumes.  This may take a while...
      Found volume group "vg0" using metadata type lvm2
      Found volume group "VolGroup" using metadata type lvm2
  • vgdisplay : 以固定格式显示卷组属性(如大小、扩展、物理卷数目等等)。

    • -s : 使用短格式输出的信息。

    [root@localhost ~]# vgdisplay vg0
      --- Volume group ---
      VG Name               vg0
      System ID             
      Format                lvm2
      Metadata Areas        3
      Metadata Sequence No  2
      VG Access             read/write
      VG Status             resizable
      MAX LV                1
      Cur LV                1
      Open LV               0
      Max PV                3
      Cur PV                3
      Act PV                3
      VG Size               60.01 GiB
      PE Size               4.00 MiB
      Total PE              15363
      Alloc PE / Size       1280 / 5.00 GiB
      Free  PE / Size       14083 / 55.01 GiB
      VG UUID               QmnfQY-xKbj-7uUV-H0uZ-b4Lu-SA9p-2iPYDm

3.2.4 删除卷组

  • vgremove : 用于用户删除LVM卷组

    • -f: 强制删除

[root@localhost ~]# vgremove vg0
  WARNING: Locking disabled. Be careful! This could corrupt your metadata.
Do you really want to remove volume group "vg0" containing 1 logical volumes? [y/n]: y
  Logical volume "lv0" successfully removed
  Volume group "vg0" successfully removed
​

3.2.5 重命名卷组

  • vgrename : 重命名卷组的名称

[root@localhost ~]# vgrename vg0 vg100
  WARNING: Locking disabled. Be careful! This could corrupt your metadata.
  Volume group "vg0" successfully renamed to "vg100"
​

3.2.6 修改卷组的属性

  • vgchange : 更改vg属性

3.2.6.1 激活和取消激活卷组

  • -a y|n : 设置卷组活动状态,y:表示激活,n:表示非激活状态

当您创建卷组时 , 默认激活它。这意味着 , 此组中的逻辑卷可以访问并可能被更改。

有一些情况需要您使卷组不活跃 , 从而可以在内核中未知。要停用或激活卷组 , 请使用 vgchange 命令的 -a (--available)参数。

下例取消激活了卷组 my_volume_group。

# vgchange -a n my_volume_group

如果启用了集群锁定 , 请添加"e"以仅在一个节点或"l"中激活或取消激活卷组 , 以仅在本地节点上激活或/停用卷组。具有单主机快照的逻辑卷总是被完全激活 , 因为它们一次只能在一个节点中使用。

您可以使用 lvchange 命令取消激活独立逻辑卷 ,

[root@localhost ~]# vgchange -an vg100
  WARNING: Locking disabled. Be careful! This could corrupt your metadata.
  0 logical volume(s) in volume group "vg100" now active
[root@localhost ~]# vgchange -ay vg100
  WARNING: Locking disabled. Be careful! This could corrupt your metadata.
  1 logical volume(s) in volume group "vg100" now active
​

3.2.6.2 更改卷组属性

vgchange 命令用于停用和激活卷组。您还可以使用此命令更改现有卷组的多个卷组参数。

以下命令将卷组 vg00 的最大逻辑卷数更改为 128。

# vgchange -l 128 /dev/vg00

3.2.7 导入导出卷组

主要用于将卷组更换主机时使用

  • vgexport :导出卷组

  • vgimport : 导入卷组

要从一个系统移动卷组到另一个系统 , 执行以下步骤 :

  1. 确定没有用户正在访问卷组中激活卷中的文件 , 然后卸载逻辑卷。

  2. 使用 vgchange 命令的 -a n 参数将卷组标记为不活动状态 , 这样可防止对卷组进行任何进一步活动。

  3. 使用 vgexport 命令导出卷组。这样可防止您要将其从中删除的系统访问该卷组。

    导出卷组后 , 在执行 pvscan 命令时物理卷将显示在导出的卷组中 , 如下例所示。

    # pvscan
      PV /dev/sda1    is in exported VG myvg [17.15 GB / 7.15 GB free]
      PV /dev/sdc1    is in exported VG myvg [17.15 GB / 15.15 GB free]
      PV /dev/sdd1   is in exported VG myvg [17.15 GB / 15.15 GB free]
      ...

    当关闭系统时 , 您可以拔出组成该卷组的磁盘并将其连接到新系统。

  4. 当磁盘插入新系统时 , 请使用 vgimport 命令导入卷组 , 使其可以被新系统访问。

  5. 使用 vgchange 命令的 -a y 参数激活卷组。

  6. 挂载文件系统使其可使用。

[root@localhost ~]# vgchange -a n vg0
  0 logical volume(s) in volume group "vg0" now active
​
[root@localhost ~]# vgexport vg0
  Volume group "vg0" successfully exported
[root@localhost ~]# vgdisplay  vg0
  --- Volume group ---
  VG Name               vg0
  System ID             
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             exported/resizable
  MAX LV                1
  Cur LV                1
  Open LV               0
  Max PV                3
  Cur PV                3
  Act PV                3
  VG Size               60.01 GiB
  PE Size               4.00 MiB
  Total PE              15363
  Alloc PE / Size       1280 / 5.00 GiB
  Free  PE / Size       14083 / 55.01 GiB
  VG UUID               QmnfQY-xKbj-7uUV-H0uZ-b4Lu-SA9p-2iPYDm
   
[root@localhost ~]# vgimport vg0
  Volume group "vg0" successfully imported
[root@localhost ~]# vgdisplay  vg0
  --- Volume group ---
  VG Name               vg0
  System ID             
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                1
  Cur LV                1
  Open LV               0
  Max PV                3
  Cur PV                3
  Act PV                3
  VG Size               60.01 GiB
  PE Size               4.00 MiB
  Total PE              15363
  Alloc PE / Size       1280 / 5.00 GiB
  Free  PE / Size       14083 / 55.01 GiB
  VG UUID               QmnfQY-xKbj-7uUV-H0uZ-b4Lu-SA9p-2iPYDm
   
​

3.2.8 更改卷组容量

3.2.8.1 从卷组中添加物理卷

  • vgextend : 用于动态扩展LVM卷组 , 它通过向卷组中添加物理卷(pv)来增加卷组的容量

[root@localhost ~]# vgextend vg100 /dev/sde
  WARNING: Locking disabled. Be careful! This could corrupt your metadata.
  Volume group "vg100" successfully extended

3.2.8.2 从卷组中删除物理卷

  • vgreduce:通过删除LVM卷组中的物理卷(pv)来减少卷组容量

    • -a : 如果命令行中没有指定要删除的物理卷 , 则删除所有的空物理卷;

    • --removemissing : 删除卷组中丢失的物理卷 , 使卷组恢复正常状态。

vgreduce 命令通过删除一个或多个空物理卷来缩小卷组的容量。这样就可以使不同的卷组自由使用那些物理卷 , 或者将其从系统中删除。

在从卷组中删除物理卷前 , 您可以使用 pvdisplay 命令确定物理卷没有被任何逻辑卷使用。

# pvdisplay /dev/hda1
​
-- Physical volume ---
PV Name               /dev/hda1
VG Name               myvg
PV Size               1.95 GB / NOT usable 4 MB [LVM: 122 KB]
PV#                   1
PV Status             available
Allocatable           yes (but full)
Cur LV                1
PE Size (KByte)       4096
Total PE              499
Free PE               0
Allocated PE          499
PV UUID               Sd44tK-9IRw-SrMC-MOkn-76iP-iftz-OVSen7

如果物理卷仍在使用 , 您必须使用 pvmove 命令将数据迁移到另一个物理卷。然后使用 vgreduce 命令删除物理卷。

以下命令将物理卷 /dev/hda1 从卷组 my_volume_group 中删除。

# vgreduce my_volume_group /dev/hda1

如果逻辑卷包含失败的物理卷 , 您就无法使用该逻辑卷。要从卷组中删除缺少的物理卷 , 您可以使用 vgreduce 命令的--removemising参数 , 如果缺少物理卷上没有分配逻辑卷。

如果物理卷包含镜像片段类型的逻辑卷的镜像 ,您可以使用 vgreduce --removemissing --mirrorsonly --force 命令从镜像中删除该镜像。这样只删除从物理卷中镜像镜像的逻辑卷。

如果对应的pv在使用,则无法移除

​
[root@localhost ~]# vgreduce vg100 /dev/sde
  WARNING: Locking disabled. Be careful! This could corrupt your metadata.
  Removed "/dev/sde" from volume group "vg100"
[root@localhost ~]# vgreduce vg100 /dev/sdb1
  WARNING: Locking disabled. Be careful! This could corrupt your metadata.
  Physical volume "/dev/sdb1" still in use
​

3.2.9 扫描卷组的磁盘来构建缓存文件

vgscan 命令扫描系统中寻找LVM物理卷和卷组的所有支持磁盘设备。这会在 /etc/lvm/cache/.cache 文件中构建LVM缓存文件, 它将维护当前LVM设备列表。

LVM会在系统启动时自动运行 vgscan 命令 , 并在LVM操作期间自动运行 vgcreate 命令 , 比如当您执行vgcreate命令时 , 或者LVM检测到不一致的情况。

注意

当您更改硬件配置并从节点添加或删除设备时 , 您可能需要手动运行 vgscan 命令 , 从而导致系统引导时没有显示新设备。这可能是必要的 , 例如 , 当您向SAN上的系统添加新磁盘时 , 或者热插拔已标记为物理卷的新磁盘。

您可以在 /etc/lvm/lvm.conf 文件中定义过滤器 , 以限制扫描以避免特定设备。

以下示例显示了 vgscan 命令的输出结果。

# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "new_vg" using metadata type lvm2
  Found volume group "officevg" using metadata type lvm2

3.2.10 分割卷组

要分割卷组的物理卷并创建新卷组 , 请使用 vgsplit 命令。

在卷组之间无法分割逻辑卷。每个现有逻辑卷都必须完全位于组成旧卷组的物理卷或新卷组中。但是 , 您可以使用 pvmove 命令强制分割。

下例将新卷组 smallvg 从原始卷组 bigvg 拆分。

# vgsplit bigvg smallvg /dev/ram15
  Volume group "smallvg" successfully split from "bigvg"

示例

有一个由三个物理卷组成的卷组。如果在物理卷中有足够的空闲空间 , 就可在不添加新磁盘的情况下创建新的卷组。

在初始设置中 , 逻辑卷 mylv 从 myvol 组分离 , 后者由三个物理卷、/dev/sda1、/dev/sdb1 和 /dev /sdc1 组成。

完成此步骤后 , 卷组 myvg 将由 /dev/sda1 和 /dev/sdb1 组成。第二个卷组 yourvg 将包含 /dev/sdc1。

  1. 使用 pvscan 命令确定卷组中当前有多少可用空间。

    # pvscan
      PV /dev/sda1  VG myvg   lvm2 [17.15 GB / 0    free]
      PV /dev/sdb1  VG myvg   lvm2 [17.15 GB / 12.15 GB free]
      PV /dev/sdc1  VG myvg   lvm2 [17.15 GB / 15.80 GB free]
      Total: 3 [51.45 GB] / in use: 3 [51.45 GB] / in no VG: 0 [0   ]
  2. 使用 pvmove 命令将 /dev/sdc1 中所有使用的物理扩展移动到 /dev/sdb1。pvmove 命令可能需要很长时间才能执行。

    # pvmove /dev/sdc1 /dev/sdb1
      /dev/sdc1: Moved: 14.7%
      /dev/sdc1: Moved: 30.3%
      /dev/sdc1: Moved: 45.7%
      /dev/sdc1: Moved: 61.0%
      /dev/sdc1: Moved: 76.6%
      /dev/sdc1: Moved: 92.2%
      /dev/sdc1: Moved: 100.0%

    移动数据后 , 您可以看到 /dev/sdc1 中的所有空间都可用。

    # pvscan
      PV /dev/sda1   VG myvg   lvm2 [17.15 GB / 0    free]
      PV /dev/sdb1   VG myvg   lvm2 [17.15 GB / 10.80 GB free]
      PV /dev/sdc1   VG myvg   lvm2 [17.15 GB / 17.15 GB free]
      Total: 3 [51.45 GB] / in use: 3 [51.45 GB] / in no VG: 0 [0   ]
  3. 要创建新卷组 yourvg , 请使用 vgsplit 命令分割卷组 myvg。

    在分割卷组前 , 逻辑卷必须不活跃。如果挂载文件系统 , 则必须在取消激活逻辑卷前卸载该文件系统。

    使用 lvchange 命令或 vgchange 命令停用逻辑卷。以下命令取消激活逻辑卷 mylv , 然后从卷组 myvg 中分割 您的vg , 并将物理卷 /dev/sdc1 移到新卷组 yourvg 中。

    # lvchange -a n /dev/myvg/mylv
    # vgsplit myvg yourvg /dev/sdc1
      Volume group "yourvg" successfully split from "myvg"

    您可以使用 vgs 命令查看这两个卷组的属性。

    # vgs
      VG     #PV #LV #SN Attr   VSize  VFree
      myvg     2   1   0 wz--n- 34.30G 10.80G
      yourvg   1   0   0 wz--n- 17.15G 17.15G
  4. 创建新卷组后 , 创建新逻辑卷 yourlv。

    # lvcreate -L 5G -n yourlv yourvg
      Logical volume "yourlv" created
  5. 在新逻辑卷中创建文件系统并挂载它。

    #  mkfs.gfs2 -p lock_nolock -j 1 /dev/yourvg/yourlv
    This will destroy any data on /dev/yourvg/yourlv.
    ​
    Are you sure you want to proceed? [y/n] y
    ​
    Device:                    /dev/yourvg/yourlv
    Blocksize:                 4096
    Filesystem Size:           1277816
    Journals:                  1
    Resource Groups:           20
    Locking Protocol:          lock_nolock
    Lock Table:
    ​
    Syncing...
    All Done
    ​
    # mount /dev/yourvg/yourlv /mnt
  6. 由于您必须取消激活逻辑卷 mylv , 因此需要先再次激活它 , 然后才能进行挂载。

    # lvchange -a y /dev/myvg/mylv
    ​
    # mount /dev/myvg/mylv /mnt
    # df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/yourvg/yourlv    24507776        32  24507744   1% /mnt
    /dev/myvg/mylv        24507776        32  24507744   1% /mnt

3.2.11 合并卷组

要将两个卷组合并为一个卷组 , 请使用 vgmerge 命令。如果这两个卷的物理扩展大小相等 , 且两个卷组的物理卷和逻辑卷的描述符合目的卷组的限制 , 您可以将一个不活跃的"源"卷与一个活跃或者不活跃的"目标"卷合并。

以下命令将不活跃卷组 my_vg 合并到活动或不活跃卷组数据库中 , 提供详细的运行时信息。

# vgmerge -v databases my_vg

3.2.12 备份卷组元数据

除非在 lvm.conf 文件中禁用禁用 , 否则会在每个配置更改时自动创建元数据备份和存档。默认情况下 , 元数据备份存储在 /etc/lvm/backup 文件中 , 元数据存档存储在 /etc/lvm/archive 文件中。您可以使用 vgcfgbackup 命令将元数据手动备份到 /etc/lvm/backup 文件中。

vgcfgrestore 命令将卷组的元数据从归档恢复到卷组中的所有物理卷。

3.2.13 重新创建卷组目录

要重新创建卷组目录和逻辑卷特殊文件 , 请使用 vgmknodes 命令。此命令将检查 /dev 目录中的 LVM2 特殊文件 , 以便激活逻辑卷需要。它会创建任何缺少的特殊文件 , 并删除未使用的文件。

您可以通过将 mknodes 参数指定为 vgscan 命令 , 将 vgmknodes 命令合并到 vgscan 命令中。

3.3 逻辑卷(lv)

3.3.1 查看逻辑卷信息

3.3.1.1 基础命令使用

  • lvs : 查看逻辑卷大致信息

    • --all /-a : 包括所有有关内部逻辑卷的输出信息

    • --units : 所有尺寸都在输出这些单位: h、H、b、B、s、S、k、K、m、M、g、G、t、T、p、P、e、E

    • --aligned : 使用带--separator分隔符对齐输出列

    • --sepatator : 指定分隔符

    • --nosuffix : 在输出大小上后缀

    • --rows : 输出列作为行

    • --segments : 使用默认列强调段信息

    • --nameprefixes : 添加一个“LVM2_”前缀加上字段名输出

    • --unbuffered : 立即产生没有正确排序或对齐列的输出

    • --noheadings标题行 , 这通常是输出的第一行

    [root@localhost ~]# lvs
      WARNING: Locking disabled. Be careful! This could corrupt your metadata.
      LV      VG       Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
      lv_root VolGroup -wi-ao---- 17.51g                                                    
      lv_swap VolGroup -wi-ao----  2.00g                                                    
      lv100   vg100    -wi-a-----  5.00g  

  • lvscan : 扫描系统中的所有逻辑卷

    [root@localhost ~]# lvscan 
      WARNING: Locking disabled. Be careful! This could corrupt your metadata.
      ACTIVE            '/dev/vg100/lv100' [5.00 GiB] inherit
      ACTIVE            '/dev/VolGroup/lv_root' [17.51 GiB] inherit
      ACTIVE            '/dev/VolGroup/lv_swap' [2.00 GiB] inherit
    ​

  • lvdisplay : 用于显示LVM逻辑卷空间大小、读写状态和快照信息等属性。

    [root@localhost ~]# lvdisplay   /dev/vg100/lv100 
      WARNING: Locking disabled. Be careful! This could corrupt your metadata.
      --- Logical volume ---
      LV Path                /dev/vg100/lv100
      LV Name                lv100
      VG Name                vg100
      LV UUID                9YzC3b-rAJs-Lh8u-cogN-3fdK-P8ii-bvwCPc
      LV Write Access        read/write
      LV Creation host, time localhost.localdomain, 2018-10-06 00:15:26 +0800
      LV Status              available
      # open                 0
      LV Size                5.00 GiB
      Current LE             1280
      Segments               1
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     256
      Block device           253:2

取消其中警报的方式:编辑/etc/lvm/lvm.conf中开启lock,locking_type = 1

3.3.1.2 自定义报告

可以使用pvs、lvs和vgs命令生成LVM对象的简明且可定制的报告。每行包含一个与对象相关的属性的有序字段列表。每行包含与对象相关的属性字段的有序列表。选择上报对象有五种方式:按物理卷、卷组、逻辑卷、物理卷段、逻辑卷段。

3.3.1.2.1 格式控制

无论您使用 pvs、lvs 或 vgs 命令来确定显示的默认字段集和排序顺序。您可以使用以下参数来控制这些命令的输出结果 :

  • 您可以使用 -o 参数更改显示哪些字段到默认字段。例如 , 以下输出是 pvs 命令的默认显示(显示物理卷的信息)。

    # pvs
      PV         VG     Fmt  Attr PSize  PFree
      /dev/sdb1  new_vg lvm2 a-   17.14G 17.14G
      /dev/sdc1  new_vg lvm2 a-   17.14G 17.09G
      /dev/sdd1  new_vg lvm2 a-   17.14G 17.14G

    下面的命令只显示物理卷名称和大小。

    # pvs -o pv_name,pv_size
      PV         PSize
      /dev/sdb1  17.14G
      /dev/sdc1  17.14G
      /dev/sdd1  17.14G
  • 您可以使用加号(+)将字段附加到输出中 , 该符号与-o 参数结合使用。

    下面的例子除默认字段外还显示物理卷UUID。

    # pvs -o +pv_uuid
      PV         VG     Fmt  Attr PSize  PFree  PV UUID
      /dev/sdb1  new_vg lvm2 a-   17.14G 17.14G onFF2w-1fLC-ughJ-D9eB-M7iv-6XqA-dqGeXY
      /dev/sdc1  new_vg lvm2 a-   17.14G 17.09G Joqlch-yWSj-kuEn-IdwM-01S9-X08M-mcpsVe
      /dev/sdd1  new_vg lvm2 a-   17.14G 17.14G yvfvZK-Cf31-j75k-dECm-0RZ3-0dGW-UqkCS
  • 在命令中添加 -v 参数包含一些额外的字段。例如 , pvs -v 命令除了默认字段外还显示 DevSize 和 PV UUID 字段。

    # pvs -v
        Scanning for physical volume names
      PV         VG     Fmt  Attr PSize  PFree  DevSize PV UUID
      /dev/sdb1  new_vg lvm2 a-   17.14G 17.14G  17.14G onFF2w-1fLC-ughJ-D9eB-M7iv-6XqA-dqGeXY
      /dev/sdc1  new_vg lvm2 a-   17.14G 17.09G  17.14G Joqlch-yWSj-kuEn-IdwM-01S9-XO8M-mcpsVe
      /dev/sdd1  new_vg lvm2 a-   17.14G 17.14G  17.14G yvfvZK-Cf31-j75k-dECm-0RZ3-0dGW-tUqkCS
  • --noheadings 参数可以不显示标题行。这对编写脚本非常有用。

    以下示例将 --noheadings 参数与 pv_name 参数结合使用 , 这将生成所有物理卷的列表。

    # pvs --noheadings -o pv_name
      /dev/sdb1
      /dev/sdc1
      /dev/sdd1
  • --separator 分隔符 参数使用 分隔符 来分隔各个字段。

    下例将 pvs 命令的默认输出字段和等号(=)分隔开。

    # pvs --separator =
      PV=VG=Fmt=Attr=PSize=PFree
      /dev/sdb1=new_vg=lvm2=a-=17.14G=17.14G
      /dev/sdc1=new_vg=lvm2=a-=17.14G=17.09G
      /dev/sdd1=new_vg=lvm2=a-=17.14G=17.14G

    要在使用 --separator 参数时保留一致的字段 , 可将--separator 参数与 --aligned 参数结合使用。

    # pvs --separator = --aligned
      PV        =VG    =Fmt =Attr=PSize =PFree
      /dev/sdb1 =new_vg=lvm2=a-  =17.14G=17.14G
      /dev/sdc1 =new_vg=lvm2=a-  =17.14G=17.09G
      /dev/sdd1 =new_vg=lvm2=a-  =17.14G=17.14G

您可以使用 lvs 或 vgs 命令的 -P 参数显示有关在输出中未显示失败的卷的信息。

可以使用物理卷(和物理卷片段)字段或逻辑卷(和逻辑卷片段)字段混合卷组字段 , 但无法混合物理卷和逻辑卷字段。例如 : 以下命令可显示每行物理卷的输出结果。

# vgs -o +pv_name
  VG     #PV #LV #SN Attr   VSize  VFree  PV
  new_vg   3   1   0 wz--n- 51.42G 51.37G /dev/sdc1
  new_vg   3   1   0 wz--n- 51.42G 51.37G /dev/sdd1
  new_vg   3   1   0 wz--n- 51.42G 51.37G /dev/sdb1
3.3.1.2.2 对象显示字段

列出您可以使用 pvs、vgs 和 lvs 命令显示的信息。

为方便起见 , 字段名称前缀如果与命令的默认名称匹配就可以省略。例如 , 使用 pvs 命令 ,name 表示 pv_name , 但使用 vgs 命令时 ,name 将解释为 vg_name。

执行以下命令等同于执行 pvs -o pv_free。

# pvs -o free
  PFree
  17.14G
  17.09G
  17.14G
  • pvs命令

    pvs 命令显示字段

    参数

    标头

    描述

    dev_size

    DevSize

    创建物理卷的基本设备的大小

    pe_start

    1st PE

    在基础设备中调整到第一个物理扩展的起始位置

    pv_attr

    Attr

    物理卷的状态 : (a)llocatable 或 e(x)ported。

    pv_fmt

    Fmt

    物理卷的元数据格式 ( lvm2 或 lvm1)

    pv_free

    PFree

    物理卷中剩余的可用空间

    pv_name

    PV

    物理卷名称

    pv_pe_alloc_count

    Alloc

    已使用的物理扩展数目

    pv_pe_count

    PE

    物理扩展数目

    pvseg_size

    SSize

    物理卷的片段大小

    pvseg_start

    Start

    物理卷片段的起始物理扩展

    pv_size

    PSize

    物理卷的大小

    pv_tags

    PV Tags

    附加到物理卷的LVM标签

    pv_used

    Used

    目前物理卷中已经使用的空间量

    pv_uuid

    PV UUID

    物理卷的UUID

    pvs 命令默认显示以下字段 : pv_name,vg_name,pv_fmt,pv_attr,pv_size,pv_free.显示按照 pv_name 进行排序。

    # pvs
      PV         VG     Fmt  Attr PSize  PFree
      /dev/sdb1  new_vg lvm2 a-   17.14G 17.14G
      /dev/sdc1  new_vg lvm2 a-   17.14G 17.09G
      /dev/sdd1  new_vg lvm2 a-   17.14G 17.13G

    将 -v 参数与 pvs 命令一起使用会将以下字段添加到默认显示中 : dev_size、pv_uuid。

    # pvs -v
        Scanning for physical volume names
      PV         VG     Fmt  Attr PSize  PFree  DevSize PV UUID
      /dev/sdb1  new_vg lvm2 a-   17.14G 17.14G  17.14G onFF2w-1fLC-ughJ-D9eB-M7iv-6XqA-dqGeXY
      /dev/sdc1  new_vg lvm2 a-   17.14G 17.09G  17.14G Joqlch-yWSj-kuEn-IdwM-01S9-XO8M-mcpsVe
      /dev/sdd1  new_vg lvm2 a-   17.14G 17.13G  17.14G yvfvZK-Cf31-j75k-dECm-0RZ3-0dGW-tUqkCS

    您可以使用 pvs 命令的 --segments 参数显示每个物理卷片段的信息。一个片段就是一组扩展。查看片段在想查看逻辑卷是否碎片时很有用。

    pvs --segments 命令默认显示以下字段: pv_name,vg_name,pv_fmt,pv_attr,pv_size,pv_free,pvseg_start,pvseg_size.该显示根据物理卷中的 pv_name 和 pvseg_size 进行排序。

    # pvs --segments
      PV         VG         Fmt  Attr PSize  PFree  Start SSize
      /dev/hda2  VolGroup00 lvm2 a-   37.16G 32.00M     0  1172
      /dev/hda2  VolGroup00 lvm2 a-   37.16G 32.00M  1172    16
      /dev/hda2  VolGroup00 lvm2 a-   37.16G 32.00M  1188     1
      /dev/sda1  vg         lvm2 a-   17.14G 16.75G     0    26
      /dev/sda1  vg         lvm2 a-   17.14G 16.75G    26    24
      /dev/sda1  vg         lvm2 a-   17.14G 16.75G    50    26
      /dev/sda1  vg         lvm2 a-   17.14G 16.75G    76    24
      /dev/sda1  vg         lvm2 a-   17.14G 16.75G   100    26
      /dev/sda1  vg         lvm2 a-   17.14G 16.75G   126    24
      /dev/sda1  vg         lvm2 a-   17.14G 16.75G   150    22
      /dev/sda1  vg         lvm2 a-   17.14G 16.75G   172  4217
      /dev/sdb1  vg         lvm2 a-   17.14G 17.14G     0  4389
      /dev/sdc1  vg         lvm2 a-   17.14G 17.14G     0  4389
      /dev/sdd1  vg         lvm2 a-   17.14G 17.14G     0  4389
      /dev/sde1  vg         lvm2 a-   17.14G 17.14G     0  4389
      /dev/sdf1  vg         lvm2 a-   17.14G 17.14G     0  4389
      /dev/sdg1  vg         lvm2 a-   17.14G 17.14G     0  4389

    您可以使用 pvs -a 命令查看LVM检测到的设备 , 这些设备尚未初始化为LVM物理卷。

    # pvs -a
      PV                             VG     Fmt  Attr PSize  PFree
      /dev/VolGroup00/LogVol01                   --       0      0
      /dev/new_vg/lvol0                          --       0      0
      /dev/ram                                   --       0      0
      /dev/ram0                                  --       0      0
      /dev/ram2                                  --       0      0
      /dev/ram3                                  --       0      0
      /dev/ram4                                  --       0      0
      /dev/ram5                                  --       0      0
      /dev/ram6                                  --       0      0
      /dev/root                                  --       0      0
      /dev/sda                                   --       0      0
      /dev/sdb                                   --       0      0
      /dev/sdb1                      new_vg lvm2 a-   17.14G 17.14G
      /dev/sdc                                   --       0      0
      /dev/sdc1                      new_vg lvm2 a-   17.14G 17.09G
      /dev/sdd                                   --       0      0
      /dev/sdd1                      new_vg lvm2 a-   17.14G 17.14G
  • vgs命令

    列出 vgs 命令的显示参数 , 以及在标题显示中显示的字段名称以及字段描述。

    vgs显示字段

    参数

    标头

    描述

    lv_count

    #LV

    卷组包含的逻辑卷数

    max_lv

    MaxLV

    卷组中最多允许的逻辑卷数目 ( 如果没有限制就是 0 )

    max_pv

    MaxPV

    卷组中最多允许的物理卷数目 ( 如果没有限制就是 0 )

    pv_count

    #PV

    定义卷组的物理卷数目

    snap_count

    #SN

    卷组包含的快照数

    vg_attr

    Attr

    卷组的状态 : (w)riteable、(r)eadonly、resi(z)eable、e(x)ported、(p)artial 和(c)lustered。

    vg_extent_count

    #Ext

    卷组中的物理扩展数目

    vg_extent_size

    Ext

    卷组中物理扩展的大小

    vg_fmt

    Fmt

    卷组的元数据格式 ( lvm2 或 lvm1 )

    vg_free

    VFree

    卷组中剩余可用空间大小

    vg_free_count

    Free

    卷组中可用物理扩展数目

    vg_name

    VG

    卷组名称

    vg_seqno

    seq

    代表修正卷组的数

    vg_size

    VSize

    卷组大小

    vg_sysid

    SYS ID

    LVM1系统ID

    vg_tags

    VG Tags

    附加到卷组中的LVM标签

    vg_uuid

    VG UUID

    卷组的UUID

    vgs 命令默认显示以下字段 : vg_name,pv_count,lv_count,snap_count,vg_attr,vg_size,vg_free.显示按照 vg_name 进行排序。

    # vgs
      VG     #PV #LV #SN Attr   VSize  VFree
      new_vg   3   1   1 wz--n- 51.42G 51.36G

    将 -v 参数与 vgs 命令一起使用会将以下字段添加到默认显示中 : vg_extent_size、vg_uuid.

    # vgs -v
        Finding all volume groups
        Finding volume group "new_vg"
      VG     Attr   Ext   #PV #LV #SN VSize  VFree  VG UUID
      new_vg wz--n- 4.00M   3   1   1 51.42G 51.36G jxQJ0a-ZKk0-OpMO-0118-nlwO-wwqd-fD
  • lvs命令

    LVS 显示字段

    参数

    标头

    描述

    CHUNKSIZE/chunk_size

    Chunk

    快照卷的单位大小

    copy_percent

    Copy%

    镜像卷的同步百分比 ; 还在使用 pv_move 命令移动物理扩展时使用

    devices

    Devices

    组成逻辑卷的基本设备 : 物理卷、逻辑卷以及启动物理扩展和逻辑扩展

    lv_ancestors | Ancestors

    对于精简池快照 , 显示逻辑卷的父卷

    lv_descendants

    descendants

    对于精简池快照 , 逻辑卷的子卷

    lv_attr

    Attr

    逻辑卷的状态。逻辑卷属性字节如下 : 第1位, 卷类型: (m)irrored,(M)irrored without initial sync,(o)rigin,(O)rigin with merging snapshot,(r)aid,(R)aid without initial sync,(s)napshot, merging(S)napshot,(p)vmove,(v)irtual, mirror或raid(i)mage, mirror or raid(I)mage out-of-sync, mirror(l)og device, under(c)onversion, thin(V)olume,(t)hin pool,(T)hin pool data, raid或thin pool m(e)tadata 或pool metadata spare 第2位 , 权限: (w)riteable,(r)ead-only,(R)ead-only activation of non-read-only volume 第 3 位 , 分配策略: (a)nywhere,(c)ontiguous,(i)nherited, c(l)ing,(n)ormal。如果卷目前锁定了分配更改 , 这将会大写 , 例如在执行 pvmove 命令时。 第4位 ,fixed (m)inor 第5位, State: (a)ctive,(s)uspended,(I)nvalid snapshot, invalid(S)uspended snapshot, snapshot(m)erge failed,suspended snapshot(M)erge failed, mapped(d)evice present without tables, mapping, mapping with(i)nactive table present 第 6 位: device (o)pen 第 7 位 , 目标类型 : (m)irror、(r)aid、(s)napshot、(t)hin、(u)nknown,(v)irtual。它将与同一个内核目标相关的逻辑卷分组在一起。如果使用原始设备映射器镜像内核驱动程序 , 镜像映像、镜像日志以及镜像本身将显示为(m) 。 使用md raid内核驱动程序的raid等价项都显示为(r)。使用原始设备映射器驱动程序的快照显示为(s)。使用精简配置驱动程序的精简卷快照则显示为(t)。 第8位:新分配的数据块在使用前会被(z)eroes块覆盖。 第9位 , 卷健康状态 , (p)artial、(r)efresh needed、(m)ismatches exist 、(w)ritemostly 。(p)artial表示系统缺少一个或多个物理卷。(r)efresh表示 , 该RAID逻辑卷使用的一个或多个物理卷发生了写入错误 , 写入错误可能是由于该物理卷的临时故障或指示它正在故障, 请对设备进行刷新或更换。(m)ismatches表示RAID逻辑卷的阵列中有不一致的部分。通过对RAID逻辑卷进行check操作发现不一致性。(可以通过lvchange命令对RAID逻辑卷执行擦除、check和repair操作。) 。( w)ritemostly代表RAID 1逻辑卷中被标记为write-most的设备。 第10位 , s(k)ip activation, 此卷被标记为在激活过程中跳过。

    lv_kernel_major

    KMaj

    逻辑卷的实际主设备号(如果不活跃则为 -1)

    lv_kernel_minor

    KMIN

    逻辑卷的实际副设备号(如果是不活跃则为 -1)

    lv_major

    Maj

    逻辑卷的持久主设备号(如果未指定则为 -1)

    lv_minor

    Min

    逻辑卷的持久副设备号(如果未指定则为 -1)

    lv_name

    LV

    逻辑卷名称

    lv_size

    LSize

    逻辑卷的大小

    lv_tags

    LV Tags

    附加到逻辑卷的 LVM 标签

    lv_uuid

    LV UUID

    逻辑卷的 UUID。

    mirror_log

    Log

    镜像日志所在的设备

    modules

    Modules

    使用这个逻辑卷需要对应的内核设备映射器目标

    move_pv

    Move

    使用 pvmove 命令创建的临时逻辑卷的源物理卷

    Origin

    Origin

    快照卷的源设备

    regionsize/region_size

    Region

    镜像的逻辑卷的单元大小

    seg_count

    #Seg

    逻辑卷中片段的数

    seg_size

    SSize

    逻辑卷中片段的大小

    seg_start

    Start

    逻辑卷中片段的偏移

    seg_tags

    Seg Tags

    附加到逻辑卷片段的 LVM 标签

    segtype

    Type

    逻辑卷的片段类型 ( 例如 : 镜像、条状、线性 )

    snap_percent

    Snap%

    已使用的快照卷的比例

    stripes

    #Str

    逻辑卷中条带或者镜像的数目

    stripesize/stripe_size

    Stripe

    条状逻辑卷中条状逻辑卷的单元大小

    lvs 命令默认显示以下字段 : lv_name,vg_name,lv_attr, lv_size , origin,snap_percent,move_pv,mirror_log,copy_percent,convert_lv.默认显示根据卷组中的 vg_name 和 lv_name 进行排序。

    # lvs
      LV         VG     Attr   LSize  Origin Snap%  Move Log Copy%  Convert
      lvol0      new_vg owi-a- 52.00M
      newvgsnap1 new_vg swi-a-  8.00M lvol0    0.20

    将 -v 参数与 lvs 命令一起使用会将以下字段添加到默认显示中 : seg _count ,lv_major,lv_ minor,lv_kernel_major, lv_kernel_minor ,lv_kernel_minor,lv_uuid。

    # lvs -v
        Finding all logical volumes
      LV         VG     #Seg Attr   LSize  Maj Min KMaj KMin Origin Snap%  Move Copy%  Log Convert LV UUID
      lvol0      new_vg    1 owi-a- 52.00M  -1  -1 253  3                                          LBy1Tz-sr23-OjsI-LT03-nHLC-y8XW-EhCl78
      newvgsnap1 new_vg    1 swi-a-  8.00M  -1  -1 253  5    lvol0    0.20                         1ye1OU-1cIu-o79k-20h2-ZGF0-qCJm-CfbsIx

    您可以使用 lvs 命令的 --segments 参数显示包含片段信息的默认列。使用 segments 参数时 , seg 前缀是可选的。lvs --segments 命令默认显示以下字段 : lv_name,vg_name,lv_attr,seg type,seg_size。默认显示根据卷组中的 vg_name、lv_name 和逻辑卷中的 seg_start 进行排序。如果逻辑卷有碎片化的问题 , 这个命令的输出会显示相关信息。

    # lvs --segments
      LV       VG         Attr   #Str Type   SSize
      LogVol00 VolGroup00 -wi-ao    1 linear  36.62G
      LogVol01 VolGroup00 -wi-ao    1 linear 512.00M
      lv       vg         -wi-a-    1 linear 104.00M
      lv       vg         -wi-a-    1 linear 104.00M
      lv       vg         -wi-a-    1 linear 104.00M
      lv       vg         -wi-a-    1 linear  88.00M

    将 -v 参数与 lvs --segments 命令搭配 , 将以下字段添加到默认显示中 : seg _start、stripesize、blocksize。

    # lvs -v --segments
        Finding all logical volumes
      LV         VG     Attr   Start SSize  #Str Type   Stripe Chunk
      lvol0      new_vg owi-a-    0  52.00M    1 linear     0     0
      newvgsnap1 new_vg swi-a-    0   8.00M    1 linear     0  8.00K

    以下示例显示了系统上配置了一个逻辑卷的 lvs 命令的默认输出 , 后跟 lvs 命令的默认输出 ( 指定 --segments 参数 ) 。

    # lvs
      LV    VG     Attr   LSize  Origin Snap%  Move Log Copy%
      lvol0 new_vg -wi-a- 52.00M
    # lvs --segments
      LV    VG     Attr   #Str Type   SSize
      lvol0 new_vg -wi-a-    1 linear 52.00M
3.3.1.2.3 LVM报告排序

通常 , 必须在内部生成并存储 lvs、vgs 或 pvs 命令的整个输出 , 然后才能正确排序和列。您可以指定 --unbuffered 参数 , 以在生成后马上显示未排序的输出。

要指定不同的列排序 , 请使用任何报告命令的 -O 参数。在输出中不一定要包含这些字段。

以下示例显示了可显示物理卷名称、大小和可用空间的 pvs 命令的输出。

# pvs -o pv_name,pv_size,pv_free
  PV         PSize  PFree
  /dev/sdb1  17.14G 17.14G
  /dev/sdc1  17.14G 17.09G
  /dev/sdd1  17.14G 17.14G

下面的例子显示相同的输出结果 , 根据可用空间字段排序。

# pvs -o pv_name,pv_size,pv_free -O pv_free
  PV         PSize  PFree
  /dev/sdc1  17.14G 17.09G
  /dev/sdd1  17.14G 17.14G
  /dev/sdb1  17.14G 17.14G

以下示例显示 , 您不需要显示您要排序的字段。

# pvs -o pv_name,pv_size -O pv_free
  PV         PSize
  /dev/sdc1  17.14G
  /dev/sdd1  17.14G
  /dev/sdb1  17.14G

要显示反向排序 , 请在 -O 参数之后使用 - 字符指定的字段。

# pvs -o pv_name,pv_size,pv_free -O -pv_free
  PV         PSize  PFree
  /dev/sdd1  17.14G 17.14G
  /dev/sdb1  17.14G 17.14G
  /dev/sdc1  17.14G 17.09G
3.3.1.2.4 指定单位

要指定 LVM 报告显示的单元 , 使用report命令的 --units 参数。您可以指定(b)ytes、(k)ilobytes、(m)egabytes、(g)igabytes、(e)xabytes、(p)etabytes和(h)uman- readable。默认显示是人类可读的。您可以通过在 lvm.conf 文件的 global 部分中设置 units 参数来覆盖默认设置。

以下示例以 MB 为单位指定 pvs 命令的输出 , 而不是默认的千兆字节。

# pvs --units m
  PV         VG     Fmt  Attr PSize     PFree
  /dev/sda1         lvm2 --   17555.40M 17555.40M
  /dev/sdb1  new_vg lvm2 a-   17552.00M 17552.00M
  /dev/sdc1  new_vg lvm2 a-   17552.00M 17500.00M
  /dev/sdd1  new_vg lvm2 a-   17552.00M 17552.00M

默认情况下 , 显示的单位是 1024 的倍数。您可以使用大写字母代表单位是 1000 的倍数 ( B、K、M、G、T、H ) 。

下面的命令以默认单位 ( 1024 的倍数 ) 显示输出结果。

# pvs
  PV         VG     Fmt  Attr PSize  PFree
  /dev/sdb1  new_vg lvm2 a-   17.14G 17.14G
  /dev/sdc1  new_vg lvm2 a-   17.14G 17.09G
  /dev/sdd1  new_vg lvm2 a-   17.14G 17.14G

下面的命令以 1000 的倍数为单位显示输出结果。

#  pvs --units G
  PV         VG     Fmt  Attr PSize  PFree
  /dev/sdb1  new_vg lvm2 a-   18.40G 18.40G
  /dev/sdc1  new_vg lvm2 a-   18.40G 18.35G
  /dev/sdd1  new_vg lvm2 a-   18.40G 18.40G

您也可以指定y (s)ectors ( 定义为 512 字节 ) 或自定义单元。

下例以扇区数的形式显示 pvs 命令的输出。

# pvs --units s
  PV         VG     Fmt  Attr PSize     PFree
  /dev/sdb1  new_vg lvm2 a-   35946496S 35946496S
  /dev/sdc1  new_vg lvm2 a-   35946496S 35840000S
  /dev/sdd1  new_vg lvm2 a-   35946496S 35946496S

下例显示了 pvs 命令的输出 , 单位为 4MB。

# pvs --units 4m
  PV         VG     Fmt  Attr PSize    PFree
  /dev/sdb1  new_vg lvm2 a-   4388.00U 4388.00U
  /dev/sdc1  new_vg lvm2 a-   4388.00U 4375.00U
  /dev/sdd1  new_vg lvm2 a-   4388.00U 4388.00U
3.3.1.2.5 JSON 格式输出

可以使用 LVM 显示命令的 --reportformat 选项以 JSON 格式显示输出。

以下示例显示了以标准默认格式的 lvs 的输出。

# lvs
  LV      VG            Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  my_raid my_vg         Rwi-a-r---  12.00m                                    100.00
  root    rhel_host-075 -wi-ao----   6.67g
  swap    rhel_host-075 -wi-ao---- 820.00m

以下命令显示在指定 JSON 格式时相同的 LVM 配置输出。

# lvs --reportformat json
  {
      "report": [
          {
              "lv": [
                  {"lv_name":"my_raid", "vg_name":"my_vg", "lv_attr":"Rwi-a-r---", "lv_size":"12.00m", "pool_lv":"", "origin":"", "data_percent":"", "metadata_percent":"", "move_pv":"", "mirror_log":"", "copy_percent":"100.00", "convert_lv":""},
                  {"lv_name":"root", "vg_name":"rhel_host-075", "lv_attr":"-wi-ao----", "lv_size":"6.67g", "pool_lv":"", "origin":"", "data_percent":"", "metadata_percent":"", "move_pv":"", "mirror_log":"", "copy_percent":"", "convert_lv":""},
                  {"lv_name":"swap", "vg_name":"rhel_host-075", "lv_attr":"-wi-ao----", "lv_size":"820.00m", "pool_lv":"", "origin":"", "data_percent":"", "metadata_percent":"", "move_pv":"", "mirror_log":"", "copy_percent":"", "convert_lv":""}
              ]
          }
      ]
  }

您还可以使用 output_format 设置 , 在 /etc/lvm/lvm.conf 文件中将报告格式设置为配置选项。但是 , 命令行的 --reportformat 设置优先于此设置。

3.3.2 创建逻辑卷

lvcreate : 用于创建LVM的逻辑卷。

  • -L : 指定逻辑卷的大小 , 单位为“kKmMgGtT”字节;

  • -l : 指定逻辑卷的大小 ( LE|PE数 ) 。(%{VG|FREE})

  • -s : 创建的逻辑卷为快照

  • -p,--permission [r|rw] :手动设置权限属性

  • -n : 指定逻辑卷的名字

  • -i|--stripes Number : 条带数量

  • -I|--stripesize Size[k|UNIT] : 条带容量大小

  • -R|--regionsize Size[m|UNIT] : raid或镜像同步区域的大小。activation/raid_region_size可用于配置默认值。

  • -m|--mirrors Number : 指定除了原始LV映像之外的mirrors镜像数量。--mirrors 1 , 数据有两个映像 , 原始映像和一个mirror镜像。 命令行中的可选位置PV参数可以指定两种设备类型: raid1、mirror。使用--type 指定使用类型。RAID1为默认类型, mirror为以前版本类型。

  • -c|--chunksize Size[k|UNIT] : 快照、缓存池或精简池中的块大小。对于快照 , 取值范围为4KiB ~ 512KiB的2次方 , 默认值为4。对于缓存池 , 该值必须在32KiB ~ 1GiB之间 , 默认值为64。对于精简池 , 该值必须在64KiB到1GiB之间 , 如果没有指定池元数据大小 , 则默认值从64开始 , 扩展到128MiB以内。必须是64KiB的倍数。

  • -T|--thin : 后续用于指定精简LV或精简池。

  • -V|--virtualsize Size[m|UNIT] : 设置精简LV卷的虚拟空间

3.3.2.1 创建线性逻辑卷

要创建逻辑卷 , 请使用 lvcreate 命令。如果您没有为逻辑卷指定名称 , 则使用默认名称 lvol*#* , 其中 *#* 是逻辑卷的内部号码。

当您创建逻辑卷时 ,将使用组成卷组的物理卷中的空闲扩展从卷组中分离逻辑卷。通常 , 逻辑卷使用任何基于基础物理卷的可用空间。修改逻辑卷可在物理卷中释放并重新分配空间。

下面的命令在卷组 vg1 中创建逻辑卷 10GB 的大小。

# lvcreate -L 10G vg1

逻辑卷大小的默认单位为 MB。以下命令在卷组 testvg 中创建了 1500 兆字节的线性逻辑卷 , 名为 testlv , 创建块设备 /dev/testvg/testlv。

# lvcreate -L 1500 -n testlv testvg

以下命令从卷组 vg0 中的可用区块创建一个名为 gfslv 的 50GB 逻辑卷。

# lvcreate -L 50G -n gfslv vg0

您可以使用 lvcreate 命令的 -l 参数来指定逻辑卷的大小(以扩展)。您还可以使用此参数指定相关卷组、逻辑卷或物理卷组大小的百分比。后缀%VG表示卷组的总大小、卷组中剩余可用空间的后缀 %FREE , 后缀 %PVS 在指定的物理卷中可用空间。对于快照 , 大小可以表示为原始卷的总大小 , 其后缀为%ORIGIN(100%ORIGIN为整个原始卷提供空间)。以百分比表示时 , 该大小为新逻辑卷中逻辑扩展数定义一个上限。在命令完成前 , 不会确定新 LV 中的逻辑扩展的确切数目。

以下命令创建名为 mylv 的逻辑卷 , 该逻辑卷使用卷组 testvg 中总空间的60%。

# lvcreate -l 60%VG -n mylv testvg

以下命令创建名为 yourlv 的逻辑卷 , 该逻辑卷使用卷组 testvg 中所有未分配的空间。

# lvcreate -l 100%FREE -n yourlv testvg

您可以使用 lvcreate 命令的 -l 参数来创建使用整个卷组的逻辑卷。创建使用整个卷组的逻辑卷的另一种方法是使用 vgdisplay 命令查找"Total PE"大小 , 并将这些结果用作 lvcreate 命令的输入。

以下命令创建名为 mylv 的逻辑卷 , 该逻辑卷填充名为 testvg 的卷组。

# vgdisplay testvg | grep "Total PE"
Total PE              10230
# lvcreate -l 10230 -n mylv testvg

如果需要删除物理卷 , 用于创建逻辑卷的基本物理卷非常重要 , 因此当创建逻辑卷时可能需要考虑这一点。。

要创建要从卷组中的特定物理卷分配的逻辑卷 , 请在 lvcreate 命令行上指定物理卷或卷。下面的命令在从物理卷 /dev/sdg1 分配的卷组 testvg 中创建名为 testlv 的逻辑卷 ,

# lvcreate -L 1500 -n testlv testvg /dev/sdg1

您可以指定要用于逻辑卷的物理卷的范围。以下示例以下命令在卷组testvg的物理卷/dev/sda1区域0至24和物理卷/dev/sdb1区域50至124创建线性逻辑卷

# lvcreate -l 100 -n testlv testvg /dev/sda1:0-24 /dev/sdb1:50-124

下面的例子创建了扩展 0 到 25 个物理卷 /dev/sda1 的线性逻辑卷 , 然后再将逻辑卷扩展 100。

# lvcreate -l 100 -n testlv testvg /dev/sda1:0-25:100-

用于如何分配逻辑卷范围的默认策略 将继承 , 其应用与卷组相同的策略。这些策略可以通过 lvchange 命令更改。

[root@localhost ~]# lvcreate -n lv1 -l 100 vg100
  Logical volume "lv1" created.
#一般PE大小为4M 所以通过上面那个命令创建出来的逻辑卷是400M
[root@localhost ~]# lvcreate -n lv2 -l 60%VG  vg100
  Logical volume "lv2" created.
#占用VG%60空间创建逻辑卷
[root@localhost ~]# lvdisplay /dev/vg100/lv2
  --- Logical volume ---
  LV Path                /dev/vg100/lv2
  LV Name                lv2
  VG Name                vg100
  LV UUID                hRGa2T-OuIl-RH1s-5OYq-h31J-Z2Fk-MTtMBs
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2018-10-06 01:21:36 +0800
  LV Status              available
  # open                 0
  LV Size                39.01 GiB
  Current LE             9987
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:4
   
[root@localhost ~]# lvcreate -n lv3 -l 60%FREE  vg100
  Logical volume "lv3" created.
#使用剩余可用空间的60%创建逻辑卷
[root@localhost ~]# lvdisplay /dev/vg100/lv3
  --- Logical volume ---
  LV Path                /dev/vg100/lv3
  LV Name                lv3
  VG Name                vg100
  LV UUID                4M70ie-eMOo-7pdr-r81f-yNLi-Bfv4-urNrIJ
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2018-10-06 01:22:46 +0800
  LV Status              available
  # open                 0
  LV Size                12.37 GiB
  Current LE             3166
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:5

3.3.2.2 创建条状卷

当您创建条状逻辑卷时 , 您可以使用 lvcreate 命令的 -i 参数指定条带的数量。这决定了逻辑卷是条带的物理卷数量。条带的数量不能大于卷组中的物理卷数量 ( 除非使用 --alloc 任何参数 ) 。

如果构成条带化逻辑卷的物理设备大小不一 , 则条状卷的最大容量取决于最小的备选设备。例如 , 两段stripe中 , 最大容量是较小设备的两倍。在三段stripe中 , 最大容量是最小设备的三倍。

下面的命令可在2个物理卷中创建条状逻辑卷64 KB。逻辑卷大小为50GB , 名为 gfslv , 被从卷组 vg0 中分离。

# lvcreate -L 50G -i 2 -I 64 -n gfslv vg0

与线性卷一样 , 您可以指定您要用于条带的物理卷的扩展。以下命令创建了在两个物理卷间条带化的卷100个扩展 , 名为 stripelv , 并位于卷组 testvg 中。条带将使用 /dev/sda1 的扇区 0-49 , 以及 /dev/sdb1 的扇区 50-99。

# lvcreate -l 100 -i 2 -n stripelv testvg /dev/sda1:0-49 /dev/sdb1:50-99
  Using default stripesize 64.00 KB
  Logical volume "stripelv" created

3.3.2.3 RAID条状卷

要创建RAID逻辑卷 , 请将raid类型指定为 lvcreate 命令的 --type 参数。

LVM支持RAID0/1/4/5/6/10。

对于大多数用户 , 指定五个可用主类型之一 ( raid1、 raid4、 raid5、raid 6、raid10 ) 应该足够。

当您创建 RAID 逻辑卷时 , LVM 会创建一个元数据子卷 , 它是阵列中的每个数据或奇偶校验子卷的大小的一个区块。例如 , 创建一个双向 RAID1 阵列会导致两个元数据子卷 ( lv_rmeta_0 和 lv_rmeta_1 ) 和两个数据子卷 ( lv_rimage_0 和 lv_rimage_1)。同样 , 创建三向条带 ( 加 1 隐式奇偶校验设备 ) RAID4 会导致 4 个元数据子卷 ( lv_rmeta_0、lv_rmeta_1、lv_rmeta_ 2 和lv_rmeta_3)和 4个数据子卷 ( lv_rimage_0 , lv_rimage_1 , lv_rimage_2和lv_rimage_3 )

以下命令在卷组 my_vg 中创建名为 my_lv 的双向 RAID1 阵列 , 大小为 1GB。

# lvcreate --type raid1 -m 1 -L 1G -n my_lv my_vg

您可以根据您为 -m 参数指定的值 , 创建具有不同副本数的 RAID1 阵列。同样 , 您可以使用 -i参数为RAID 4/5/6逻辑卷指定条带数目。您还可以使用 -I 参数指定条带的大小。

以下命令在卷组 my_vg 中创建名为 my_lv 的RAID5阵列(3条带+ 1隐式奇偶校验驱动器) , 该阵列大小为1GB。请注意 , 您可以像您为 LVM 条状卷一样指定条带的数目 , 自动添加正确的奇偶校验驱动器数目。

# lvcreate --type raid5 -i 3 -L 1G -n my_lv my_vg

以下命令在卷组 my_vg 中创建名为 my_lv 的 RAID6 阵列 ( 3 条带 + 2 个隐式奇偶校验驱动器 ) , 该阵列大小为 1GB。

# lvcreate --type raid6 -i 3 -L 1G -n my_lv my_vg

使用LVM创建RAID逻辑卷后 , 您可以激活、更改、删除、显示和使用卷 , 就像其它 LVM 逻辑卷一样。

当您创建 RAID10 逻辑卷时 , 使用 同步操作初始化逻辑卷所需的后台I/O可能会导致LVM设备其它 I/O 操作 , 例如对卷组元数据的更新 , 特别是在创建很多 RAID 逻辑卷时。这会导致其它 LVM 操作速度下降。

您可以通过实施恢复节流来控制 RAID 逻辑卷初始化的速率。您可以通过使用 lvcreate 命令的 --minrecoveryrate 和 --maxrecoveryrate 选项设置这些操作的最小和最大 I/O 速率来控制 同步操作的速率。如下所示指定这些选项。

  • --maxrecoveryrate *Rate*[bBsSkKmMgG]

    为 RAID 逻辑卷设置最大恢复率,使其不会阻断其他小的 I/O 操作。这个 比率被指定为阵列中每个设备每秒的每秒数量。如果没有给出后缀 , 则会假定为 kiB/sec/device。将恢复率设置为 0 表示它将不被绑定。

  • --minrecoveryrate *Rate*[bBsSkKmMgG]

    为 RAID 逻辑卷设置最小恢复率 , 以确保 同步操作 的 I/O 达到最低吞吐量 , 即使存在大量 I/O。这个 比率被指定为阵列中每个设备每秒的每秒数量。如果没有给出后缀 , 则会假定为 kiB/sec/device。

下面的命令创建了双向 RAID10 阵列 , 有三个条带 , 大小为 10GB , 最大恢复率为 128 kiB/sec/device。该数组名为 my_lv , 且位于卷组 my_vg 中。

# lvcreate --type raid10 -i 2 -m 1 -L 10G --maxrecoveryrate 128 -n my_lv my_vg
3.3.2.3.1 创建RAID0卷

创建 RAID0 卷的命令格式如下。

lvcreate --type raid0[_meta] --stripes Stripes --stripesize StripeSize VolumeGroup [PhysicalVolumePath ...]

RAID0 命令创建参数

参数

描述

--type raid0[_meta]

指定 raid0 会创建一个没有元数据卷的 RAID0 卷。指定 raid0_meta 创建一个带有元数据卷的 RAID0 卷。因为 RAID0 是不弹性的 , 所以不需要保存任何已镜像的数据块(如 RAID1/10) , 或者计算并保存任何奇偶校验块(如RAID4/5/6)。因此 , 它不需要元数据卷来保持有关镜像或奇偶校验块重新同步进程的状态。然而 , 在从 RAID0 转换到 RAID4/5/6/10 时元数据卷是强制的 , 并指定 raid0_meta 预先分配元数据卷以防止适当的分配失败。

--stripes *Stripes*

指定在其中分割逻辑卷的设备数。

--stripesize StripeSize

以 KB 为单位指定每个条的大小。这是在移动到下一个设备前写入一个设备的数据量。

VolumeGroup

指定要使用的卷组。

PhysicalVolumePath ...

指定要使用的设备。如果没有指定 , LVM 将选择 Stripes 选项指定的设备数 , 每个条带一个。

从您创建的卷组创建RAID0逻辑卷。以下命令从卷组myvg创建RAID0卷mylv 。此示例创建一个大小为2千兆字节的逻辑卷 , 其中包含三个条带 , 条带大小为4千字节。

# lvcreate --type raid0 -L 2G --stripes 3 --stripesize 4 -n mylv myvg
  Rounding size 2.00 GiB (512 extents) up to stripe boundary size 2.00 GiB(513 extents).
  Logical volume "mylv" created.

3.3.2.3.2 将线性设备转换为RAID设备

可以使用 lvconvert 命令的 --type 参数将现有线性逻辑卷转换为 RAID 设备。

以下命令将卷组 my_vg 中的线性逻辑卷 my_lv 转换为双向 RAID1 阵列。

# lvconvert --type raid1 -m 1 my_vg/my_lv

因为 RAID 逻辑卷由元数据和数据子卷对组成 , 因此当您将线性设备转换成 RAID1 阵列时 , 会生成一个新的元数据子卷 , 并关联到线性卷所在的同一物理卷中的原始逻辑卷之一。额外的镜像在 metadata/data 子卷对中添加。例如 : 如果原始设备如下 :

# lvs -a -o name,copy_percent,devices my_vg
  LV     Copy%  Devices
  my_lv         /dev/sde1(0)

转换为双向 RAID1 阵列后 , 该设备包含以下数据和元数据子卷对 :

# lvconvert --type raid1 -m 1 my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv            6.25   my_lv_rimage_0(0),my_lv_rimage_1(0)
  [my_lv_rimage_0]        /dev/sde1(0)
  [my_lv_rimage_1]        /dev/sdf1(1)
  [my_lv_rmeta_0]         /dev/sde1(256)
  [my_lv_rmeta_1]         /dev/sdf1(0)

如果无法将与原始逻辑卷对的元数据镜像放在同一个物理卷中 , lvconvert 将失败。

3.3.2.3.3 将LVM RAID1逻辑卷转换为LVM Linear逻辑卷

您可以使用 lvconvert 命令将现有 RAID1 LVM 逻辑卷转换为 LVM 线性逻辑卷 , 方法是指定 -m0 参数。这会删除所有 RAID 数据子卷以及构成 RAID 阵列的所有 RAID 元数据子卷 , 保留顶层 RAID1 镜像作为线性逻辑卷。

下面的例子显示了现有的 LVM RAID1逻辑卷。

# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv            100.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
  [my_lv_rimage_0]        /dev/sde1(1)
  [my_lv_rimage_1]        /dev/sdf1(1)
  [my_lv_rmeta_0]         /dev/sde1(0)
  [my_lv_rmeta_1]         /dev/sdf1(0)

以下命令将 LVM RAID1 逻辑卷 my_vg/my_lv 转换为 LVM 线性设备。

# lvconvert -m0 my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
  LV      Copy%  Devices
  my_lv          /dev/sde1(1)

当您将LVM RAID1逻辑卷转换成 LVM 线性卷 , 您可以指定要删除的物理卷。以下示例显示了由两个镜像组成的LVM RAID1逻辑卷布局: /dev/sda1 和 /dev/sdb1。在这个示例中 , lvconvert 命令指定要删除 /dev/sda1 , 使 /dev/sdb1 保留为组成线性设备的物理卷。

# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv            100.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
  [my_lv_rimage_0]        /dev/sda1(1)
  [my_lv_rimage_1]        /dev/sdb1(1)
  [my_lv_rmeta_0]         /dev/sda1(0)
  [my_lv_rmeta_1]         /dev/sdb1(0)
# lvconvert -m0 my_vg/my_lv /dev/sda1
# lvs -a -o name,copy_percent,devices my_vg
  LV    Copy%  Devices
  my_lv        /dev/sdb1(1)
3.3.2.3.4 将镜像的LVM设备转换为RAID1设备

您可以通过指定 --type raid1 参数 , 将现有镜像的 LVM 设备转换为带有 lvconvert 命令的 RAID1 LVM设备。这会将镜像子卷(*_mimage_*)重命名为 RAID 子卷(*_rimage_*)。另外 , 镜像日志会被移除 , 并为与对应数据子卷相同的物理卷上的数据子卷创建元数据子卷(*_rmeta_*)。

以下示例显示了镜像逻辑卷 my_vg/my_lv 的布局。

# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv             15.20 my_lv_mimage_0(0),my_lv_mimage_1(0)
  [my_lv_mimage_0]        /dev/sde1(0)
  [my_lv_mimage_1]        /dev/sdf1(0)
  [my_lv_mlog]            /dev/sdd1(0)

以下命令将镜像的逻辑卷 my_vg/my_lv 转换为 RAID1 逻辑卷。

# lvconvert --type raid1 my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv            100.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
  [my_lv_rimage_0]        /dev/sde1(0)
  [my_lv_rimage_1]        /dev/sdf1(0)
  [my_lv_rmeta_0]         /dev/sde1(125)
  [my_lv_rmeta_1]         /dev/sdf1(125)
3.3.2.3.5 重新定义RAID逻辑卷大小

当您创建 RAID 逻辑卷时 , 逻辑卷的区域大小将是 /etc/lvm/lvm.conf 文件中的 raid_region_size 参数的值。您可以使用 lvcreate 命令的 -R 选项覆盖此默认值。

创建 RAID 逻辑卷后 , 您可以使用 lvconvert 命令的 -R 选项更改卷的区域大小。以下示例将逻辑卷 vg/raidlv 的区域大小改为 4096K。必须同步 RAID 卷以便更改区域大小。

# lvconvert -R 4096K vg/raid1
Do you really want to change the region_size 512.00 KiB of LV vg/raid1 to 4.00 MiB? [y/n]: y
  Changed region size on RAID LV vg/raid1 to 4.00 MiB.
3.3.2.3.6 更换现有RAID1设备中的镜像数

您可以更改现有 RAID1 阵列中的镜像数量 , 就如同在早期的 LVM 镜像部署中更改镜像数量。使用 lvconvert 命令指定要添加或删除的额外元数据/数据子卷对数。

当您使用 lvconvert 命令向 RAID1 设备添加镜像时 , 您可以指定生成的设备的镜像总数 , 或者您可以指定要添加到该设备中的镜像数量。您还可以有选择地指定新元数据/数据镜像对所在的物理卷。

元数据子卷 ( 名为 *_rmeta_* ) 始终存在于与数据子卷对应 *_rimage_*相同的物理设备中。元数据/数据子卷对不会在与 RAID 阵列中另一个元数据/数据子卷对相同的物理卷中创建 ( 除非您在 任何位置指定--alloc ) 。

在 RAID1 卷中添加镜像的命令格式如下 :

lvconvert -m new_absolute_count vg/lv [removable_PVs]
lvconvert -m +num_additional_images vg/lv [removable_PVs]

例如 , 以下命令显示 LVM 设备 my_vg/my_lv , 它是一个双向 RAID1 阵列 :

# lvs -a -o name,copy_percent,devices my_vg
  LV                Copy%  Devices
  my_lv             6.25    my_lv_rimage_0(0),my_lv_rimage_1(0)
  [my_lv_rimage_0]         /dev/sde1(0)
  [my_lv_rimage_1]         /dev/sdf1(1)
  [my_lv_rmeta_0]          /dev/sde1(256)
  [my_lv_rmeta_1]          /dev/sdf1(0)

以下命令将双向 RAID1 设备 my_vg/my_lv 转换为三向 RAID1 设备 :

# lvconvert -m 2 my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv              6.25 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
  [my_lv_rimage_0]        /dev/sde1(0)
  [my_lv_rimage_1]        /dev/sdf1(1)
  [my_lv_rimage_2]        /dev/sdg1(1)
  [my_lv_rmeta_0]         /dev/sde1(256)
  [my_lv_rmeta_1]         /dev/sdf1(0)
  [my_lv_rmeta_2]         /dev/sdg1(0)

当您向 RAID1 阵列中添加镜像时 , 您可以指定要用于该镜像的物理卷。以下命令将双向 RAID1 设备 my_vg/my_lv 转换为三向 RAID1 设备 , 指定用于阵列的物理卷 /dev/sdd1 :

# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv             56.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
  [my_lv_rimage_0]        /dev/sda1(1)
  [my_lv_rimage_1]        /dev/sdb1(1)
  [my_lv_rmeta_0]         /dev/sda1(0)
  [my_lv_rmeta_1]         /dev/sdb1(0)
# lvconvert -m 2 my_vg/my_lv /dev/sdd1
# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv             28.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
  [my_lv_rimage_0]        /dev/sda1(1)
  [my_lv_rimage_1]        /dev/sdb1(1)
  [my_lv_rimage_2]        /dev/sdd1(1)
  [my_lv_rmeta_0]         /dev/sda1(0)
  [my_lv_rmeta_1]         /dev/sdb1(0)
  [my_lv_rmeta_2]         /dev/sdd1(0)

要从 RAID1 阵列中删除镜像 , 请使用以下命令。当您使用 lvconvert 命令从 RAID1 设备中删除镜像时 , 您可以指定结果设备的镜像总数 , 或者您可以指定要从该设备中删除的镜像数量。您还可以选择指定要从中删除该设备的物理卷。

lvconvert -m new_absolute_count vg/lv [removable_PVs]
lvconvert -m -num_fewer_images vg/lv [removable_PVs]

另外 , 当镜像及其关联的元数据子卷被删除时 , 任何带有高数值的镜像都将用来填充被删除卷的位置。如果您从包含 lv_rimage_0 、lv_rimage_1和lv_rimage_2 的三路RAID1阵列中删除lv_rimage _1 , 则会产生一个由lv_rimage_0 和 lv_rimage_ 1 组成的 RAID1 阵列。将重命名子卷 lv_rimage_2 , 并接管空插槽 , 成为 lv_rimage_1。

以下示例显示了一个三向 RAID1 逻辑卷 my_vg/my_lv 的布局。

# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv            100.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
  [my_lv_rimage_0]        /dev/sde1(1)
  [my_lv_rimage_1]        /dev/sdf1(1)
  [my_lv_rimage_2]        /dev/sdg1(1)
  [my_lv_rmeta_0]         /dev/sde1(0)
  [my_lv_rmeta_1]         /dev/sdf1(0)
  [my_lv_rmeta_2]         /dev/sdg1(0)

下面的命令可将三向 RAID1 逻辑卷转换成双向 RAID1 逻辑卷。

# lvconvert -m1 my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv            100.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
  [my_lv_rimage_0]        /dev/sde1(1)
  [my_lv_rimage_1]        /dev/sdf1(1)
  [my_lv_rmeta_0]         /dev/sde1(0)
  [my_lv_rmeta_1]         /dev/sdf1(0)

下面的命令可将三向 RAID1 逻辑卷转换成双向 RAID1 逻辑卷 , 并指定包含镜像的物理卷作为 /dev/sde1。

# lvconvert -m1 my_vg/my_lv /dev/sde1
# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv            100.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
  [my_lv_rimage_0]        /dev/sdf1(1)
  [my_lv_rimage_1]        /dev/sdg1(1)
  [my_lv_rmeta_0]         /dev/sdf1(0)
  [my_lv_rmeta_1]         /dev/sdg1(0)
3.3.2.3.7 将RAID镜像分离为单独逻辑卷

您可以分离 RAID 逻辑卷的镜像形成新的逻辑卷。分离 RAID 镜像的步骤与分离镜像逻辑卷冗余镜像的步骤相同 ,。

分离 RAID 镜像的命令格式如下 :

lvconvert --splitmirrors count -n splitname vg/lv [removable_PVs]

和当您从现有 RAID1 逻辑卷中删除 RAID 镜像一样(如第 3.3.2.3.6节 “更改现有 RAID1 设备中的镜像数”所述) , 当您从设备中的中间删除 RAID 数据子卷(及其关联的元数据子卷)时 , 任何数字较高的镜像将被移到这个插槽中。构成 RAID 阵列的逻辑卷上的索引号将是一个不中断的整数序列。

注意 : 如果 RAID1 阵列还没有同步 , 您就无法分离 RAID 镜像。

以下示例将 RAID1 逻辑卷 my_lv 分成两个线性逻辑卷 my_lv 和 new。

# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv             12.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
  [my_lv_rimage_0]        /dev/sde1(1)
  [my_lv_rimage_1]        /dev/sdf1(1)
  [my_lv_rmeta_0]         /dev/sde1(0)
  [my_lv_rmeta_1]         /dev/sdf1(0)
# lvconvert --splitmirror 1 -n new my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
  LV      Copy%  Devices
  my_lv          /dev/sde1(1)
  new            /dev/sdf1(1)

下面的示例将一个三向 RAID1 逻辑卷 my_lv 分成双向RAID1逻辑卷 , 即 my_lv , 以及一个线性逻辑卷new

# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv            100.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
  [my_lv_rimage_0]        /dev/sde1(1)
  [my_lv_rimage_1]        /dev/sdf1(1)
  [my_lv_rimage_2]        /dev/sdg1(1)
  [my_lv_rmeta_0]         /dev/sde1(0)
  [my_lv_rmeta_1]         /dev/sdf1(0)
  [my_lv_rmeta_2]         /dev/sdg1(0)
# lvconvert --splitmirror 1 -n new my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
  LV            Copy%  Devices
  my_lv            100.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
  [my_lv_rimage_0]        /dev/sde1(1)
  [my_lv_rimage_1]        /dev/sdf1(1)
  [my_lv_rmeta_0]         /dev/sde1(0)
  [my_lv_rmeta_1]         /dev/sdf1(0)
  new                     /dev/sdg1(1)
3.3.2.3.8 拆分和合并RAID镜像

您可以临时分离 RAID1 阵列的镜像进行只读使用 , 同时使用 --trackchanges 参数与 lvconvert 命令的 --splitmirrors 参数来跟踪任何更改。这可让您以后将镜像合并到阵列中 , 同时只重新同步那些自镜像被分割后更改的阵列的部分。

分离 RAID 镜像的 lvconvert 命令的格式如下。

lvconvert --splitmirrors count --trackchanges vg/lv [removable_PVs]

当您使用 --trackchanges 参数分离 RAID 镜像时 , 您可以指定要分离的镜像 , 但您无法更改要分离的卷名称。另外 , 得到的卷有以下限制。

  • 创建的新卷为只读。

  • 不能调整新卷的大小。

  • 不能重命名剩余的数组。

  • 不能调整剩余的数组大小。

  • 您可以独立激活新卷和剩余的阵列。

您可以通过执行带有 --merge 参数的后续 lvconvert 命令 , 合并使用 --trackchanges 参数指定的镜像。当您合并镜像时 , 只有自镜像分割后更改的阵列部分会被重新同步。

合并 RAID 镜像的 lvconvert 命令的格式如下。

lvconvert --merge raid_image

下面的例子创建了 RAID1 逻辑卷 , 然后在追踪剩余的阵列时从那个卷中分离镜像。

# lvcreate --type raid1 -m 2 -L 1G -n my_lv .vg
  Logical volume "my_lv" created
# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv            100.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
  [my_lv_rimage_0]        /dev/sdb1(1)
  [my_lv_rimage_1]        /dev/sdc1(1)
  [my_lv_rimage_2]        /dev/sdd1(1)
  [my_lv_rmeta_0]         /dev/sdb1(0)
  [my_lv_rmeta_1]         /dev/sdc1(0)
  [my_lv_rmeta_2]         /dev/sdd1(0)
# lvconvert --splitmirrors 1 --trackchanges my_vg/my_lv
  my_lv_rimage_2 split from my_lv for read-only purposes.
  Use 'lvconvert --merge my_vg/my_lv_rimage_2' to merge back into my_lv
# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv            100.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
  [my_lv_rimage_0]        /dev/sdb1(1)
  [my_lv_rimage_1]        /dev/sdc1(1)
  my_lv_rimage_2          /dev/sdd1(1)
  [my_lv_rmeta_0]         /dev/sdb1(0)
  [my_lv_rmeta_1]         /dev/sdc1(0)
  [my_lv_rmeta_2]         /dev/sdd1(0)

以下示例在跟踪剩余的阵列更改时从 RAID1 卷中分离镜像 , 然后将该卷合并回阵列中。

# lvconvert --splitmirrors 1 --trackchanges my_vg/my_lv
  lv_rimage_1 split from my_lv for read-only purposes.
  Use 'lvconvert --merge my_vg/my_lv_rimage_1' to merge back into my_lv
# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv            100.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
  [my_lv_rimage_0]        /dev/sdc1(1)
  my_lv_rimage_1          /dev/sdd1(1)
  [my_lv_rmeta_0]         /dev/sdc1(0)
  [my_lv_rmeta_1]         /dev/sdd1(0)
# lvconvert --merge my_vg/my_lv_rimage_1
  my_vg/my_lv_rimage_1 successfully merged back into my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv            100.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
  [my_lv_rimage_0]        /dev/sdc1(1)
  [my_lv_rimage_1]        /dev/sdd1(1)
  [my_lv_rmeta_0]         /dev/sdc1(0)
  [my_lv_rmeta_1]         /dev/sdd1(0)

从 RAID1 卷分离镜像后 , 您可以发出第二个 lvconvert --splitmirrors 命令 , 在不指定 --trackchanges 参数的情况下重复分割镜像的初始 lvconvert 命令。这会破坏创建的 --trackchanges 参数的链接。

使用 --trackchanges 参数分割了镜像后 , 除非想永久分割被跟踪的镜像 , 否则您无法在该阵列中发布后续的 lvconvert --splitmirrors 命令。

以下命令序列分割镜像并跟踪镜像 , 然后永久分离要跟踪的镜像。

# lvconvert --splitmirrors 1 --trackchanges my_vg/my_lv
  my_lv_rimage_1 split from my_lv for read-only purposes.
  Use 'lvconvert --merge my_vg/my_lv_rimage_1' to merge back into my_lv
# lvconvert --splitmirrors 1 -n new my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
  LV   Copy%  Devices
  my_lv          /dev/sdc1(1)
  new            /dev/sdd1(1)

但请注意 , 以下 命令序列将失败。

# lvconvert --splitmirrors 1 --trackchanges my_vg/my_lv
  my_lv_rimage_1 split from my_lv for read-only purposes.
  Use 'lvconvert --merge my_vg/my_lv_rimage_1' to merge back into my_lv
# lvconvert --splitmirrors 1 --trackchanges my_vg/my_lv
  Cannot track more than one split image at a time

同样 , 以下命令序列也会失败 , 因为分割镜像不是被跟踪的镜像。

# lvconvert --splitmirrors 1 --trackchanges my_vg/my_lv
  my_lv_rimage_1 split from my_lv for read-only purposes.
  Use 'lvconvert --merge my_vg/my_lv_rimage_1' to merge back into my_lv
# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv            100.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
  [my_lv_rimage_0]        /dev/sdc1(1)
  my_lv_rimage_1          /dev/sdd1(1)
  [my_lv_rmeta_0]         /dev/sdc1(0)
  [my_lv_rmeta_1]         /dev/sdd1(0)
# lvconvert --splitmirrors 1 -n new my_vg/my_lv /dev/sdc1
  Unable to split additional image from my_lv while tracking changes for my_lv_rim
3.3.2.3.9 设备RAID失败策略

LVM RAID基于lvm.conf文件中raid_fault_policy字段定义的首选项以自动方式处理设备故障。

  • 如果raid_fault_policy字段设置为allocate , 系统将尝试使用卷组中的备用设备替换故障设备。如果没有可用的备用设备 , 则会将其报告给系统日志。

  • 如果raid_fault_policy字段设置为warn , 系统将发出警告 , 日志将指示设备已发生故障。这允许用户确定要采取的行动方案。

只要剩余足够的设备来支持可用性 , RAID逻辑卷将继续运行。

3.3.2.3.9.1 分配 RAID 失败策略

在以下示例中 , raid_fault_policy字段设置为在lvm.conf文件中进行allocate 。按如下方式定义 RAID 逻辑卷。

# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv            100.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
  [my_lv_rimage_0]        /dev/sde1(1)
  [my_lv_rimage_1]        /dev/sdf1(1)
  [my_lv_rimage_2]        /dev/sdg1(1)
  [my_lv_rmeta_0]         /dev/sde1(0)
  [my_lv_rmeta_1]         /dev/sdf1(0)
  [my_lv_rmeta_2]         /dev/sdg1(0)

如果/dev/sde设备出现故障 , 系统日志将显示错误消息。

# grep lvm /var/log/messages
Jan 17 15:57:18 bp-01 lvm[8599]: Device #0 of raid1 array, my_vg-my_lv, has failed.
Jan 17 15:57:18 bp-01 lvm[8599]: /dev/sde1: read failed after 0 of 2048 at
250994294784: Input/output error
Jan 17 15:57:18 bp-01 lvm[8599]: /dev/sde1: read failed after 0 of 2048 at
250994376704: Input/output error
Jan 17 15:57:18 bp-01 lvm[8599]: /dev/sde1: read failed after 0 of 2048 at 0:
Input/output error
Jan 17 15:57:18 bp-01 lvm[8599]: /dev/sde1: read failed after 0 of 2048 at
4096: Input/output error
Jan 17 15:57:19 bp-01 lvm[8599]: Couldn't find device with uuid
3lugiV-3eSP-AFAR-sdrP-H20O-wM2M-qdMANy.
Jan 17 15:57:27 bp-01 lvm[8599]: raid1 array, my_vg-my_lv, is not in-sync.
Jan 17 15:57:36 bp-01 lvm[8599]: raid1 array, my_vg-my_lv, is now in-sync.

由于raid_fault_policy字段已设置为allocate , 因此故障设备将替换为卷组中的新设备。

# lvs -a -o name,copy_percent,devices vg
  Couldn't find device with uuid 3lugiV-3eSP-AFAR-sdrP-H20O-wM2M-qdMANy.
  LV            Copy%  Devices
  lv            100.00 lv_rimage_0(0),lv_rimage_1(0),lv_rimage_2(0)
  [lv_rimage_0]        /dev/sdh1(1)
  [lv_rimage_1]        /dev/sdf1(1)
  [lv_rimage_2]        /dev/sdg1(1)
  [lv_rmeta_0]         /dev/sdh1(0)
  [lv_rmeta_1]         /dev/sdf1(0)
  [lv_rmeta_2]         /dev/sdg1(0)

请注意 , 即使更换了故障设备 , 显示仍会指示LVM无法找到故障设备。这是因为 , 虽然故障设备已从RAID逻辑卷中删除 , 但故障设备尚未从卷组中删除。要从卷组中删除故障设备 , 可以执行vgreduce --removemissing VG_name 。

如果raid_fault_policy已设置为allocate但没有备用设备 , 则分配将失败 , 保持逻辑卷raid_fault_policy 。如果分配失败 , 您可以选择修复驱动器 , 然后使用lvchange命令的--refresh选项启动故障设备的恢复。或者 , 您可以替换发生故障的设备。

3.3.2.3.9.2 警告RAID失败策略

在以下示例中 , raid_fault_policy 字段在 lvm.conf 文件中被设置为 warn。按如下方式定义 RAID 逻辑卷。

# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv            100.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
  [my_lv_rimage_0]        /dev/sdh1(1)
  [my_lv_rimage_1]        /dev/sdf1(1)
  [my_lv_rimage_2]        /dev/sdg1(1)
  [my_lv_rmeta_0]         /dev/sdh1(0)
  [my_lv_rmeta_1]         /dev/sdf1(0)
  [my_lv_rmeta_2]         /dev/sdg1(0)

如果 /dev/sdh 设备失败 , 系统日志将显示错误消息。在这种情况下 , LVM 将不会自动尝试通过替换其中一个镜像修复 RAID 设备。如果设备失败 , 您可以使用 lvconvert 命令的 --repair 参数替换该设备 , 如下所示。

# lvconvert --repair my_vg/my_lv
  /dev/sdh1: read failed after 0 of 2048 at 250994294784: Input/output error
  /dev/sdh1: read failed after 0 of 2048 at 250994376704: Input/output error
  /dev/sdh1: read failed after 0 of 2048 at 0: Input/output error
  /dev/sdh1: read failed after 0 of 2048 at 4096: Input/output error
  Couldn't find device with uuid fbI0YO-GX7x-firU-Vy5o-vzwx-vAKZ-feRxfF.
Attempt to replace failed RAID images (requires full device resync)? [y/n]: y
​
# lvs -a -o name,copy_percent,devices my_vg
  Couldn't find device with uuid fbI0YO-GX7x-firU-Vy5o-vzwx-vAKZ-feRxfF.
  LV               Copy%  Devices
  my_lv             64.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
  [my_lv_rimage_0]        /dev/sde1(1)
  [my_lv_rimage_1]        /dev/sdf1(1)
  [my_lv_rimage_2]        /dev/sdg1(1)
  [my_lv_rmeta_0]         /dev/sde1(0)
  [my_lv_rmeta_1]         /dev/sdf1(0)
  [my_lv_rmeta_2]         /dev/sdg1(0)

请注意 , 虽然替换了失败的设备 , 但显示仍指示 LVM 无法找到失败的设备。这是因为虽然从 RAID 逻辑卷中删除了失败的设备 , 但故障的设备还没有从卷组中删除。要从卷组中删除失败的设备 , 您可以执行 vgreduce --removemissing VG_name。

如果设备失败是一个临时故障 , 或者您可以修复失败的设备 , 您可以使用 lvchange 命令的 --refresh 选项启动故障设备的恢复。之前 , 需要取消激活并激活逻辑卷。

以下命令刷新逻辑卷。

# lvchange --refresh my_vg/my_lv
3.3.2.3.10 替换RAID设备

RAID 跟传统的 LVM 镜像不同。LVM 镜像需要删除失败的设备 , 或者镜像逻辑卷会挂起。RAID 阵列可在有失败设备的情况下继续运行。实际上 , 对于 RAID1 以外的 RAID 类型 , 删除设备意味着将设备转换为较低级别 RAID ( 例如 : 从 RAID6 转换为 RAID5 , 或者从 RAID4 或者 RAID5 转换到 RAID0 ) 。因此 , LVM 允许您使用 lvconvert 命令的 --replace 参数替换 RAID 卷中的设备 , 而不是无条件地删除失败的设备。

lvconvert --replace 的格式如下:

lvconvert --replace dev_to_remove vg/lv [possible_replacements]

下面的例子创建了 RAID1 逻辑卷 , 然后替换那个卷中的一个设备。

# lvcreate --type raid1 -m 2 -L 1G -n my_lv my_vg
  Logical volume "my_lv" created
# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv            100.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
  [my_lv_rimage_0]        /dev/sdb1(1)
  [my_lv_rimage_1]        /dev/sdb2(1)
  [my_lv_rimage_2]        /dev/sdc1(1)
  [my_lv_rmeta_0]         /dev/sdb1(0)
  [my_lv_rmeta_1]         /dev/sdb2(0)
  [my_lv_rmeta_2]         /dev/sdc1(0)
# lvconvert --replace /dev/sdb2 my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv             37.50 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
  [my_lv_rimage_0]        /dev/sdb1(1)
  [my_lv_rimage_1]        /dev/sdc2(1)
  [my_lv_rimage_2]        /dev/sdc1(1)
  [my_lv_rmeta_0]         /dev/sdb1(0)
  [my_lv_rmeta_1]         /dev/sdc2(0)
  [my_lv_rmeta_2]         /dev/sdc1(0)

下面的例子创建了 RAID1 逻辑卷 , 然后替换那个卷中的一个设备 , 指定要用来替换哪些物理卷。

# lvcreate --type raid1 -m 1 -L 100 -n my_lv my_vg
  Logical volume "my_lv" created
# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv            100.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
  [my_lv_rimage_0]        /dev/sda1(1)
  [my_lv_rimage_1]        /dev/sdb1(1)
  [my_lv_rmeta_0]         /dev/sda1(0)
  [my_lv_rmeta_1]         /dev/sdb1(0)
# pvs
  PV          VG       Fmt  Attr PSize    PFree
  /dev/sda1   my_vg    lvm2 a--  1020.00m  916.00m
  /dev/sdb1   my_vg    lvm2 a--  1020.00m  916.00m
  /dev/sdc1   my_vg    lvm2 a--  1020.00m 1020.00m
  /dev/sdd1   my_vg    lvm2 a--  1020.00m 1020.00m
# lvconvert --replace /dev/sdb1 my_vg/my_lv /dev/sdd1
# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv             28.00 my_lv_rimage_0(0),my_lv_rimage_1(0)
  [my_lv_rimage_0]        /dev/sda1(1)
  [my_lv_rimage_1]        /dev/sdd1(1)
  [my_lv_rmeta_0]         /dev/sda1(0)
  [my_lv_rmeta_1]         /dev/sdd1(0)

您可以通过指定多个 --replace 参数来替换多个 RAID 设备 , 如下例所示。

# lvcreate --type raid1 -m 2 -L 100 -n my_lv my_vg
  Logical volume "my_lv" created
# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv            100.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
  [my_lv_rimage_0]        /dev/sda1(1)
  [my_lv_rimage_1]        /dev/sdb1(1)
  [my_lv_rimage_2]        /dev/sdc1(1)
  [my_lv_rmeta_0]         /dev/sda1(0)
  [my_lv_rmeta_1]         /dev/sdb1(0)
  [my_lv_rmeta_2]         /dev/sdc1(0)
# lvconvert --replace /dev/sdb1 --replace /dev/sdc1 my_vg/my_lv
# lvs -a -o name,copy_percent,devices my_vg
  LV               Copy%  Devices
  my_lv             60.00 my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
  [my_lv_rimage_0]        /dev/sda1(1)
  [my_lv_rimage_1]        /dev/sdd1(1)
  [my_lv_rimage_2]        /dev/sde1(1)
  [my_lv_rmeta_0]         /dev/sda1(0)
  [my_lv_rmeta_1]         /dev/sdd1(0)
  [my_lv_rmeta_2]         /dev/sde1(0)

注意 : 当您使用 lvconvert --replace 命令指定替换驱动器时 , 不应从阵列中已存在的驱动器上额外空间分配替换驱动器。例如 : lv_rimage_0 和 lv_rimage_1 不应位于同一物理卷中。

3.3.2.3.11 清理RAID逻辑卷

LVM为RAID逻辑卷提供清理支持。RAID清理是读取阵列中所有数据和奇偶校验块并检查它们是否一致的过程。

使用lvchange命令的--syncaction选项启动RAID清理操作。您指定check或repair操作。check操作遍历数组并记录数组中的差异数 , 但不会修复它们。repair操作会在发现差异时更正差异。

清理 RAID 逻辑卷的命令格式如下 :

lvchange --syncaction {check|repair} vg/raid_lv

注 : lvchange --syncaction fixes vg/raid_lv 操作不执行与 lvconvert --repair vg/raid_lv 操作相同的功能。lvchange --syncaction repair 操作会在阵列中启动后台同步操作 , 而 lvconvert --repair 操作则设计为在镜像或 RAID 逻辑卷中修复/替换失败的设备。

为了支持RAID清理操作 , lvs命令支持两个新的可打印字段 : raid_sync_action和raid_mismatch_count 。默认情况下不打印这些字段。要显示这些字段 , 请使用lvs的-o参数指定它们 , 如下所示。

lvs -o +raid_sync_action,raid_mismatch_count vg/lv

raid_sync_action字段显示raid卷正在执行的当前同步操作。它可以是以下值之一 :

  • idle : 所有同步操作完成 ( 什么都不做 )

  • resync : 在计算机出现故障后初始化阵列或恢复

  • recover : 替换阵列中的设备

  • check : 寻找阵列不一致

  • repair : 寻找和修复不一致

raid_mismatch_count字段显示check操作期间发现的差异数。

lvs命令的Cpy%Sync字段现在打印任何raid_sync_action操作的进度 , 包括check和repair 。

lvs命令输出的lv_attr字段现在提供其他指示符以支持RAID清理操作。此字段的第9位显示逻辑卷的运行状况 , 现在它支持以下指示符。

  • (m)ismatches表示RAID逻辑卷存在差异。在清理操作检测到RAID的某些部分不连贯之后 , 将显示此字符。

  • (r)efresh表示RAID阵列中的设备出现故障 , 并且内核将其视为失败 , 即使LVM可以读取设备标签并认为设备可以运行。应该(r)刷新逻辑卷以通知内核设备现在可用 , 或者如果怀疑设备发生故障 , 则应该(r)替换设备。

执行RAID清理操作时 , sync操作所需的后台I/O可以挤出对LVM设备的其他I/O操作 , 例如对卷组元数据的更新。这可能导致其他LVM操作变慢。您可以通过实施恢复限制来控制擦除RAID逻辑卷的速率。

您可以通过使用lvchange命令的--minrecoveryrate和--maxrecoveryrate选项设置这些操作的最小和最大I/O速率来控制执行sync操作的速率。您可以如下指定这些选项。

  • - maxrecoveryrate *Rate* [bBsSkKmMgG]

    设置RAID逻辑卷的最大恢复速率 , 以便它不会挤出标称I / O操作。速率指定为阵列中每个设备的每秒数量。如果没有给出后缀 , 则假定为kiB / sec / device。将恢复率设置为0意味着它将是无限制的。

  • --minrecoveryrate *Rate* [bBsSkKmMgG]

    设置RAID逻辑卷的最低恢复速率 , 以确保sync操作的I/O实现最小吞吐量 , 即使存在大量标称I/O。速率指定为阵列中每个设备的每秒数量。如果没有给出后缀 , 则假定为kiB/sec/device。

3.3.2.3.12 RAID Takeover

LVM支持Raid takeover , 这意味着将RAID逻辑卷从一个RAID级别转换成另一个RAID级别(比如从RAID 5转换到RAID 6)。更改RAID级别通常被设计为增加或降低设备故障的弹性或其它逻辑卷的恢复。您可以使用 lvconvert 进行RAID接管。有关RAID接管以及使用 lvconvert 转换RAID逻辑卷的示例。

3.3.2.3.13 重新设定RAID逻辑卷

RAID reshaping 意味着更改RAID逻辑卷的属性 , 同时保持相同的RAID级别。您可以修改的一些属性包括RAID布局、条状大小和条带数目。

3.3.2.3.14 在RAID1逻辑卷中控制I/O操作

您可以使用 lvchange 命令的 --write 和 --write behind 参数控制 RAID1 逻辑卷中设备的 I/O 操作。使用这些参数的格式如下。

  • --[RAID]writemostly PhysicalVolume[:{t|y|n}]

    将 RAID1 逻辑卷中的设备标记为主 写。除非需要 , 避免对这些驱动器的所有读取。设置此参数会使驱动器中的 I/O 操作数量保持最小。默认情况下 , 针对逻辑卷中指定的物理卷将 write-mostly 属性设为 yes。通过将 :n 附加到物理卷或者通过指定 :t 来切换值 , 可以删除 write-mostly 标志。在单个命令中可以多次指定 --writemostly 参数 , 从而可以一次为逻辑卷中的所有物理卷切换写入属性。

  • --[RAID]writebehind IOCount

    指定主 RAID1 逻辑卷中设备允许的最大未处理 write-mostly。超过这个值后 , 写入就变为同步行为 , 在阵列指示写操作完成前 , 所有的写操作都需要已完成。将值设为零可清除首选项 , 并允许系统任意选择数值。

3.3.2.4 创建镜像卷

RAID 逻辑卷不是集群感知的。虽然可以在一台机器上单独创建和激活 RAID 逻辑卷 , 但不能在多个机器上同时激活它们。如果需要非排除的镜像卷 , 您必须创建带有 mirror 片段类型的卷。

注 : 在集群中创建镜像 LVM 逻辑卷需要与在单个节点上创建片段类型的 mirror LVM 逻辑卷的命令和步骤相同。但是 , 为了在集群中创建镜像 LVM 卷 , 集群和集群镜像基础架构必须运行 , 集群必须是 quorate , 且在 lvm.conf 文件中的锁定类型必须正确设置才能启用集群锁定。

当您创建镜像卷时 , 您可以使用 lvcreate 命令的 -m 参数指定要数据的副本数。指定 -m1 创建一个镜像 , 它生成文件系统的两个副本 : 线性逻辑卷加上一个副本。同样 , 指定 -m2 会创建两个镜像 , 生成文件系统的三个副本。

以下命令创建一个带有单一镜像的镜像逻辑卷。卷的大小为 50GB , 名为 mirrorlv , 它被从卷组 vg0 中分离 :

# lvcreate --type mirror -L 50G -m 1 -n mirrorlv vg0

LVM 镜像会划分要复制到区域 ( 默认情况下为 512KB ) 的设备。您可以使用 lvcreate 命令的 -R 参数来指定地区大小 ( 以 MB 为单位 ) 。您还可以通过编辑 lvm.conf 文件中的 mirror_region_size 设置来更改默认区域大小。

注 : 由于集群基础架构的限制 , 无法使用默认区域大小 512KB 创建集群镜像大于 1.5TB。需要更大的镜像的用户应将区域大小从默认增加到更大内容。如果增加区域大小将导致 LVM 创建挂起 , 并可能也会挂起其他 LVM 命令。

作为指定大于 1.5TB 的镜像区域大小的一般指南 , 您可能需要以 TB 为单位来计算您的镜像大小 , 并将该数量增加到 2 的下一个电源 , 将这个数字用作 lvcreate 命令的 -R 参数。例如 , 如果您的镜像大小为 1.5TB , 您可以指定 -R 2。如果您的镜像大小为3TB , 您可以指定 -R 4。对于镜像大小为5TB , 您可以指定 -R 8。

以下命令创建了区域大小为 2MB 的镜像逻辑卷 :

# lvcreate --type mirror -m 1 -L 2T -R 2 -n mirror vol_group

创建镜像时 , 镜像区域会同步。对于大型镜像组件 , 同步过程可能需要很长时间。当您创建不需要恢复的新镜像时 , 您可以指定 --nosync 参数来指示不需要从第一个设备的初始同步。

LVM维护一个小日志 , 它用于跟踪哪些区域与镜像或镜像同步。默认情况下 , 此日志保存在磁盘上 , 这会在重启后保留 , 并确保每次机器重启或崩溃时不需要重新同步镜像。您可以使用 --mirrorlog 内核参数指定此日志保存在内存中。这样可消除对额外日志设备的需要 , 但它要求每次重启时重新同步整个镜像。

以下命令从卷组 bigvg 中创建镜像逻辑卷。逻辑卷名为 ondiskmirvol , 它只有一个镜像(mirror)。卷大小为 12MB , 并使镜像保留在内存中。

# lvcreate --type mirror -L 12MB -m 1 --mirrorlog core -n ondiskmirvol bigvg
  Logical volume "ondiskmirvol" created

镜像日志在独立于创建任何镜像分支的设备中创建。但是 , 可以使用 vgcreate 命令的任意参数在与其中一个镜像分支相同的设备上创建镜像日志。这可能会降低性能 , 但允许您创建镜像 , 即使您只有一个底层设备。

以下命令创建一个带有单一镜像的镜像的逻辑卷 , 镜像日志位于与其中一个镜像分支相同的设备中。在这个示例中 , 卷组 vg0 只包含两个设备。该命令在 vg0 卷组中创建名为 mirrorlv 的 500 MB 卷。

# lvcreate --type mirror -L 500M -m 1 -n mirrorlv -alloc anywhere vg0

注:使用集群镜像时 , 镜像日志管理完全由集群节点负责 , 当前具有当前最低的集群 ID。因此 , 当包含集群镜像日志的设备在集群子集中不可用时 , 集群镜像可以在没有影响的情况下继续操作 , 只要集群节点保持对镜像日志的访问。由于镜像已取消注册 , 因此不会发出任何自动正确操作(修复)。当最低 ID 集群节点无法访问镜像日志时 , 自动操作将启动(不从其他节点访问日志)。

要创建自己镜像的镜像日志 , 您可以指定 --mirrorlog mirrored 参数。以下命令从卷组 bigvg 中创建镜像逻辑卷。逻辑卷名为 twologvol , 只有一个镜像。卷大小为 12MB , 镜像日志是镜像(mirrored) , 每个日志保存在单独的设备中

# lvcreate --type mirror -L 12MB -m 1 --mirrorlog mirrored -n twologvol bigvg
  Logical volume "twologvol" created

正如标准镜像日志一样 , 可以使用 vgcreate 命令的任意参数在与镜像分支相同的 --alloc anywhere 冗余镜像日志。这可能会降低性能 , 但是它允许您创建冗余镜像日志 , 即使您没有足够的底层设备来保留在单独的设备上 , 而不是镜像分支。

创建镜像时 , 镜像区域会同步。对于大型镜像组件 , 同步过程可能需要很长时间。当您创建不需要 恢复的新镜像时 , 您可以指定 --nosync 参数来指示不需要从第一个设备的初始同步。

您可以指定要用于镜像分支和日志的设备 , 以及要使用的设备范围。要强制登录特定磁盘 , 请在要放置它的磁盘上精确指定一个扩展。LVM 不需要从命令行中列出设备的顺序。如果列出任何物理卷是分配的唯一空间。列表中已分配的任何物理区块都将被忽略。

下面的命令创建了带有单一镜像的镜像逻辑卷以及没有镜像的单一日志。卷大小为 500 MB , 名为 mirrorlv , 它将被从卷组 vg0 中分离出来。镜像的第一个分支位于设备 /dev/sda1 上 , 镜像的第二个分支位于设备 /dev/sdb1 中 , 镜像日志位于 /dev/sdc1 上。

# lvcreate --type mirror -L 500M -m 1 -n mirrorlv vg0 /dev/sda1 /dev/sdb1 /dev/sdc1

以下命令创建一个带有单一镜像的镜像逻辑卷。卷大小为 500 MB , 名为 mirrorlv , 它将被从卷组 vg0 中分离出来。镜像的第一个分支是位于设备 /dev/sda1 的扩展 0 到 499 个 , 镜像的第二个分支是位于设备 /dev/sdb1 的扩展 0 上 , 并且镜像日志在设备 /dev/sdc1 的扩展 0 上开始。这些是 1MB 的扩展。如果已经分配了指定的范围 , 它们将被忽略。

# lvcreate --type mirror -L 500M -m 1 -n mirrorlv vg0 /dev/sda1:0-499 /dev/sdb1:0-499 /dev/sdc1:0

注 : 您可以在一个逻辑卷中合并条带和镜像。在同时创建逻辑卷时 , 同时指定镜像数(--mirrors X)和条带的数量(-stripes Y)会导致镜像设备存在条带化。

3.3.2.4.1 镜像逻辑卷失败策略

您可以在 lvm.conf 文件的 activation 部分中使用 mirror_image_fault_policy 和 mirror_log_fault_policy 参数定义镜像逻辑卷在设备失败时的行为。当这些参数设置为 remove 时 , 系统会尝试删除有问题的设备并无它运行。当这些参数设置为 allocate 时 , 系统会尝试删除有问题的设备 , 并尝试在新设备上分配空间以作为失败设备替换。如果没有适当的设备和空间 , 则这个策略的行为与删除策略类似。

默认情况下 , mirror_log_fault_policy 参数设置为 allocate。将此策略用于日志快速 , 并保持通过崩溃并重新启动同步状态的功能。如果您将此策略设置为 remove , 当日志设备无法使用内存中日志进行镜像转换时 , 镜像不会在崩溃之间记住其同步状态并重新引导 , 整个镜像都会重新同步。

默认情况下 , mirror_image_fault_policy 参数设置为 remove。在这个策略中 , 如果镜像镜像失败 , 如果只有一个剩余良好副本 , 镜像将转换为非镜像设备。为 mirror设备分配这个策略需要镜像(mirror)来重新同步设备 ; 这是一个较慢的过程 , 但它会保留该设备的镜像特性。

注意

当LVM镜像出现设备失败时 , 会进行两个阶段的恢复。第一个阶段涉及删除失败的设备。这可能导致镜像被缩小到线性设备。第二个阶段 ( 如果 mirror_log_fault_policy 参数设为 allocate) 是尝试替换任何失败的设备。但请注意 , 如果没有保证第二阶段会选择之前使用中的设备 , 如果其他可用 , 则没有镜像部分失败的设备。

3.3.2.4.2 分离镜像逻辑卷的冗余镜像

您可以分离镜像的冗余镜像来形成新的逻辑卷。要分离镜像 , 请使用 lvconvert 命令的 --splitmirrors 参数 , 指定要分离的冗余镜像数量。您必须使用 命令的 --name 参数为newly-split-off逻辑卷指定名称。

下面的命令可从镜像逻辑卷 vg/lv 中分离一个名为 copy 的新逻辑卷。新逻辑卷包含两个镜像分支。在这个示例中 , LVM 选择要分离的设备。

# lvconvert --splitmirrors 2 --name copy vg/lv

您可以指定要分离的设备。下面的命令可从镜像逻辑卷 vg/lv 中分离一个名为 copy 的新逻辑卷。新逻辑卷包含两个镜像分支 , 由设备 /dev/sdc1 和 /dev/sde1 组成。

# lvconvert --splitmirrors 2 --name copy vg/lv /dev/sd[ce]1
3.3.2.4.3 修复镜像的逻辑设备

您可以使用 lvconvert --repair 命令在磁盘失败后修复镜像。这会导致镜像重新变为一致的状态。lvconvert --repair 命令是一个交互式命令 , 提示您指示系统是否尝试替换任何失败设备。

  • 要跳过提示并替换所有失败的设备 , 请在命令行中指定 -y 选项。

  • 要跳过提示并替换没有失败的设备 , 请在命令行中指定 -f 选项。

  • 要跳过提示 , 并仍指示mirror image和镜像日志的不同替换策略 , 您可以指定 --use-policies 参数 , 以使用由 mirror_log_fault_policy 和 mirror_device_fault_policy 参数指定的设备替换策略

3.3.2.4.4 更改镜像的卷配置

您可以使用 lvconvert 命令增加或减少逻辑卷包含的镜像数量。这可让您将逻辑卷从镜像卷转换为线性卷 , 或者从线性卷转换为镜像卷。您还可以使用这个命令重新配置现有逻辑卷的其他镜像参数 , 如 corelog。

当您将线性卷转换为镜像卷时 , 您要为现有卷创建镜像分支。这意味着您的卷组必须包含镜像分支和镜像日志的设备和空格。

如果您丢失了镜像分支 , LVM 会将卷转换为线性卷 , 以便您仍可以访问卷 , 而无需镜像冗余。替换分支后 , 使用 lvconvert 命令恢复镜像。

以下命令将线性逻辑卷 vg00/lvol1 转换为镜像逻辑卷。

# lvconvert -m1 vg00/lvol1

以下命令将镜像的逻辑卷 vg00/lvol1 转换为线性逻辑卷 , 从而删除镜像分支。

# lvconvert -m0 vg00/lvol1

以下示例为现有逻辑卷 vg00/lvol1 添加额外的镜像分支。本例演示了在 lvconvert 命令之前和之后卷配置 , 将卷更改为具有两个镜像分支的卷。

# lvs -a -o name,copy_percent,devices vg00
  LV                  Copy%  Devices
  lvol1               100.00 lvol1_mimage_0(0),lvol1_mimage_1(0)
  [lvol1_mimage_0]        /dev/sda1(0)
  [lvol1_mimage_1]        /dev/sdb1(0)
  [lvol1_mlog]            /dev/sdd1(0)
# lvconvert -m 2 vg00/lvol1
  vg00/lvol1: Converted: 13.0%
  vg00/lvol1: Converted: 100.0%
  Logical volume lvol1 converted.
# lvs -a -o name,copy_percent,devices vg00
  LV                  Copy%  Devices
  lvol1               100.00 lvol1_mimage_0(0),lvol1_mimage_1(0),lvol1_mimage_2(0)
  [lvol1_mimage_0]        /dev/sda1(0)
  [lvol1_mimage_1]        /dev/sdb1(0)
  [lvol1_mimage_2]        /dev/sdc1(0)
  [lvol1_mlog]            /dev/sdd1(0)

3.3.2.5 创建Thinly-Provisioned逻辑卷

逻辑卷可以使用精简模式置备。这可让您创建大于可用扩展的逻辑卷。使用精简配置 , 您可以管理一个空闲空间的存储池 , 称为精简池 , 可在应用程序需要时将其分配给任意数量的设备。然后, 当应用程序实际写入逻辑卷时,您可以创建可绑定到精简池的设备以便以后分配。可在需要时动态扩展精简池 , 以便有效分配存储空间。

注 : 不支持集群中跨节点的精简卷。精简池及其所有精简卷必须只在一个集群节点中单独激活。

要创建精简卷 , 请执行以下任务 :

  1. 使用 vgcreate 命令创建卷组。

  2. 使用 lvcreate 命令创建精简池。

  3. 使用 lvcreate 命令在精简池中创建精简卷。

您可以使用 lvcreate 命令的 -T ( 或 --thin ) 选项来创建精简池或精简卷。您也可以使用 lvcreate 命令的 -T 选项 , 通过单个命令同时在该池中创建精简池和精简卷。

以下命令使用 lvcreate 命令的 -T 选项在卷组 vg001 中创建名为 mythinpool 的精简池 , 大小为 100M。

请注意 : 由于您要创建物理空间池 , 您必须指定池的大小。lvcreate 命令的 -T 选项不使用参数 ; 它会减少从命令指定的其他选项创建哪种设备类型。

# lvcreate -L 100M -T vg001/mythinpool
  Rounding up size to full physical extent 4.00 MiB
  Logical volume "mythinpool" created
# lvs
  LV            VG     Attr     LSize   Pool Origin Data%  Move Log Copy% Convert
  my mythinpool vg001  twi-a-tz 100.00m               0.00

以下命令使用 lvcreate 命令的 -T 选项在精简池 vg001/mythinpool 中创建名为 thinvolume 的精简卷。请注意 , 在本例中指定的是虚拟大小 , 并且指定的卷的虚拟大小大于包含它的池。

# lvcreate -V 1G -T vg001/mythinpool -n thinvolume
  Logical volume "thinvolume" created
# lvs
  LV          VG       Attr     LSize   Pool       Origin Data%  Move Log Copy%  Convert
  mythinpool  vg001    twi-a-tz 100.00m                     0.00
  thinvolume  vg001    Vwi-a-tz   1.00g mythinpool          0.00

以下命令使用 lvcreate 命令的 -T 选项创建一个精简池 , 并在该池中创建一个精简卷 , 方法是为 lvcreate 命令指定大小和虚拟大小参数。该命令在卷组 vg001 中创建一个名为 mythinpool 的精简池 , 它还在该池中创建名为 thinvolume 的精简卷。

# lvcreate -L 100M -T vg001/mythinpool -V 1G -n thinvolume
  Rounding up size to full physical extent 4.00 MiB
  Logical volume "thinvolume" created
# lvs
  LV           VG       Attr     LSize   Pool     Origin Data%  Move Log Copy%  Convert
  mythinpool   vg001    twi-a-tz 100.00m                   0.00
  thinvolume   vg001    Vwi-a-tz   1.00g mythinpool        0.00

您还可以通过指定 lvcreate 命令的 --thinpool 参数来创建精简池。与 -T 选项不同 , -- thinpool 参数需要一个参数 , 这是您要创建的精简池逻辑卷的名称。以下示例指定了 lvcreate 命令的 --thinpool 参数 , 以在卷组 vg001 中创建名为 mythinpool 的精简池 , 大小为 100M :

# lvcreate -L 100M --thinpool mythinpool vg001
  Rounding up size to full physical extent 4.00 MiB
  Logical volume "mythinpool" created
# lvs
  LV          VG     Attr     LSize   Pool Origin Data%  Move Log Copy% Convert
  mythinpool  vg001  twi-a-tz 100.00m               0.00

使用以下标准使用块大小 :

  • 较小的块需要更多元数据并隐藏性能 , 但它可以为快照提供更好的空间利用。

  • 大型块需要较少的元数据操作 , 但快照效率较低。

LVM2 通过以下方式计算块大小 :

默认情况下 , LVM以64KiB块大小开始 , 并在精简池元数据设备的大小超过 128MiB 时增加其值 , 因此元数据大小会保持紧凑。这可能会导致一些大的块值 , 对快照使用效率较低。在这种情况下 , 较小的块大小和大的元数据是一个更好的选择。

如果卷数据的大小在TiB范围内 , 使用~15.8GiB元数据大小(这是最大支持的大小) , 并根据要求使用块大小。但是, 如果您需要扩展这个卷数据的大小并具有小的块 , 则无法增大元数据大小。

警告

红帽建议至少使用默认块大小。如果块太小 , 且您的卷空间不足用于元数据 , 则该卷将无法创建数据。监控逻辑卷 , 以确保在元数据卷完全填满之前已扩展它们或创建更多存储。确保设置了足够大的块的精简池 , 使其不会耗尽元数据的空间。

创建池时支持条带。以下命令在卷组 vg001 中创建一个名为 pool 的 100M 精简池 , 其中有两个 64 kB 条带 , 块大小为 256 kB。它还创建一个 1T 精简卷 vg00/thin_lv。

# lvcreate -i 2 -I 64 -c 256 -L 100M -T vg00/pool -V 1T --name thin_lv

您可以使用 lvextend 命令扩展精简卷的大小。但是您无法缩小精简池的大小。

以下命令调整了一个已存在的精简池大小 , 其大小为 100M , 这样就扩展为 100M。

# lvextend -L+100M vg001/mythinpool
  Extending logical volume mythinpool to 200.00 MiB
  Logical volume mythinpool successfully resized
# lvs
  LV           VG       Attr     LSize   Pool     Origin Data%  Move Log Copy%  Convert
  mythinpool   vg001    twi-a-tz 200.00m                   0.00
  thinvolume   vg001    Vwi-a-tz   1.00g mythinpool          0.00

与其他类型的逻辑卷一样 , 您可以使用 lvrename 重命名卷 , 您可以使用 lvremove 删除卷 , 并使用 lvs 和 lvdisplay 命令显示有关卷的信息。

默认情况下 , lvcreate 命令根据公式(Pool_LV_size / Pool_LV_chunk_size * 64)设置精简池元数据逻辑卷的大小。如果您有大量快照 , 或者您的精简池有小的块大小 , 以后需要增加精简池的大小 , 则可能需要使用 lvcreate 命令的 --poolmetadatasize 参数增加精简池元数据卷的默认值。精简池元数据逻辑卷支持的值在 2MiB 到 16GiB 之间。

您可以使用 lvconvert 命令的 --thinpool 参数将现有逻辑卷转换为精简池卷。当您将现有逻辑卷转换为精简池卷时 , 必须使用 lvconvert 的 --poolmetadata 参数和 lvconvert 的 --thinpool 参数将现有逻辑卷转换为精简池卷的元数据卷。

注意

将逻辑卷转换成精简池卷或精简池元数据卷会破坏逻辑卷的内容 , 因为在这种情况下 , lvconvert 不会保留设备的内容 , 而是覆盖其内容。

以下示例将卷组 vg001 中的现有逻辑卷 lv1 转换为精简池卷 , 并将卷组 vg001 中现有逻辑卷 lv2 转换为该精简池卷的元数据卷。

# lvconvert --thinpool vg001/lv1 --poolmetadata vg001/lv2
  Converted vg001/lv1 to thin pool.

3.3.2.6 创建快照卷

使用 lvcreate 命令的 -s 参数来创建快照卷。快照卷是可写的。

注意

  • 不支持集群中跨节点的 LVM 快照。您不能在集群卷组中创建快照卷。但是 , 如果您需要在群集式逻辑卷中创建一致的数据备份 , 您可以单独激活该卷 , 然后创建快照。

  • 镜像逻辑卷支持 LVM 快照。

  • RAID逻辑卷支持快照。

LVM 不允许创建大于原始卷大小的快照卷 , 以及卷所需的元数据。如果您指定大于这个卷的快照卷 ,则系统会创建一个只根据原始卷大小所需的快照卷。

默认情况下 , 在正常激活命令中会跳过快照卷。

以下命令创建一个大小为 100 MB 的快照逻辑卷 , 大小为 /dev/vg00/snap。这会创建名为 /dev/vg00/lvol1 的原始逻辑卷的快照。如果原始逻辑卷包含一个文件系统 , 您可以在任意目录中挂载快照逻辑卷 , 以便访问文件系统的内容 , 并在不断更新原始文件系统时进行备份。

# lvcreate --size 100M --snapshot --name snap /dev/vg00/lvol1

创建快照逻辑卷后 , 在 lvdisplay 命令中指定原始卷可生成输出 , 其中包括所有快照逻辑卷的列表及其状态(活跃或不活跃)。

以下示例显示了逻辑卷 /dev/new_vg/lvol0 的状态 , 该逻辑卷 /dev/new_vg/newvgsnap 均已创建。

# lvdisplay /dev/new_vg/lvol0
  --- Logical volume ---
  LV Name                /dev/new_vg/lvol0
  VG Name                new_vg
  LV UUID                LBy1Tz-sr23-OjsI-LT03-nHLC-y8XW-EhCl78
  LV Write Access        read/write
  LV snapshot status     source of
                         /dev/new_vg/newvgsnap1 [active]
  LV Status              available
  # open                 0
  LV Size                52.00 MB
  Current LE             13
  Segments               1
  Allocation             inherit
  Read ahead sectors     0
  Block device           253:2

默认情况下 , lvs 命令将显示原始卷以及正在使用的快照卷的比例。以下示例显示 , 对于包含逻辑卷 /dev/new_vg/lvol0的系统的 lvs 命令的默认输出 , 该逻辑卷 /dev/new_vg/lvol0 已创建快照卷 /dev/new_vg/newvgsnap。

# lvs
  LV         VG     Attr   LSize  Origin Snap%  Move Log Copy%
  lvol0      new_vg owi-a- 52.00M
  newvgsnap1 new_vg swi-a-  8.00M lvol0    0.20

注 : 因为快照在原始卷有变化时会增加 , 所以通常使用 lvs 命令监控快照卷的比例以确保不会填满。使用了 100% 的快照会完全丢失 , 因为对原始卷中未更改的部分的写入无法在不破坏快照的情况下无法成功。

当快照已满时 , 除了快照本身无效外 , 所有在那个快照设备中挂载的文件系统都会被强制卸载 , 这避免了访问挂载点时出现的文件系统错误。另外 , 您可以在 lvm.conf 文件中指定 snapshot_autoextend_threshold 选项。这个选项允许在剩余的快照空间低于您设定的阈值时自动扩展快照。这个功能要求卷组中还有未被分配的空间。

LVM 不允许创建大于原始卷大小的快照卷 , 以及卷所需的元数据。同样 , 快照的自动扩展不会将快照卷的大小增加到超过计算的快照所需的最大值。一旦快照增长到足够大来覆盖原始数据后 , 便不会再监控它是否发生了自动扩展。

在 lvm.conf 文件中提供了有关设置 snapshot_autoextend_threshold 和 snapshot_autoextend_percent 的信息。

3.3.2.7 创建Thinly-Provisioned Snapshot卷

在创建精简快照卷时 , 您不用指定卷的大小。如果指定了size参数 , 则创建的快照不会是一个精简快照卷 , 也不会使用精简池来存储数据。例如 , 命令 lvcreate -s vg/thinvolume -L10M 不会创建精简快照 , 即使原始卷是一个精简卷。

可为精简配置的原始卷创建精简快照 , 也可针对不是精简置备的原始卷创建精简快照。

您可以使用 lvcreate 命令的 --name 选项为快照卷指定名称。以下命令创建了名为 mysnapshot1 的精简置备逻辑卷 vg001/thinvolume 的精简置备快照卷。

# lvcreate -L 1G -T vg001/mythinpool -V 100MB -n thinvolume
  Thin pool volume with chunk size 64.00 KiB can address at most <15.88 TiB of data.
  Logical volume "thinvolume" created.
# lvs
  LV         VG    Attr       LSize   Pool       Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root       rl    -wi-ao---- <17.00g                                                          
  swap       rl    -wi-ao----   2.00g                                                          
  mythinpool vg001 twi-aotz--   1.00g                   0.00   11.04                           
  thinvolume vg001 Vwi-a-tz-- 100.00m mythinpool        0.00                             
[root@localhost ~]# lvcreate -s --name mysnapthot1 vg001/thinvolume
  Logical volume "mysnapthot1" created.
[root@localhost ~]# lvs
  LV          VG    Attr       LSize   Pool       Origin     Data%  Meta%  Move Log Cpy%Sync Convert
  root        rl    -wi-ao---- <17.00g                                                              
  swap        rl    -wi-ao----   2.00g                                                              
  mysnapthot1 vg001 Vwi---tz-k 100.00m mythinpool thinvolume                                        
  mythinpool  vg001 twi-aotz--   1.00g                       0.00   11.04                           
  thinvolume  vg001 Vwi-a-tz-- 100.00m mythinpool            0.00            

注 : 在使用精简配置时 , 存储管理员务必要监控存储池 , 并在其被完全占用时添加更多容量。

精简快照卷具有与其它精简卷相同的特征。您可以独立激活卷、扩展卷、重新命名卷、删除卷、甚至快照卷。

默认情况下 , 在正常激活命令中会跳过快照卷。

您还可以为非精简配置的逻辑卷创建精简配置快照。由于非精简配置的逻辑卷不包含在精简池中, 所以它被称为 外部原始卷。外部原始卷可以被很多精简配置的快照卷使用和共享 , 即使在不同的精简池中也是如此。在创建精简置备快照时 , 外部原始源必须为inactive状态且只读。

要为外部来源创建精简配置的快照 , 您必须指定 --thinpool 选项。以下命令为只读不活跃卷 origin_volume 创建精简快照卷。精简快照卷名为 mythinsnap。逻辑卷 origin_volume 随后成为精简快照卷 mythinsnap 在卷组 vg001 中的精简外部原始卷 , 该源将使用现有的精简池 vg001/pool。因为原始卷必须与快照卷位于同一个卷组中 , 所以您在指定原始逻辑卷时不需要指定卷组。

# lvcreate -s --thinpool vg001/pool origin_volume --name mythinsnap
​
例子
# lvcreate -s --thinpool vg001/mythinpool  thinvolume --name mythinsnap
等效于
# lvcreate -s --name  mythinsnap vg001/thinvolume 

您可以创建第一个快照卷的第二个精简置备快照卷 , 如下例所示。

# lvcreate -s vg001/mythinsnap --name mythinsnap2

从 CentOS 7.2 开始 , 您可以通过指定 lv_ancestors 和 lv_descendants 报告字段来显示精简快照逻辑卷的所有ancestors和descendants 报告字段。

在以下示例中 :

  • stack1 是卷组 vg001 中的原始卷。

  • stack2 是 stack1的快照

  • stack3 是 stack2的快照

  • stack4 是 stack3的快照

另外 :

  • stack5 也是 stack2的快照

  • stack6 是 stack5的快照

$ lvs -o name,lv_ancestors,lv_descendants vg001
  LV      Ancestors              Descendants
  stack1                         stack2,stack3,stack4,stack5,stack6
  stack2  stack1                 stack3,stack4,stack5,stack6
  stack3  stack2,stack1          stack4
  stack4  stack3,stack2,stack1
  stack5  stack2,stack1          stack6
  stack6  stack5,stack2,stack1
  pool

注 : lv_ancestors 和 lv_descendants 字段显示现有的依赖项 , 但不会跟踪删除的条目 , 如果从链中删除该条目 , 则可能会破坏依赖项链。例如 , 如果您从这个示例配置中删除逻辑卷 stack3 , 则显示如下 :

$ lvs -o name,lv_ancestors,lv_descendants vg001
LV      Ancestors              Descendants
stack1                         stack2,stack5,stack6
stack2  stack1                 stack5,stack6
stack4
stack5  stack2,stack1          stack6
stack6  stack5,stack2,stack1
pool

从 CentOS7.3 开始 , 您可以将您的系统配置为跟踪和显示已删除的逻辑卷 , 您可以通过指定 lv_ancestors_full 和 lv_descendants_full 字段来显示包括这些卷的完整依赖项链。

3.3.2.8 创建LVM缓存逻辑卷

LVM 提供了对 LVM 缓存逻辑卷的全面支持。缓存逻辑卷使用由快速块设备(比如SSD驱动器)组成的小逻辑卷 , 通过存储在较小的、更快的逻辑卷中存储常用的块来提高更大的、较慢的逻辑卷性能。

LVM缓存使用以下LVM逻辑卷类型。所有这些关联的逻辑卷必须位于同一卷组中。

  • 原始逻辑卷 : 较慢的逻辑卷

  • 缓存池逻辑卷 :小的快速逻辑卷 , 由两个设备组成 : 缓存数据逻辑卷和缓存元数据逻辑卷

  • 缓存数据逻辑卷 : 包含缓存池逻辑卷的数据块的逻辑卷

  • 缓存元数据逻辑卷 : 包含缓存池逻辑卷元数据的逻辑卷 , 其中包含了用来指定数据块存储位置的信息(例如 , 在原始卷或者缓存数据逻辑卷中)的元数据。

  • 缓存逻辑卷 : 包含原始逻辑卷和缓存池逻辑卷的逻辑卷。这是封装各种缓存卷组件的结果可用设备。

下面的步骤创建了 LVM 缓存逻辑卷。

  1. 创建包含较慢的物理卷和快速物理卷的卷组。在本例中 : /dev/sde1 是一个速度较慢的设备 , /dev/sdf1 是一个快速设备 , 两个设备都包含在卷组 VG 中。

    # pvcreate /dev/sde1
    # pvcreate /dev/sdf1
    # vgcreate VG /dev/sde1 /dev/sdf1
  2. 创建原始卷。这个示例创建一个名为 lv 的原始卷 , 大小为 10GB , 它由 /dev/sde1 ( 较慢的物理卷 ) 组成。

    # lvcreate -L 10G -n lv VG /dev/sde1
  3. 创建缓存池逻辑卷。这个示例在快速设备 /dev/sdf1 中创建名为 cpool 的缓存池逻辑卷 , 该逻辑卷是卷组 VG 的一部分。这个缓存池逻辑卷由隐藏的缓存数据逻辑卷 cpool_cdata 和隐藏缓存元数据逻辑卷 cpool_cmeta 组成。

    # lvcreate --type cache-pool -L 5G -n cpool VG /dev/sdf1
      Using default stripesize 64.00 KiB.
      Logical volume "cpool" created.
    # lvs -a -o name,size,attr,devices VG
      LV              LSize  Attr       Devices
      [cpool]          5.00g Cwi---C--- cpool_cdata(0)
      [cpool_cdata]    5.00g Cwi-ao---- /dev/sdf1(4)
      [cpool_cmeta]    8.00m ewi-ao---- /dev/sdf1(2)

    对于更复杂的配置 , 您可能需要单独创建缓存数据和缓存元数据逻辑卷 , 然后将卷合并到缓存池逻辑卷中。有关此过程的详情请参考 lvmcache(7) man page。

    可以直接创建原始卷之后,通过lvconvert转换为缓存池。

    lvcreate -L 1G -n cpool VG 
    lvconvert --type cache-pool  --poolmetadata vg001/lv_cache_meta VG/cpool

  4. 通过将缓存池逻辑卷和原始逻辑卷绑定在一起创建缓存逻辑卷。生成的用户可访问的缓存逻辑卷采用原始逻辑卷的名称。原始卷成为一个隐藏逻辑卷 , 它附加了 _corig , 并附加到原始名称。请注意 , 此转换可以实时完成 , 但您必须首先执行备份。

    # lvconvert --type cache --cachepool cpool VG/lv
      Logical volume cpool is now cached.
    # lvs -a -o name,size,attr,devices vg
        LV              LSize  Attr       Devices
        [cpool]          5.00g Cwi---C--- cpool_cdata(0)
        [cpool_cdata]    5.00g Cwi-ao---- /dev/sdf1(4)
        [cpool_cmeta]    8.00m ewi-ao---- /dev/sdf1(2)
        lv              10.00g Cwi-a-C--- lv_corig(0)
        [lv_corig]      10.00g owi-aoC--- /dev/sde1(0)
        [lvol0_pmspare]  8.00m ewi------- /dev/sdf1(0)
  5. 另外, 您可以将缓存的逻辑卷转换为精简池逻辑卷。请注意 , 从池中创建的任何精简逻辑卷都将共享缓存。

    以下命令使用快速设备 /dev/sdf1 来分配精简池元数据(lv_tmeta)。这是缓存池卷使用的相同设备 , 这意味着精简池元数据卷与缓存数据逻辑卷 cpool_cdata 和缓存元数据逻辑卷 cpool_cmeta 共享。

    # lvconvert --type thin-pool VG/lv /dev/sdf1
       WARNING: Converting logical volume VG/lv to thin pool's data volume with metadata wiping.
       THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
     Do you really want to convert VG/lv? [y/n]: y
       Converted VG/lv to thin pool.
    # lvs -a -o name,size,attr,devices vg
       LV               LSize  Attr       Devices
       [cpool]           5.00g Cwi---C--- cpool_cdata(0)
       [cpool_cdata]     5.00g Cwi-ao---- /dev/sdf1(4)
       [cpool_cmeta]     8.00m ewi-ao---- /dev/sdf1(2)
       lv               10.00g twi-a-tz-- lv_tdata(0)
       [lv_tdata]       10.00g Cwi-aoC--- lv_tdata_corig(0)
       [lv_tdata_corig] 10.00g owi-aoC--- /dev/sde1(0)
       [lv_tmeta]       12.00m ewi-ao---- /dev/sdf1(1284)
       [lvol0_pmspare]  12.00m ewi------- /dev/sdf1(0)
       [lvol0_pmspare]  12.00m ewi------- /dev/sdf1(1287)
  6. 取消缓存

    lvconvert --uncache VG/lv

3.3.3 删除逻辑卷

lvremove : 用于删除指定LVM逻辑卷。

[root@localhost ~]# lvremove /dev/vg100/lv3  
Do you really want to remove active logical volume lv3? [y/n]: y
  Logical volume "lv3" successfully removed
​

在删除逻辑卷之前 , 可以使用lvchange -an命令显式地取消激活逻辑卷 , 在这种情况下 , 不会看到验证是否要删除活动逻辑卷的提示符。

3.3.4 扩展逻辑卷空间大小

lvextend: 用于在线扩展逻辑卷的空间大小 , 而不中断应用程序对逻辑卷的访问。

  • -L [+]#[mMgGtT] : 指定逻辑卷的大小 , 单位为“kKmMgGtT”字节;

  • -l : 指定逻辑卷的大小 ( LE|PE数 ) 。(%{VG|FREE})

  • -r : 直接修改文件系统大小

+ :表示增加#空间 , 如果没有+表示直接增加到对应空间大小

[root@localhost ~]# lvextend -L +4G /dev/vg100/lv100  
  Size of logical volume vg100/lv100 changed from 9.00 GiB (2304 extents) to 13.00 GiB (3328 extents).
  Logical volume lv100 successfully resized.
[root@localhost ~]# resize2fs  /dev/vg100/lv100 
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/vg100/lv100 is mounted on /mnt; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/vg100/lv100 to 3407872 (4k) blocks.
The filesystem on /dev/vg100/lv100 is now 3407872 blocks long.
如果直接在lvextend之后 -r ,可以直接扩展文件系统大小。
[root@localhost ~]# lvextend -L +4G -r /dev/vg100/lv100  
  Size of logical volume vg100/lv100 changed from 13.00 GiB (3328 extents) to 17.00 GiB (4352 extents).
  Logical volume lv100 successfully resized.
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/mapper/vg100-lv100 is mounted on /mnt; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 2
Performing an on-line resize of /dev/mapper/vg100-lv100 to 4456448 (4k) blocks.
The filesystem on /dev/mapper/vg100-lv100 is now 4456448 blocks long.
​
​

3.3.5 减少逻辑卷空间

lvreduce : 用于减少LVM逻辑卷占用的空间大小。

用法与lvextend 类似 lvreduce 中使用-,与lvextend中+用法类似 另外在减少逻辑卷空间之前 , 需要卸载以及e2fsck 检查文件系统

  • 具体步骤

    • umount /mnt/lv0

    • fsck -f /dev/vg0/lv0

    • resize2fs /dev/vg0/lv0 8G

    • lvreduce -L 8G /dev/vg0/lv0

[root@localhost ~]# e2fsck -f /dev/vg100/lv0
e2fsck 1.41.12 (17-May-2010)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/vg100/lv0: 11/655360 files (0.0% non-contiguous), 76783/2621440 blocks
[root@localhost ~]# lvreduce -L -5G -r /dev/vg100/lv0
fsck from util-linux-ng 2.17.2
/dev/mapper/vg100-lv0: clean, 11/655360 files, 76783/2621440 blocks
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/mapper/vg100-lv0 to 1310720 (4k) blocks.
The filesystem on /dev/mapper/vg100-lv0 is now 1310720 blocks long.

  Size of logical volume vg100/lv0 changed from 10.00 GiB (2560 extents) to 5.00 GiB (1280 extents).
  Logical volume lv0 successfully resized.

lvresize 可以同时实现lvreduce,lvextend , 用法与这两个命令用法一样。

3.3.6 给逻辑卷重命名

lvrename :重命令逻辑卷

[root@localhost ~]# lvrename /dev/vg100/lv0 /dev/vg100/lv100
  Renamed "lv0" to "lv100" in volume group "vg100"
[root@localhost ~]# lvrename vg100  lv0 lv100

3.3.7 合并快照卷

您可以使用 lvconvert 命令的 --merge 选项将快照合并到其原始卷中。如果原始卷和快照卷都没有打开 , 则合并将立即开始。否则会在激活原始卷或快照卷并全部处于关闭状态时第一次执行合并。将快照合并到无法关闭的原始卷 ( 如 root 文件系统 ) 的过程中会延迟到下一次原始卷被激活时。当合并开始后 , 得到的逻辑卷将具有原始卷的名称、副号码和 UUID。在合并过程中 , 对原始卷的读取和写入将会被指向要合并的快照。当合并完成后 , 会删除合并的快照。

以下命令将快照卷 vg00/lvol1_snap 合并到原始卷中。

# lvconvert --merge vg00/lvol1_snap

您可以在命令行中指定多个快照 , 或者您可以使用 LVM 对象标签指定要合并到其各自原始卷的快照。在以下示例中 , 逻辑卷 vg00/lvol1、 vg00/lvol2 和 vg00/lvol3 都带有标签 @some_tag。下面的命令按顺序合并所有三个卷的快照逻辑卷 : vg00/lvol1 , 然后是 vg00/lvol2 , 然后是 vg00/lvol3。如果使用 --background 选项 , 则所有快照逻辑卷合并都会并行启动。

# lvconvert --merge @some_tag

3.3.8 持久性设备号码

在载入模块的时候会自动分配主设备号码和副设备号码。如果总是使用相同的设备 ( 主和副 ) 号码激活块设备 , 有些应用程序效果最好。您可以使用以下参数通过 lvcreate 和 lvchange 命令来指定这些参数 :

--persistent y --major major --minor minor

使用大的副号码以确定还没有动态分配给另一个设备。

如果您要使用 NFS 导出文件系统 , 在导出文件中指定 fsid 参数可能会导致需要在 LVM 中设置持久的设备号码。

3.3.9 更改逻辑卷参数

要更改逻辑卷的参数 , 请使用 lvchange 命令。

您可以使用 lvchange 命令来激活和停用逻辑卷。

以下命令可将卷组 vg00 中卷 lvol1 的权限更改为只读。

# lvchange -pr vg00/lvol1

3.3.10 从逻辑卷中删除磁盘

3.3.10.1 将extents移到现有物理卷中

在这个示例中 , 逻辑卷在卷组 myvg 的四个物理卷中进行分配。

# pvs -o+pv_used
  PV         VG   Fmt  Attr PSize  PFree  Used
  /dev/sda1  myvg lvm2 a-   17.15G 12.15G  5.00G
  /dev/sdb1  myvg lvm2 a-   17.15G 12.15G  5.00G
  /dev/sdc1  myvg lvm2 a-   17.15G 12.15G  5.00G
  /dev/sdd1  myvg lvm2 a-   17.15G  2.15G 15.00G

这个示例将扩展从 /dev/sdb1 移出 , 以便将其从卷组中删除。

  1. 如果卷组中其他物理卷上有足够的可用扩展 , 您可以在想要删除的设备中执行 pvmove 命令 , 并且扩展将分配给其他设备。

    # pvmove /dev/sdb1
      /dev/sdb1: Moved: 2.0%
     ...
      /dev/sdb1: Moved: 79.2%
     ...
      /dev/sdb1: Moved: 100.0%

    执行完 pvmove 命令后 , 扩展分布如下 :

    # pvs -o+pv_used
      PV         VG   Fmt  Attr PSize  PFree  Used
      /dev/sda1  myvg lvm2 a-   17.15G  7.15G 10.00G
      /dev/sdb1  myvg lvm2 a-   17.15G 17.15G     0
      /dev/sdc1  myvg lvm2 a-   17.15G 12.15G  5.00G
      /dev/sdd1  myvg lvm2 a-   17.15G  2.15G 15.00G
  2. 使用 vgreduce 命令从卷组中删除物理卷 /dev/sdb1。

    # vgreduce myvg /dev/sdb1
      Removed "/dev/sdb1" from volume group "myvg"
    # pvs
      PV         VG   Fmt  Attr PSize  PFree
      /dev/sda1  myvg lvm2 a-   17.15G  7.15G
      /dev/sdb1       lvm2 --   17.15G 17.15G
      /dev/sdc1  myvg lvm2 a-   17.15G 12.15G
      /dev/sdd1  myvg lvm2 a-   17.15G  2.15G

该磁盘现在可以物理删除或者分配给其他用户。

3.3.10.2 将extents移动到新的磁盘中

逻辑卷在卷组 myvg 中的三个物理卷中进行分配 , 如下所示 :

# pvs -o+pv_used
  PV         VG   Fmt  Attr PSize  PFree  Used
  /dev/sda1  myvg lvm2 a-   17.15G  7.15G 10.00G
  /dev/sdb1  myvg lvm2 a-   17.15G 15.15G  2.00G
  /dev/sdc1  myvg lvm2 a-   17.15G 15.15G  2.00G

这个示例步骤将 /dev/sdb1 的扩展移动到新设备 /dev/sdd1 中。

  1. 从 /dev/sdd1 创建新物理卷。

    # pvcreate /dev/sdd1
      Physical volume "/dev/sdd1" successfully created
  2. 将新物理卷 /dev/sdd1 添加到现有卷组 myvg 中。

    # vgextend myvg /dev/sdd1
      Volume group "myvg" successfully extended
    # pvs -o+pv_used
      PV         VG   Fmt  Attr PSize  PFree  Used
      /dev/sda1   myvg lvm2 a-   17.15G  7.15G 10.00G
      /dev/sdb1   myvg lvm2 a-   17.15G 15.15G  2.00G
      /dev/sdc1   myvg lvm2 a-   17.15G 15.15G  2.00G
      /dev/sdd1   myvg lvm2 a-   17.15G 17.15G     0
  3. 使用 pvmove 命令将数据从 /dev/sdb1 移动到 /dev/sdd1。

    # pvmove /dev/sdb1 /dev/sdd1
      /dev/sdb1: Moved: 10.0%
    ...
      /dev/sdb1: Moved: 79.7%
    ...
      /dev/sdb1: Moved: 100.0%
    
    # pvs -o+pv_used
      PV          VG   Fmt  Attr PSize  PFree  Used
      /dev/sda1   myvg lvm2 a-   17.15G  7.15G 10.00G
      /dev/sdb1   myvg lvm2 a-   17.15G 17.15G     0
      /dev/sdc1   myvg lvm2 a-   17.15G 15.15G  2.00G
      /dev/sdd1   myvg lvm2 a-   17.15G 15.15G  2.00G
  4. 将数据从 /dev/sdb1 移出后 , 您可以将其从卷组中删除。

    # vgreduce myvg /dev/sdb1
      Removed "/dev/sdb1" from volume group "myvg"

现在您可以将磁盘重新分配给另一个卷组 , 或者将其从系统中删除。

3.3.11 集群中创建镜像LVM卷

在集群中创建镜像 LVM 逻辑卷需要的命令和步骤与在片段类型为mirror的单个节点上创建镜像 LVM 逻辑卷的相同。但是,要在集群中创建镜像 LVM 卷:

  • 集群和集群镜像基础架构必须正在运行

  • 集群必须是 quorate

  • 必须正确设置 lvm.conf 文件中的锁定类型来启用群集锁定 , 而 use_lvmetad 设置应为 0。但请注意, ocf:heartbeat:clvm Pacemaker 资源代理本身是开始过程的一部分 , 请执行这些任务。

集群通过Pacemaker进行管理。集群式`LVM逻辑卷只支持与 Pacemaker 集群一起使用 , 且必须配置为集群资源。

以下流程在集群中创建镜像LVM卷。

  1. 安装集群软件和 LVM 软件包 , 启动集群软件并创建集群。您必须为集群配置隔离。文档 High Availability Add-On 管理 提供了创建集群并为集群中节点配置隔离的示例步骤。文档 High Availability Add-On 参考 提供有关集群配置组件的更多详情。

  2. 要创建集群中所有节点共享的镜像逻辑卷 , 必须在集群的每个节点中的 lvm.conf 文件中正确设置锁定类型。默认情况下 , 锁定类型被设置为 local。要更改它 , 在集群的每个节点中执行以下命令以启用群集式锁定 :

    # /sbin/lvmconf --enable-cluster
  3. 为集群设置 dlm 资源。作为克隆的资源创建资源 , 以便在集群中的每个节点上运行。

    # pcs resource create dlm ocf:pacemaker:controld op monitor interval=30s on-fail=fence clone interleave=true ordered=true
  4. 将 clvmd 配置为群集资源。就像 dlm 资源一样 , 您将创建该资源作为克隆的资源 , 以便其在群集中的每个节点上运行。请注意 , 您必须设置 with_cmirrord=true 参数 , 以便在 clvmd 运行的所有节点上启用 cmirrord 守护进程。

    # pcs resource create clvmd ocf:heartbeat:clvm with_cmirrord=true op monitor interval=30s on-fail=fence clone interleave=true ordered=true

    如果您已经配置了 clvmd 资源 , 但没有指定 with_cmirrord=true 参数 , 您可以使用以下命令更新资源使其包含 参数。

    # pcs resource update clvmd with_cmirrord=true
  5. 设置 clvmd 和 dlm 依赖项 , 并启动顺序。clvmd 必须在 dlm 之后启动 , 且必须与 dlm 在同一个节点上运行。

    # pcs constraint order start dlm-clone then clvmd-clone
    # pcs constraint colocation add clvmd-clone with dlm-clone
  6. 创建镜像。第一步是创建物理卷。以下命令创建三个物理卷。两个物理卷将用于镜像分支 , 第三个物理卷将包含镜像日志。

    # pvcreate /dev/sdb1
      Physical volume "/dev/sdb1" successfully created
    # pvcreate /dev/sdc1
      Physical volume "/dev/sdc1" successfully created
    # pvcreate /dev/sdd1
      Physical volume "/dev/sdd1" successfully created
  7. 创建卷组。这个示例创建一个卷组 vg001 , 它由上一步中创建的三个物理卷组成。

    # vgcreate vg001 /dev/sdb1 /dev/sdc1 /dev/sdd1
      Clustered volume group "vg001" successfully created

    请注意 , vgcreate 命令的输出表示卷组已集群。您可以使用 vgs 命令验证卷组是否进行了群集 , 该命令将显示卷组的属性。如果卷组已群集 , 它将显示c属性。

    # vgs vg001
      VG       #PV #LV #SN Attr   VSize  VFree
      vg001      3   0   0 wz--nc 68.97G 68.97G
  8. 创建镜像的逻辑卷。这个示例从卷组 vg001 创建逻辑卷 mirrorlv。这个卷有一个镜像分支。这个示例指定将哪个物理卷扩展用于逻辑卷。

    # lvcreate --type mirror -l 1000 -m 1 vg001 -n mirrorlv /dev/sdb1:1-1000 /dev/sdc1:1-1000 /dev/sdd1:0
      Logical volume "mirrorlv" created

    您可以使用 lvs 命令显示镜像创建的进度。以下示例显示 , 镜像为 47% 同步 , 然后同步 91% , 然后在镜像完成时 100% 同步。

    # lvs vg001/mirrorlv
      LV       VG       Attr   LSize Origin Snap%  Move Log           Copy%  Convert
      mirrorlv vg001    mwi-a- 3.91G                    vg001_mlog     47.00
    # lvs vg001/mirrorlv
      LV       VG       Attr   LSize Origin Snap%  Move Log           Copy%  Convert
      mirrorlv vg001    mwi-a- 3.91G                    vg001_mlog     91.00   
    #  lvs vg001/mirrorlv
      LV       VG       Attr   LSize Origin Snap%  Move Log           Copy%  Convert
      mirrorlv vg001    mwi-a- 3.91G                    vg001_mlog    100.00

    在系统日志中记录了镜像完成 :

    May 10 14:52:52 doc-07 [19402]: Monitoring mirror device vg001-mirrorlv for events
    May 10 14:55:00 doc-07 lvm[19402]: vg001-mirrorlv is now in-sync
  9. 您可以使用 lvs 命令和 -o +devices 选项来显示镜像的配置 , 包括哪些设备组成镜像分支。您可以看到此示例中的逻辑卷由两个线性镜像和一个日志组成。

    # lvs -a -o +devices
      LV                  VG         Attr   LSize  Origin Snap%  Move Log           Copy%  Convert Devices                                  
      mirrorlv            vg001      mwi-a-  3.91G                    mirrorlv_mlog 100.00         mirrorlv_mimage_0(0),mirrorlv_mimage_1(0)
      [mirrorlv_mimage_0] vg001      iwi-ao  3.91G                                                 /dev/sdb1(1)                            
      [mirrorlv_mimage_1] vg001      iwi-ao  3.91G                                                 /dev/sdc1(1)                            
      [mirrorlv_mlog]     vg001      lwi-ao  4.00M                                                 /dev/sdd1(0)

    您可以使用 lvs 的 seg_pe_ranges 选项显示数据布局。您可以使用这个选项验证您的布局是否正确冗余。此命令的输出显示 PE 范围相同 , 其格式是 lvcreate 和 lvresize 命令作为输入。

    # lvs -a -o +seg_pe_ranges --segments
      PE Ranges                                      
      mirrorlv_mimage_0:0-999 mirrorlv_mimage_1:0-999
      /dev/sdb1:1-1000                              
      /dev/sdc1:1-1000                              
      /dev/sdd1:0-0

4. 移动硬盘至新的主机步骤

注 : 硬盘中存在逻辑卷

  • 源主机中

    1. 在旧系统中 , umount所有卷组上的逻辑卷

    2. vgchange –a n vg0 ;lvdisplay

    3. vgexport vg0 ;pvscan ; vgdisplay

  • 目标主机中

    1. 在新系统中安装旧硬盘 , 并vgimport vg0

    2. vgchange –ay vg0

    3. mount所有卷组上的逻辑卷

5 逻辑卷中的快照功能

快照是特殊的逻辑卷 , 它是在生成快照时存在的逻辑卷的准确拷贝。 对于需要备份或者复制的现有数据集临时拷贝以及其它操作来说 , 快照是最合适的选择。

快照只有在它们和原来的逻辑卷不同时才会消耗空间 。在生成快照时会分配给它一定的空间 , 但只有在原来的逻辑卷或 者快照有所改变才会使用这些空间。 当原来的逻辑卷中有所改变时 , 会将旧的数据复制到快照中。快照中只含有原来的逻辑卷中更改的数据或者自生成快照后的快 照中更改的数据。 建立快照的卷大小只需要原始逻辑卷的15%~20%就够了,也可 以使用lvextend放大快照 。

逻辑卷中的快照可以直接通过lvcreate创建有快照功能的逻辑卷实现这个功能。直接指明逻辑卷需要创建的逻辑卷可以在原有的卷组中创建快照卷信息。创建的快照卷无需创建文件系统即可使用。

  • 设置快照 lvcreate -n lv0-snapshot -L 1G -s -p r /dev/vg0/lv0

  • 恢复快照 lvconvert --merge /dev/vg0/lv0-snapshot

[root@localhost /]# lvcreate -L 1G -s -n lv100-snapshot-1 -p r /dev/vg100/lv100 
  Logical volume "lv100-snapshot-1" created.
[root@localhost /]# mount /dev/vg100/lv100-snapshot-1  /media/
mount: block device /dev/mapper/vg100-lv100--snapshot--1 is write-protected, mounting read-only
[root@localhost /]# cd /media/
[root@localhost media]# ls
adjtime                cron.hourly              fstab             issue.net       mtab            profile.d       rsyslog.d       sysconfig
aliases                cron.monthly             gai.conf          kdump-adv-conf  my.cnf          protocols       rwtab           sysctl.conf
aliases.db             crontab                  gcrypt            kdump.conf      netconfig       quotagrpadmins  rwtab.d     
[root@localhost media]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                       18G  1.2G   16G   8% /
tmpfs                 939M     0  939M   0% /dev/shm
/dev/sda1             477M   40M  412M   9% /boot
/dev/mapper/vg100-lv100
                      4.8G   40M  4.6G   1% /mnt
/dev/mapper/vg100-lv100--snapshot--1
                      4.8G   40M  4.6G   1% /media
[root@localhost /]# lvconvert --merge vg100/lv100-snapshot
  Merging of volume lv100-snapshot started.
  lv100: Merged: 100.0%
  Merge of snapshot into logical volume lv100 has finished.
  Logical volume "lv100-snapshot" successfully removed
#通过lvconvert --merge 命令回复数据 ,  如果使用这个命令之后快照会自动消失。恢复数据时 , 需要卸载快照的逻辑卷否则恢复会失败。

可以看到目录创建快照的目录中有原来的逻辑卷信息 , 快照卷的空间在挂载时可以看到和原来的逻辑卷空间相同 , 但是实际只有1G

6. LVM故障排除

如果命令无法正常工作 , 您可以使用以下方法收集诊断 :

  • 使用 -v、-vv、-vvv 或 -vvv 参数 , 以更加详细的输出级别。

  • 如果问题与逻辑卷激活有关 , 请在 配置文件的 log 部分设置 activation = 1 , 并使用 -vvvv 参数运行 命令。检查完此输出结果后 , 请务必将这个参数重置为 0 , 以避免在内存不足期间计算机锁定问题。

  • 运行 lvmdump 命令 , 它为诊断提供信息转储。

  • 执行 lvs -v、pvs -a 或 dmsetup info -c 命令以获得额外的系统信息。

  • 在 /etc/lvm/backup 文件中检查元数据的最后一个备份 , 并在 /etc/lvm/archive 文件中检查存档版本。

  • 运行 lvmconfig 命令检查当前的配置信息。

  • 检查 /etc/lvm 目录中的 .cache 文件 , 了解哪些设备上具有物理卷的记录

6.1 在失败设备中显示信息

您可以使用 lvs 或 vgs 命令的 -P 参数显示有关在输出中未显示失败的卷的信息。此参数允许一些操作 , 即使元数据在内部不完全一致。例如 , 如果组成卷组 vg 的设备之一失败 , vgs 命令可能会显示以下输出 :

# vgs -o +devices
  Volume group "vg" not found

如果您指定 vgs 命令的 -P 参数 , 则卷组 仍然不可用 , 但您可以看到有关失败设备的更多信息。

# vgs -P -o +devices
  Partial mode. Incomplete volume groups will be activated read-only.
  VG   #PV #LV #SN Attr   VSize VFree Devices
  vg     9   2   0 rz-pn- 2.11T 2.07T unknown device(0)
  vg     9   2   0 rz-pn- 2.11T 2.07T unknown device(5120),/dev/sda1(0)

在这个示例中 , 失败的设备导致卷组中的线性和条状逻辑卷都失败。不带 -P 参数的 lvs 命令将显示以下输出 :

# lvs -a -o +devices
  Volume group "vg" not found

使用 -P 参数显示已失败的逻辑卷。

# lvs -P -a -o +devices
  Partial mode. Incomplete volume groups will be activated read-only.
  LV     VG   Attr   LSize  Origin Snap%  Move Log Copy%  Devices
  linear vg   -wi-a- 20.00G                               unknown device(0)
  stripe vg   -wi-a- 20.00G                               unknown device(5120),/dev/sda1(0)

以下示例显示了当镜像逻辑卷分支失败时指定的 -P 参数的 pvs 和 lvs 命令的输出。

# vgs -a -o +devices -P
  Partial mode. Incomplete volume groups will be activated read-only.
  VG    #PV #LV #SN Attr   VSize VFree Devices
  corey   4   4   0 rz-pnc 1.58T 1.34T my_mirror_mimage_0(0),my_mirror_mimage_1(0)
  corey   4   4   0 rz-pnc 1.58T 1.34T /dev/sdd1(0)
  corey   4   4   0 rz-pnc 1.58T 1.34T unknown device(0)
  corey   4   4   0 rz-pnc 1.58T 1.34T /dev/sdb1(0)
# lvs -a -o +devices -P
  Partial mode. Incomplete volume groups will be activated read-only.
  LV                   VG    Attr   LSize   Origin Snap%  Move Log            Copy%  Devices
  my_mirror            corey mwi-a- 120.00G                    my_mirror_mlog   1.95 my_mirror_mimage_0(0),my_mirror_mimage_1(0)
  [my_mirror_mimage_0] corey iwi-ao 120.00G                                          unknown device(0)
  [my_mirror_mimage_1] corey iwi-ao 120.00G                                          /dev/sdb1(0)
  [my_mirror_mlog]     corey lwi-ao   4.00M      

6.2 从LVM镜像故障中恢复

这部分提供了在 LVM 镜像卷的一个分支失败时恢复的示例 , 因为物理卷的底层设备停机 , 并且 mirror_log_fault_policy 参数设置为 remove。这要求您手动重建镜像。

当镜像分支失败时 , LVM会将镜像卷转换为线性卷 , 它仍象以前运行 , 但没有镜像冗余。此时 , 您可以向系统添加新磁盘设备 , 以用作替换物理设备并重新构建镜像。

以下命令创建了用于镜像的物理卷。

# pvcreate /dev/sd[abcdefgh][12]
  Physical volume "/dev/sda1" successfully created
  Physical volume "/dev/sda2" successfully created
  Physical volume "/dev/sdb1" successfully created
  Physical volume "/dev/sdb2" successfully created
  Physical volume "/dev/sdc1" successfully created
  Physical volume "/dev/sdc2" successfully created
  Physical volume "/dev/sdd1" successfully created
  Physical volume "/dev/sdd2" successfully created
  Physical volume "/dev/sde1" successfully created
  Physical volume "/dev/sde2" successfully created
  Physical volume "/dev/sdf1" successfully created
  Physical volume "/dev/sdf2" successfully created
  Physical volume "/dev/sdg1" successfully created
  Physical volume "/dev/sdg2" successfully created
  Physical volume "/dev/sdh1" successfully created
  Physical volume "/dev/sdh2" successfully created

以下命令创建了卷组 vg 和已镜像的 groupfs。

# vgcreate vg /dev/sd[abcdefgh][12]
  Volume group "vg" successfully created
# lvcreate -L 750M -n groupfs -m 1 vg /dev/sda1 /dev/sdb1 /dev/sdc1
  Rounding up size to full physical extent 752.00 MB
  Logical volume "groupfs" created

您可以使用lvs命令来验证镜像卷的布局以及镜像分支和镜像日志的底层设备。请注意 , 在第一个示例中 , 镜像尚未完全同步;您应该等 , 直到 Copy% 字段显示为 100.00 后再继续。

# lvs -a -o +devices
  LV                 VG   Attr   LSize   Origin Snap%  Move Log          Copy% Devices
  groupfs            vg   mwi-a- 752.00M                    groupfs_mlog 21.28 groupfs_mimage_0(0),groupfs_mimage_1(0)
  [groupfs_mimage_0] vg   iwi-ao 752.00M                                       /dev/sda1(0)
  [groupfs_mimage_1] vg   iwi-ao 752.00M                                       /dev/sdb1(0)
  [groupfs_mlog]     vg   lwi-ao   4.00M                                       /dev/sdc1(0)

# lvs -a -o +devices
  LV                 VG   Attr   LSize   Origin Snap%  Move Log          Copy%  Devices
  groupfs            vg   mwi-a- 752.00M                    groupfs_mlog 100.00 groupfs_mimage_0(0),groupfs_mimage_1(0)
  [groupfs_mimage_0] vg   iwi-ao 752.00M                                        /dev/sda1(0)
  [groupfs_mimage_1] vg   iwi-ao 752.00M                                        /dev/sdb1(0)
  [groupfs_mlog]     vg   lwi-ao   4.00M     i                                  /dev/sdc1(0)

在这个示例中 , 镜像 /dev/sda1 的主分支会失败。任何对镜像卷的写操作会导致 LVM 检测到失败的镜像。当发生这种情况时 , LVM 将镜像转换为单一线性卷。在这种情况下 , 要触发转换 , 我们执行 dd 命令

# dd if=/dev/zero of=/dev/vg/groupfs count=10
10+0 records in
10+0 records out

您可以使用 lvs 命令验证设备现在是否为线性设备。由于磁盘失败 , 所以会出现 I/O 错误。

# lvs -a -o +devices
  /dev/sda1: read failed after 0 of 2048 at 0: Input/output error
  LV      VG   Attr   LSize   Origin Snap%  Move Log Copy%  Devices
  groupfs vg   -wi-a- 752.00M                               /dev/sdb1(0)

此时 , 您仍然能够使用逻辑卷 , 但没有镜像冗余功能。

要重建镜像的卷 , 替换有问题的驱动器并重新创建物理卷。如果您使用相同的磁盘而不是用新磁盘替换它 , 则运行 pvcreate 命令时您会看到"不一致性"警告。您可以通过执行 vgreduce --removemissing 命令来防止显示该警告。

# pvcreate /dev/sdi[12]
  Physical volume "/dev/sdi1" successfully created
  Physical volume "/dev/sdi2" successfully created

# pvscan
  PV /dev/sdb1   VG vg   lvm2 [67.83 GB / 67.10 GB free]
  PV /dev/sdb2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdc1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdc2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdd1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdd2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sde1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sde2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdf1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdf2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdg1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdg2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdh1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdh2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdi1           lvm2 [603.94 GB]
  PV /dev/sdi2           lvm2 [603.94 GB]
  Total: 16 [2.11 TB] / in use: 14 [949.65 GB] / in no VG: 2 [1.18 TB]

然后使用新物理卷扩展原始卷组。

# vgextend vg /dev/sdi[12]
  Volume group "vg" successfully extended

# pvscan
  PV /dev/sdb1   VG vg   lvm2 [67.83 GB / 67.10 GB free]
  PV /dev/sdb2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdc1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdc2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdd1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdd2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sde1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sde2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdf1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdf2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdg1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdg2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdh1   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdh2   VG vg   lvm2 [67.83 GB / 67.83 GB free]
  PV /dev/sdi1   VG vg   lvm2 [603.93 GB / 603.93 GB free]
  PV /dev/sdi2   VG vg   lvm2 [603.93 GB / 603.93 GB free]
  Total: 16 [2.11 TB] / in use: 16 [2.11 TB] / in no VG: 0 [0   ]

将线性卷重新转换为其原始镜像状态。

# lvconvert -m 1 /dev/vg/groupfs /dev/sdi1 /dev/sdb1 /dev/sdc1
  Logical volume mirror converted.

您可以使用 lvs 命令验证镜像是否已恢复。

# lvs -a -o +devices
  LV                 VG   Attr   LSize   Origin Snap%  Move Log          Copy% Devices
  groupfs            vg   mwi-a- 752.00M                    groupfs_mlog 68.62 groupfs_mimage_0(0),groupfs_mimage_1(0)
  [groupfs_mimage_0] vg   iwi-ao 752.00M                                       /dev/sdb1(0)
  [groupfs_mimage_1] vg   iwi-ao 752.00M                                       /dev/sdi1(0)
  [groupfs_mlog]     vg   lwi-ao   4.00M    

6.3 恢复物理卷元数据

如果物理卷的卷组元数据区域意外覆盖或被破坏 , 您将收到一条错误消息 , 表明元数据区域不正确 , 或者系统无法找到带有特定UUID的物理卷。您可以通过在物理卷中编写新元数据区域来从物理卷中恢复数据 , 并指定与丢失的元数据相同的UUID。

注 : 您不应该尝试使用可以正常工作的LVM逻辑卷执行这个步骤。如果您指定了不正确的UUID ,将会丢失您的数据。

以下示例显示了您可能看到元数据区域是否缺失或损坏的输出类型。

# lvs -a -o +devices
  Couldn't find device with uuid 'FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk'.
  Couldn't find all physical volumes for volume group VG.
  Couldn't find device with uuid 'FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk'.
  Couldn't find all physical volumes for volume group VG.
  ...

您可以通过在 /etc/lvm/archive 目录中找到所覆盖的物理卷的UUID。文件VolumeGroupName_xxxx.vg该卷组的最后一个已知有效的归档LVM元数据。

或者 , 您可能会发现取消激活卷并设置partial (-P)参数将使您能够找到丢失的损坏物理卷的UUID。

# vgchange -an --partial
  Partial mode. Incomplete volume groups will be activated read-only.
  Couldn't find device with uuid 'FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk'.
  Couldn't find device with uuid 'FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk'.
  ...

使用 pvcreate 命令的 --uuid 和 --restorefile 参数恢复物理卷。以下示例将 /dev/sdh1 设备标记为上面所示的 UUID 的物理卷 , FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk。此命令将从文件 VG_00050.vg 中恢复物理卷标所含的元数据信息, 该文件为卷组存储的最新的归档 元数据信息。restorefile 参数指示 pvcreate 命令使新物理卷与卷组中的旧物理卷兼容 , 确保新的元数据不会被放置在旧物理卷包含数据的位置 ( 这是可能发生的 , 例如 , 如果原始pvcreate命令使用了控制元数据放置的命令行参数 , 或者物理卷最初是使用不同默认值的不同版本的软件创建的 ) 。pvcreate 命令只覆盖 LVM 元数据区域 , 不会影响现有的数据区域。

# pvcreate --uuid "FmGRh3-zhok-iVI8-7qTD-S5BI-MAEN-NYM5Sk" --restorefile /etc/lvm/archive/VG_00050.vg /dev/sdh1
  Physical volume "/dev/sdh1" successfully created

然后 , 您可以使用 vgcfgrestore 命令恢复卷组的元数据。

# vgcfgrestore VG
  Restored volume group VG

现在您可以显示逻辑卷。

# lvs -a -o +devices
  LV     VG   Attr   LSize   Origin Snap%  Move Log Copy%  Devices
  stripe VG   -wi--- 300.00G                               /dev/sdh1 (0),/dev/sda1(0)
  stripe VG   -wi--- 300.00G                               /dev/sdh1 (34728),/dev/sdb1(0)

以下命令激活卷并显示活跃卷。

# lvchange -ay /dev/VG/stripe
# lvs -a -o +devices
  LV     VG   Attr   LSize   Origin Snap%  Move Log Copy%  Devices
  stripe VG   -wi-a- 300.00G                               /dev/sdh1 (0),/dev/sda1(0)
  stripe VG   -wi-a- 300.00G                               /dev/sdh1 (34728),/dev/sdb1(0)

如果磁盘中的 LVM 元数据尽可能多地消耗超过它的空间 , 这个命令就可以恢复物理卷。如果覆盖元数据的数据超过了元数据区域 , 则该卷中的数据可能会受到影响。您可能能够使用 fsck 命令恢复这些数据。

6.4 替换物理卷

如果物理卷失败或者需要替换 , 您可以标记一个新的物理卷来替换现有卷组中丢失的步骤 , 与恢复物理卷元数据的步骤相同 , 您可以使用 vgdisplay 命令的 --partial 和 --verbose 参数显示任何已不存在的物理卷的 UUID 和大小。如果要替换相同大小的另一个物理卷 , 您可以将 pvcreate 命令与 --restorefile 和 --uuid 参数一起使用 , 以使用与缺失的物理卷相同的 UUID 初始化新设备。然后 , 您可以使用 vgcfgrestore 命令恢复卷组的元数据。

6.5 从卷组中删除丢失的物理卷

如果丢失了物理卷 , 您可以使用 vgchange 命令的 --partial 参数激活卷组中剩余的物理卷。您可以使用 vgreduce 命令的 --removemissing 参数删除卷组中使用该物理卷的所有逻辑卷。

您应该使用 --test 参数运行 vgreduce 命令 , 以验证您要销毁的内容。

与大多数 LVM 操作一样 , 如果您立即使用 vgcfgrestore 命令将卷组元数据恢复到之前的状态 , 则 vgreduce 命令会变得可逆向。例如 , 如果您在没有 --test 参数的情况下使用了 vgreduce 命令的 --removemissing 参数 , 并找到您删除了您希望保留的逻辑卷 , 那么您仍可以替换物理卷并使用另一个 vgcfgrestore 命令将卷组返回到之前的状态。

7. 遇到问题

  1. 设置集群之后 , lvm取消集群之后有报警Skipping clustered volume group。需要在配置文件/etc/lvm/lvm.conf关闭lock,locking_type = 0

  2. 缩容时一定要先检查文件系统 , 之后在减少文件系统大小


参考链接: 维基百科 : LVM (简体中文) 博客园 : 第6章 LVM详解

逻辑卷管理器管理 Red Hat Enterprise Linux 7 | Red Hat Customer Portal


熊熊