Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

4.4. 逻辑卷管理

这部分描述了执行逻辑卷管理的各个方面的命令。

4.4.1. 创建线性逻辑卷

要创建逻辑卷,请使用 lvcreate 命令。如果没有为逻辑卷指定名称,则使用默认名称 lvol#,其中 # 是逻辑卷的内部号。
当您创建逻辑卷时,其是从使用组成卷组的物理卷上的空闲扩展从卷组中切割而成的。通常,逻辑卷会在下一次空闲的基础上用尽底层物理卷上任何可用的空间。修改逻辑卷在物理卷中空闲和重新分配的空间。
下面的命令在卷组 vg1 中创建了一个大小为 10GB 的逻辑卷。
# lvcreate -L 10G vg1
逻辑卷大小的默认单位为 MB。以下命令在卷组 testvg 中创建了一个名为 testlv 的 1500MB 线性逻辑卷,创建块设备 /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
如果需要删除物理卷,用于创建逻辑卷的底层物理卷非常重要,因此当创建逻辑卷时可能需要考虑这一点。有关从卷组中删除物理卷的详情,请参考 第 4.3.7 节 “从卷组中删除物理卷”
要创建要从卷组中的特定物理卷分配的逻辑卷,请在 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
下面的例子在物理卷 /dev/sda1 的扩展 0 到 25 个扩展创建了一个线性逻辑卷,然后在扩展 100 时继续布局逻辑卷。
# lvcreate -l 100 -n testlv testvg /dev/sda1:0-25:100-
逻辑卷扩展是如何分配的默认策略是 继承的,其对卷组应用同样的策略。这些策略可以使用 lvchange 命令更改。有关分配策略的详情,请参考 第 4.3.1 节 “创建卷组”

4.4.2. 创建条带卷

对于大量顺序读和写,创建条带逻辑卷可提高数据 I/O 的效率。有关条带卷的通用信息,请参考 第 2.3.2 节 “条带逻辑卷”
当您创建条带逻辑卷时,您可以使用 lvcreate 命令的 -i 参数指定条带的数量。这决定了逻辑卷将被条带的物理卷数量。条带的数量不能大于卷组中物理卷的数量(除非使用了 --alloc anywhere 参数)。
如果组成条带逻辑卷的底层物理设备具有不同的大小,则条带卷的最大大小由最小的底层设备决定。例如,在双 leg 的条带中,最大大小为较小设备大小的两倍。在三 leg 条带中,最大大小为最小设备大小的三倍。
下面的命令创建了一个跨 2 个物理卷、条带为 64KB 的条带逻辑卷。逻辑卷大小为 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

4.4.3. RAID 逻辑卷

LVM 支持 RAID0/1/4/5/6/10。
注意
RAID 逻辑卷不是集群感知的。虽然可以在一台机器上单独创建和激活 RAID 逻辑卷,但不能在多个机器上同时激活它们。如果需要非独占镜像卷,您必须创建带有 镜像 片段类型的卷,如 第 4.4.4 节 “创建镜像卷” 所述。
要创建 RAID 逻辑卷,请将 raid 类型指定为 lvcreate 命令的 --type 参数。表 4.1 “RAID 段类型” 描述了可能的 RAID 段类型。

表 4.1. RAID 段类型

片段类型描述
raid1 RAID1 镜像。当您指定 -m 但没有指定条带时,这是 lvcreate 命令的 --type 参数的默认值。
raid4 RAID4 专用奇偶校验磁盘
raid5raid5_ls相同
raid5_la
RAID5 左非对称。
轮转奇偶校验 0 并分配数据
raid5_ra
RAID5 右非对称。
轮转奇偶校验 N 并分配数据
raid5_ls
RAID5 左对称。
使用数据重启来轮换奇偶校验 0
raid5_rs
RAID5 右对称。
使用数据重启轮转奇偶校验 N
raid6raid6_zr相同
raid6_zr
RAID6 零重启
数据重启时的旋转奇偶校验零(从左到右)
raid6_nr
RAID6 N 重启
数据重启时的旋转奇偶校验 N(从左到右)
raid6_nc
RAID6 N 继续
数据持续时的轮转奇偶校验 N(从左到右)
raid10
条带镜像。如果您指定了 -m 并指定大于 1 的条带数,则这是 lvcreate 命令的 --type 参数的默认值。
镜像集合的条带
raid0/raid0_meta (Red Hat Enterprise Linux 7.3 及更高版本) 条带。RAID0 以条带大小的单位在多个数据子卷间分布逻辑卷数据。这可以提高性能。如果任何数据子卷失败,逻辑卷数据将会丢失。有关创建 RAID0 卷的详情,请参考 第 4.4.3.1 节 “创建 RAID0 卷(Red Hat Enterprise Linux 7.3 及更新版本)”
对于大多数用户,指定五个可用主类型之一(raid1、raid4、raid 5raid6raid10)应该足够了。
当您创建 RAID 逻辑卷时,LVM 会创建一个元数据子卷,它是阵列中的每个数据或奇偶校验子卷的大小的一个区块。例如,创建一个双向 RAID1 阵列会导致两个元数据子卷(lv_rmeta_0lv_rmeta_1)以及两个数据子卷(lv_rimage_0lv_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 逻辑卷时,使用 sync 操作初始化逻辑卷所需的后台 I/O 可能会分离对 LVM 设备的其他 I/O 操作,比如对卷组元数据的更新,特别是在创建很多 RAID 逻辑卷时。这会导致其它 LVM 操作速度下降。
您可以通过实施恢复节流来控制 RAID 逻辑卷初始化的速率。您可以使用 lvcreate 命令的 --minrecoveryrate--maxrecoveryrate 选项设置这些操作的最小和最大 I/O 速率来控制执行 sync 操作的速率。如下所示指定这些选项。
  • --maxrecoveryrate Rate[bBsSkKmMgG]
    为 RAID 逻辑卷设置最大恢复率,使其不会阻断其他小的 I/O 操作。Rate 被指定为阵列中每个设备的每秒数量。如果没有给出后缀,则会假定为 kiB/sec/device。将恢复率设置为 0 表示它将不被绑定。
  • --minrecoveryrate Rate[bBsSkKmMgG]
    为 RAID 逻辑卷设置最小恢复率,以确保 sync 操作的 I/O 达到最小吞吐量,即使存在大量 I/O。Rate 被指定为阵列中每个设备的每秒数量。如果没有给出后缀,则会假定为 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
您还可以为 RAID 清理操作指定最小和最大恢复率。有关 RAID 清理的详情,请参考 第 4.4.3.11 节 “清理 RAID 逻辑卷”
注意
您可以使用 LVM RAID 计算器应用程序生成在 RAID 存储上创建逻辑卷的命令。此应用程序使用您输入的有关当前或计划生成这些命令的存储的信息。LVM RAID 计算器应用程序可在 https://access.redhat.com/labs/lvmraidcalculator/ 中找到。
以下小节描述了您可以对 LVM RAID 设备执行的管理任务:

4.4.3.1. 创建 RAID0 卷(Red Hat Enterprise Linux 7.3 及更新版本)

创建 RAID0 卷的命令格式如下。
lvcreate --type raid0[_meta] --stripes Stripes --stripesize StripeSize VolumeGroup [PhysicalVolumePath ...]

表 4.2. 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 选项指定的设备数,每个条带一个。

4.4.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 将失败。

4.4.3.3. 将 LVM RAID1 逻辑卷转换为 LVM 线性逻辑卷

您可以通过指定 -m0 参数,使用 lvconvert 命令将现有的 RAID1 LVM 逻辑卷转换为 LVM 线性逻辑卷。这会删除所有 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)

4.4.3.4. 将镜像的 LVM 设备转换为 RAID1 设备

您可以通过指定 --type raid1 参数,使用 lvconvert 命令将片段类型为 mirror 的现有 LVM 设备转换为 RAID1 LVM 设备。这会将镜像子卷(*_mimagezFCP)重命名为 RAID 子卷(*_rimageuildDefaults)。另外,镜像日志会被移除,并在与对应数据子卷相同的物理卷上为数据子卷创建元数据子卷(*_rmetauildDefaults)。
以下示例显示了镜像逻辑卷 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)

4.4.3.5. 重新调整 RAID 逻辑卷的大小

您可以使用以下方法重新定义 RAID 逻辑卷大小:
  • 您可以使用 lvresizelvextend 命令增加任何类型 RAID 逻辑卷的大小。这不会改变 RAID 镜像的数量。对于条带的 RAID 逻辑卷,创建条带 RAID 逻辑卷时可使用同样的条带舍入约束。有关扩展 RAID 卷的详情,请参考 第 4.4.18 节 “扩展 RAID 卷”
  • 您可以使用 lvresizelvreduce 命令减少任何类型的 RAID 逻辑卷的大小。这不会改变 RAID 镜像的数量。与 lvextend 命令一样,当创建条带 RAID 逻辑卷时,应用同样的条带舍入约束。有关减小逻辑卷大小的命令的示例,请参考 第 4.4.16 节 “缩小逻辑卷”
  • 从 Red Hat Enterprise Linux 7.4 开始,您可以使用 lvconvert 命令的 --stripes N 参数更改条状 RAID 逻辑卷(raid4/5/6/10)上的条带数。这会通过添加或删除条带的容量来增加或减少 RAID 逻辑卷的大小。请注意,raid10 卷只能添加条带。这个功能是 RAID 重塑 功能的一部分,它允许您在保持同样的 RAID 级别的情况下更改 RAID 逻辑卷的属性。有关 RAID 重塑和使用 lvconvert 命令重塑 RAID 逻辑卷的示例,请参考 lvmraid(7)手册页。

4.4.3.6. 更改现有 RAID1 设备中的镜像数

您可以更改现有 RAID1 阵列中的镜像数量,就如同在早期的 LVM 镜像部署中更改镜像数量。使用 lvconvert 命令指定要添加或删除的额外元数据/数据子卷对数。有关在早期 LVM 镜像实现中更改卷配置的详情,请参考 第 4.4.4.4 节 “更改镜像卷配置”
当您使用 lvconvert 命令向 RAID1 设备添加镜像时,您可以指定生成的设备的镜像总数,或者您可以指定要添加到该设备中的镜像数量。您还可以有选择地指定新元数据/数据镜像对所在的物理卷。
元数据子卷(名为 *_rmetafhir)始终存在于与它们的数据子卷 *_rimageuildDefaults 相同的物理设备上。元数据/数据子卷对不会与 RAID 阵列中另一元数据/数据子卷对创建在同一物理卷上(除非您指定了 --alloc anywhere)。
在 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_1lv_rimage_1 组成的三向 RAID1 阵列中删除 lv_rimage_ 1,则会产生一个由 lv_rimage_ 0lv_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)

4.4.3.7. 将 RAID 镜像分割为单独的逻辑卷

您可以分离 RAID 逻辑卷的镜像形成新的逻辑卷。分离 RAID 镜像的过程与分离镜像逻辑卷的冗余镜像的过程相同,如 第 4.4.4.2 节 “分离镜像逻辑卷的冗余镜像” 中所述。
分离 RAID 镜像的命令格式如下:
lvconvert --splitmirrors count -n splitname vg/lv [removable_PVs]
和您从现有 RAID1 逻辑卷中删除 RAID 镜像一样(如 第 4.4.3.6 节 “更改现有 RAID1 设备中的镜像数”中所述),当您从设备的中间删除 RAID 数据子卷(及其关联的元数据子卷)时,任何编号较高的镜像将向下移动以填充这个插槽。因此,构成 RAID 阵列的逻辑卷上的索引号将是一个完整的整数序列。
注意
如果 RAID1 阵列还没有同步,您就无法分离 RAID 镜像。
以下示例将双向 RAID1 逻辑卷 my_lv 分成两个线性逻辑卷 my_lvnew
# 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)

4.4.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_rimage_1

4.4.3.9. 设置 RAID 失败策略

LVM RAID 根据 lvm.conf 文件中raid_fault_policy 字段定义的首选项以自动方式处理设备故障。
  • 如果将 raid_fault_policy 字段设为 allocate,系统将尝试使用卷组中的备用设备替换失败的设备。如果没有可用的备用设备,则会向系统日志报告。
  • 如果将 raid_fault_policy 字段设为 warn,系统将产生一个警告,日志将表示有一个设备失败。这使得用户能够决定采取什么行动。
只要有足够的设备支持可用性,RAID 逻辑卷将继续操作。
4.4.3.9.1. 分配 RAID 失败策略
在以下示例中,在lvm.conf 文件中,raid_fault_policy 字段已被设为 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
如果 raid_fault_policy 已被设为 allocate,但没有备用设备,则分配将失败,逻辑卷保留原样。如果分配失败,您可以选择修复驱动器,然后停用并激活逻辑卷 ; 这在 第 4.4.3.9.2 节 “警告 RAID 失败策略” 中进行了描述。另外,您可以替换失败的设备,如 第 4.4.3.10 节 “替换 RAID 设备” 中所述。
4.4.3.9.2. 警告 RAID 失败策略
在以下示例中,lvm.conf 文件中的raid_fault_policy 字段已被设为 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
如果设备失败是一个临时故障,或者您可以修复失败的设备,您可以使用 lvchange 命令的 --refresh 选项启动故障设备的恢复。之前,需要停用并激活逻辑卷。
以下命令刷新逻辑卷。
# lvchange --refresh my_vg/my_lv

4.4.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_0lv_rimage_1 不应位于同一物理卷上。

4.4.3.11. 清理 RAID 逻辑卷

LVM 提供对 RAID 逻辑卷的清理支持。RAID 清理是读取阵列中的所有数据和奇偶校验块的过程,并检查它们是否是分配的。
您可以使用 lvchange 命令的 --syncaction 选项启动 RAID 清理操作。您可以指定 checkrepair 操作。check 操作会接管阵列,并记录阵列中的差异数,但不会修复它们。repair 操作会更正发现的差异。
清理 RAID 逻辑卷的命令格式如下:
lvchange --syncaction {check|repair} vg/raid_lv
注意
lvchange --syncaction repair vg/raid_lv 操作不执行与 lvconvert --repair vg/raid_lv 操作相同的功能。lvchange --syncaction repair 操作会在阵列中启动后台同步操作,而 lvconvert --repair 操作旨在修复/替换镜像或 RAID 逻辑卷中失败的设备。
支持新的 RAID 清理操作,lvs 命令现在支持两个新的可打印字段: raid_sync_actionraid_mismatch_count。默认情况下不打印这些字段。要显示您使用 lvs-o 参数指定的这些字段,如下所示:
lvs -o +raid_sync_action,raid_mismatch_count vg/lv
raid_sync_action 字段显示当前 raid 卷执行的同步操作。可以是以下值之一:
  • idle: 所有同步操作都完成(什么都不做)
  • resync :初始化阵列或在机器失败后恢复
  • 恢复 :替换阵列中的设备
  • 检查 :查找阵列不一致
  • repair :查找并修复不一致
raid_mismatch_count 字段显示 check 操作过程中发现的差异数。
lvs 命令的 Cpy%Sync 字段现在打印任何 raid_sync_action 操作的进度,包括 checkrepair
lvs 命令的输出的 lv_attr 字段现在提供额外的指示器,支持 RAID 清理操作。这个字段中的第 9 位显示逻辑卷的健康状况,它现在支持以下指示器。
  • (m)不匹配表示 RAID 逻辑卷中存在差异。这个字符在清理操作侦测到部分 RAID 不一致时就会显示。
  • (r)刷新表示 RAID 阵列中的设备存在故障,且内核将其视为失败,即使 LVM 可以读取该设备标签,并认为该设备正常。应(r)刷新逻辑卷来通知内核设备现在可用,或者如果怀疑设备有故障,应(r)替换它。
有关 lvs 命令的信息,请参考 第 4.8.2 节 “对象显示字段”
当您执行 RAID 清理操作时,同步操作所需的后台 I/O 可以对 LVM 设备分离其他 I/O 操作,如卷组元数据更新。这会导致其它 LVM 操作速度下降。您可以通过实施恢复节流来控制清理 RAID 逻辑卷的速度。
您可以使用 lvchange 命令的 --minrecoveryrate--maxrecoveryrate 选项设置这些操作的最小和最大 I/O 速率来控制执行 sync 操作的速率。如下所示指定这些选项。
  • --maxrecoveryrate Rate[bBsSkKmMgG]
    为 RAID 逻辑卷设置最大恢复率,使其不会阻断其他小的 I/O 操作。Rate 被指定为阵列中每个设备的每秒数量。如果没有给出后缀,则会假定为 kiB/sec/device。将恢复率设置为 0 表示它将不被绑定。
  • --minrecoveryrate Rate[bBsSkKmMgG]
    为 RAID 逻辑卷设置最小恢复率,以确保 sync 操作的 I/O 达到最小吞吐量,即使存在大量 I/O。Rate 被指定为阵列中每个设备的每秒数量。如果没有给出后缀,则会假定为 kiB/sec/device。

4.4.3.12. RAID 接管(Red Hat Enterprise Linux 7.4 及更新的版本)

LVM 支持 Raid 接管,这意味着将 RAID 逻辑卷从一个 RAID 级别转换成另一个 RAID 级别(比如从 RAID 5 到 RAID 6)。更改 RAID 级别通常是为了增加或降低对设备故障的恢复能力或重新条带化逻辑卷。您可以对 RAID 接管使用 lvconvert 。有关 RAID 接管的信息,以及使用 lvconvert 转换 RAID 逻辑卷的示例,请参阅 lvmraid(7)手册页。

4.4.3.13. 重塑 RAID 逻辑卷(Red Hat Enterprise Linux 7.4 及更新版本)

RAID 重塑 意味着更改 RAID 逻辑卷的属性,而同时保持相同的 RAID 级别。您可以修改的一些属性包括 RAID 布局、条带大小和条带数目。有关 RAID 重塑和使用 lvconvert 命令重塑 RAID 逻辑卷的示例,请参考 lvmraid(7)手册页。

4.4.3.14. 对 RAID1 逻辑卷控制 I/O 操作

您可以使用 lvchange 命令的 --writemostly--writebehind 参数控制 RAID1 逻辑卷中设备的 I/O 操作。使用这些参数的格式如下。
  • --[raid]writemostly PhysicalVolume[:{t|y|n}]
    将 RAID1 逻辑卷中的设备标记为 write-mostly。除非需要,避免对这些驱动器的所有读取。设置此参数会使驱动器中的 I/O 操作数量保持最小。默认情况下,对于逻辑卷中指定的物理卷, write-mostly 属性被设为 yes。通过将 :n 附加到物理卷或者通过指定 :t 来切换值,可以删除 write-mostly 标志。在单个命令中可以多次指定 --writemostly 参数,从而可以一次为逻辑卷中的所有物理卷切换 write-mostly 属性。
  • --[raid]writebehind IOCount
    指定允许对标记为 write-mostly 的 RAID1 逻辑卷中设备的突出写的最大数。超过这个值后,写入就变为同步行为,在阵列指示写操作完成前,所有的写操作都需要已完成。将值设为零可清除首选项,并允许系统任意选择数值。

4.4.3.15. 更改 RAID 逻辑卷上的区域大小(Red Hat Enterprise Linux 7.4 及更新版本)

当您创建 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.

4.4.4. 创建镜像卷

对于 Red Hat Enterprise Linux 7.0 版本,LVM 支持 RAID 1/4/5/6/10,如 第 4.4.3 节 “RAID 逻辑卷” 中所述。RAID 逻辑卷不是集群感知的。虽然可以在一台机器上单独创建和激活 RAID 逻辑卷,但不能在多个机器上同时激活它们。如果需要非独占镜像卷,您必须创建带有 mirror 段类型的卷,如本节所述。
注意
有关将片段类型为 mirror 的现有 LVM 设备转换为 RAID1 LVM 设备的详情,请参考 第 4.4.3.4 节 “将镜像的 LVM 设备转换为 RAID1 设备”
注意
在集群中创建镜像 LVM 逻辑卷需要与在单个节点上创建片段类型为 mirror 的镜像 LVM 逻辑卷的命令和流程相同。但是,为了在集群中创建镜像 LVM 卷,集群和集群镜像基础架构必须正在运行,集群必须是 quorate,且 lvm.conf 文件中的锁定类型必须正确设置以启用集群锁定。有关在集群中创建镜像卷的示例,请参阅 第 5.5 节 “在集群中创建镜像 LVM 逻辑卷”
尝试从集群中的多个节点连续运行多个 LVM 镜像创建和转换命令,快速成功转换可能会导致这些命令的积压。这可能会导致一些请求的操作超时,因此会失败。为了避免这个问题,建议从集群的一个节点执行集群镜像创建命令。
当您创建镜像卷时,您可以使用 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 core 参数指定此日志保存在内存中。这消除了需要额外的日志设备,但它要求每次重启时重新同步整个镜像。
以下命令从卷组 bigvg 中创建镜像逻辑卷。逻辑卷名为 ondiskmirvol,只有一个镜像。卷大小为 12MB,将镜像日志保留在内存中。
# lvcreate --type mirror -L 12MB -m 1 --mirrorlog core -n ondiskmirvol bigvg
  Logical volume "ondiskmirvol" created
镜像日志创建在与创建任何镜像 leg 所在设备不同的设备上。但是,可以使用 vgcreate 命令的 --alloc anywhere 参数在与镜像 leg 相同的设备上创建镜像日志。这可能会降低性能,但允许您创建镜像,即使您只有两个底层设备。
以下命令创建一个具有单个镜像的镜像逻辑卷,镜像日志与任一镜像 leg 在同一设备上。在这个示例中,卷组 vg0 只包含两个设备。该命令在 vg0 卷组中创建一个名为 mirrorlv 的 500 MB 卷。
# lvcreate --type mirror -L 500M -m 1 -n mirrorlv -alloc anywhere vg0
注意
有了集群镜像,镜像日志管理完全由当前具有最低集群 ID 的集群节点来负责。因此,当保存集群镜像日志的设备在集群子集中不可用时,集群镜像可以继续操作,而不受任何影响,只要具有最低 ID 的集群节点保留对镜像日志的访问。由于镜像未受到干扰,因此不会发出任何自动纠正操作(修复)。当最低 ID 的集群节点失去对镜像日志的访问时,自动操作将启动(不管是否可从其他节点访问日志)。
要创建自我镜像的镜像日志,您可以指定 --mirrorlog 镜像 参数。以下命令从卷组 bigvg 中创建镜像逻辑卷。逻辑卷名为 twologvol,它只有一个镜像。卷大小为 12MB,镜像日志是镜像的,每个日志保存在不同的设备上。
# lvcreate --type mirror -L 12MB -m 1 --mirrorlog mirrored -n twologvol bigvg
  Logical volume "twologvol" created
与标准镜像日志一样,可以使用 vgcreate 命令的 --alloc anywhere 参数在与镜像 leg 相同的设备上创建冗余镜像日志。这可能会降低性能,但是它允许您创建冗余镜像日志,即使您没有足够的底层设备来使每个日志保留在与镜像 leg 不同的设备上。
创建镜像后,镜像区域会同步。对于大型镜像组件,同步过程可能需要很长时间。当您创建一个不需要恢复的新镜像时,您可以指定 --nosync 参数来指示不需要从第一个设备进行初始同步。
您可以指定哪个设备用于镜像 leg 和日志,以及要使用设备的哪个扩展。要强制日志在特定的磁盘上,请在要放置它的磁盘上精确指定一个扩展。LVM 不需要遵守设备在命令行上列出的顺序。如果列出了任何物理卷,则其是要分配的唯一空间。列表中包含的任何已分配的物理区块都将被忽略。
下面的命令创建了一个具有单个镜像的镜像逻辑卷,以及没有镜像的单个日志。卷大小为 500 MB,名为 mirrorlv,它被从卷组 vg0 中分离出来。镜像的第一个 leg 位于设备 /dev/sda1 上,镜像的第二个 leg 位于设备 /dev/sdb1 上,镜像日志位于 /dev/sdc1 上。
# lvcreate --type mirror -L 500M -m 1 -n mirrorlv vg0 /dev/sda1 /dev/sdb1 /dev/sdc1
以下命令创建一个具有单个镜像的镜像逻辑卷。卷大小为 500 MB,名为 mirrorlv,它被从卷组 vg0 中分离出来。镜像的第一个 leg 位于设备 /dev/sda1 的第 0 个扩展上,镜像的第二个 leg 位于设备 /dev/sdb1 的扩展 0 到 499 上,镜像日志从设备 /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)会导致构成镜像设备的设备被条带化。

4.4.4.1. 镜像逻辑卷失败策略

您可以使用 lvm.conf 文件的 activation 部分中的 mirror_image_fault_policymirror_log_fault_policy 参数定义镜像逻辑卷在设备失败时的行为。当这些参数设为 remove 时,系统会尝试删除有问题的设备,并在没有它的情况下运行。当这些参数设为 allocate 时,系统会尝试删除有问题的设备,并尝试在新设备上分配空间以替换失败的设备。如果没有为替换分配适当的设备和空间,则此策略的行为与 remove 策略类似。
默认情况下,mirror_log_fault_policy 参数设置为 allocate。对日志使用此策略很快,并保持通过崩溃和重启同步状态的能力。如果将此策略设置为 remove,当日志设备无法将镜像转换为使用内存中日志时;在这个实例中,镜像不会记住崩溃和重启时的同步状态,并且整个镜像将被重新同步。
默认情况下,mirror_image_fault_policy 参数被设为 remove。有了这个策略,如果镜像失败,如果只有一个保留了好的副本,则镜像将转换为非镜像设备。将这个策略设置为 allocate 镜像需要镜像重新同步设备 ; 这是一个较慢的过程,但它会保留该设备的镜像特性。
注意
当 LVM 镜像出现设备故障时,会进行两阶段的恢复。第一个阶段涉及删除故障设备。这可能导致镜像缩小成一个线性设备。第二个阶段,如果 mirror_log_fault_policy 参数设置为 allocate,则尝试替换任何失败设备。但请注意,如果其他设备可用,则不能保证第二阶段会选择之前镜像使用的、不是故障的一部分的设备。
有关从 LVM 镜像故障中手动恢复的详情,请参考 第 6.2 节 “从 LVM 镜像故障中恢复”

4.4.4.2. 分离镜像逻辑卷的冗余镜像

您可以分离镜像逻辑卷的冗余镜像来形成一个新的逻辑卷。要分离镜像,请使用 lvconvert 命令的 --splitmirrors 参数,指定要分离的冗余镜像数量。您必须使用命令的 --name 参数新分离的逻辑卷指定名称。
下面的命令从镜像逻辑卷 vg/lv 中分离出一个名为 copy 的新逻辑卷。新逻辑卷包含两个镜像 leg。在这个示例中,LVM 选择要分离哪个设备。
# lvconvert --splitmirrors 2 --name copy vg/lv
您可以指定要分离哪个设备。下面的命令从镜像逻辑卷 vg/lv 中分离出一个名为 copy 的新逻辑卷。新逻辑卷包含两个镜像 leg,它由设备 /dev/sdc1/dev/sde1 组成。
# lvconvert --splitmirrors 2 --name copy vg/lv /dev/sd[ce]1

4.4.4.3. 修复镜像逻辑设备

您可以使用 lvconvert --repair 命令在磁盘失败后修复镜像。这会将镜像重新变回一致的状态。lvconvert --repair 命令是一个交互式命令,提示您指示是否希望系统尝试替换任何失败的设备。
  • 要跳过提示并替换所有故障设备,请在命令行上指定 -y 选项。
  • 要跳过提示并不替换任何故障设备,请在命令行上指定 -f 选项。
  • 要跳过提示并仍然指明镜像镜像和镜像日志的不同替换策略,您可以指定 --use-policies 参数,以使用由 lvm.conf 文件中的 mirror_log_fault_policymirror_device_fault_policy 参数指定的设备替换策略。

4.4.4.4. 更改镜像卷配置

您可以使用 lvconvert 命令增加或减少逻辑卷包含的镜像数。这允许您将逻辑卷从镜像卷转换为线性卷,或者从线性卷转换为镜像卷。您还可以使用这个命令重新配置现有逻辑卷的其他镜像参数,如 corelog
当您将线性卷转换为镜像卷时,您在为现有卷创建镜像 leg。这意味着您的卷组必须包含镜像 leg 和镜像日志的设备和空间。
如果您丢失了镜像的 leg,LVM 会将卷转换为线性卷,以便您仍可以访问卷,而无需镜像冗余。替换 leg 后,使用 lvconvert 命令恢复镜像。此过程在 第 6.2 节 “从 LVM 镜像故障中恢复” 中提供。
以下命令将线性逻辑卷 vg00/lvol1 转换为镜像逻辑卷。
# lvconvert -m1 vg00/lvol1
以下命令将镜像逻辑卷 vg00/lvol1 转换为线性逻辑卷,删除镜像 leg。
# lvconvert -m0 vg00/lvol1
以下示例将额外的镜像 leg 添加到现有逻辑卷 vg00/lvol1 中。本例演示了 lvconvert 命令将卷更改为具有两个镜像 leg 的卷之前和之后卷的配置。
# 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)

4.4.5. 创建精简配置的逻辑卷

逻辑卷可以使用精简模式置备。这可让您创建大于可用扩展的逻辑卷。使用精简配置,您可以管理一个空闲空间的存储池,称为精简池,可在应用程序需要时将其分配给任意数量的设备。然后,当应用程序实际写入逻辑卷时,您可以创建可绑定到精简池的设备以便以后分配。可在需要时动态扩展精简池,以便有效分配存储空间。
注意
本节提供了您用来创建和增长精简配置逻辑卷的基本命令的概述。有关 LVM 精简配置的详情,以及使用带精简置备逻辑卷的 LVM 命令和工具的详情,请参考 lvmthin(7)手册页。
注意
不支持集群中跨节点的精简卷。精简池及其所有精简卷必须只在一个集群节点中单独激活。
要创建精简卷,请执行以下任务:
  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 删除卷,您可以使用 lvslvdisplay 命令显示卷的信息。
默认情况下,lvcreate 命令根据公式(Pool_LV_size / Pool_LV_chunk_size * 64)设置精简池元数据逻辑卷的大小。如果您有大量快照,或者您的精简池有小的块,并且预计以后精简池的大小会显著增长,您可能需要使用 lvcreate 命令的 --poolmetadatasize 参数增加精简池的元数据卷的默认值。精简池元数据逻辑卷支持的值在 2MiB 到 16GiB 之间。
您可以使用 lvconvert 命令的 --thinpool 参数将现有逻辑卷转换为精简池卷。当您将现有逻辑卷转换为精简池卷时,您必须将 lvconvert--poolmetadata 参数与 --thinpool 参数一起使用,将现有逻辑卷转换为精简池卷的元数据卷。
注意
将逻辑卷转换成精简池卷或精简池元数据卷会破坏逻辑卷的内容,因为在这种情况下,lvconvert 不会保留设备的内容,而是覆盖其内容。
以下示例将卷组 vg001 中的现有逻辑卷 lv1 转换为精简池卷,并将卷组 vg001 中的现有逻辑卷 lv2 转换为那个精简池卷的元数据卷。
# lvconvert --thinpool vg001/lv1 --poolmetadata vg001/lv2
  Converted vg001/lv1 to thin pool.

4.4.6. 创建快照卷

注意
LVM 支持精简配置的快照。有关创建精简配置快照卷的详情,请参考 第 4.4.7 节 “创建精简配置的快照卷”
使用 lvcreate 命令的 -s 参数来创建快照卷。快照卷是可写的。
注意
不支持集群中跨节点的 LVM 快照。您不能在集群卷组中创建快照卷。但是,如果您需要在集群逻辑卷上创建一致的数据备份,您可以只激活该卷,然后创建快照。有关在一个节点上只激活逻辑卷的详情,请参考 第 4.7 节 “激活集群中单个节点上的逻辑卷”
注意
镜像逻辑卷支持 LVM 快照。
RAID 逻辑卷支持快照。有关创建 RAID 逻辑卷的详情,请参考 第 4.4.3 节 “RAID 逻辑卷”
LVM 不允许创建大于原始卷大小的快照卷,以及卷所需的元数据。如果您指定大于这个卷的快照卷,则系统会创建一个只根据原始卷大小所需的快照卷。
默认情况下,在正常激活命令中会跳过快照卷。有关控制快照卷的激活的详情,请参考 第 4.4.20 节 “控制逻辑卷激活”
以下命令创建一个大小为 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/lvol0lvs 命令的默认输出,其快照卷 /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_thresholdsnapshot_autoextend_percent 的信息。有关 lvm.conf 文件的详情,请参考 附录 B, LVM 配置文件

4.4.7. 创建精简配置的快照卷

Red Hat Enterprise Linux 支持精简配置的快照卷。有关精简快照卷的优点和限制的详情,请参考 第 2.3.6 节 “精简配置的快照卷”
注意
本节概述您用来创建和增加精简置备快照卷的基本命令。有关 LVM 精简配置的详情,以及使用带精简置备逻辑卷的 LVM 命令和工具的详情,请参考 lvmthin(7)手册页。
重要
在创建精简快照卷时,您不用指定卷的大小。如果指定了 size 参数,则创建的快照不会是一个精简快照卷,也不会使用精简池来存储数据。例如,命令 lvcreate -s vg/thinvolume -L10M 不会创建精简快照,即使原始卷是精简卷。
可为精简配置的原始卷创建精简快照,也可针对不是精简置备的原始卷创建精简快照。
您可以使用 lvcreate 命令的 --name 选项为快照卷指定名称。以下命令创建一个精简配置的逻辑卷 vg001/thinvolume 的精简配置的快照卷,名为 mysnapshot1
# lvcreate -s --name mysnapshot1 vg001/thinvolume
  Logical volume "mysnapshot1" created
# lvs
  LV          VG       Attr     LSize   Pool       Origin     Data%  Move Log Copy%  Convert
  mysnapshot1 vg001    Vwi-a-tz   1.00g mythinpool thinvolume   0.00
  mythinpool  vg001    twi-a-tz 100.00m                         0.00
  thinvolume  vg001    Vwi-a-tz   1.00g mythinpool              0.00
注意
在使用精简配置时,存储管理员务必要监控存储池,并在其被完全占用时添加更多容量。有关扩展精简卷大小的详情,请参考 第 4.4.5 节 “创建精简配置的逻辑卷”
精简快照卷具有与其它精简卷相同的特征。您可以独立激活卷、扩展卷、重新命名卷、删除卷、甚至快照卷。
默认情况下,在正常激活命令中会跳过快照卷。有关控制快照卷的激活的详情,请参考 第 4.4.20 节 “控制逻辑卷激活”
您还可以为非置备的逻辑卷创建精简配置的快照。因为非精简配置的逻辑卷不包含在精简池中,所以它被称为 外部原始卷。外部原始卷可以被很多精简置备的快照卷使用和共享,即使在不同的精简池中也是如此。在创建精简置备快照时,外部原始源必须不活跃且只读。
要为外部原始卷创建一个精简配置的快照,您必须指定 --thinpool 选项。以下命令创建一个只读不活跃卷 origin_volume 的精简快照卷。精简快照卷名为 mythinsnap。然后,逻辑卷 origin_volume 在卷组 vg001 中成为精简快照卷 mythinsnap 的精简外部来源,它将使用现有的精简池 vg001/pool。因为原始卷必须与快照卷位于同一个卷组中,所以您在指定原始逻辑卷时不需要指定卷组。
# lvcreate -s --thinpool vg001/pool origin_volume --name mythinsnap
您可以创建第一个快照卷的第二个精简置备快照卷,如下例所示。
# lvcreate -s vg001/mythinsnap --name my2ndthinsnap
从 Red Hat Enterprise Linux 7.2 开始,您可以通过指定 lvs 命令的 lv_ancestorslv_descendants 报告字段来显示精简快照逻辑卷的所有上级和后代的列表。
在以下示例中:
  • stack1 是卷组 vg001 中的原始卷。
  • stack2stack1的快照
  • stack3stack2的快照
  • stack4stack3的快照
另外:
  • stack5 也是 stack2的快照
  • stack6stack5的快照
$ 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_ancestorslv_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
从 Red Hat Enterprise Linux 7.3 开始,您可以将您的系统配置为跟踪和显示已删除的逻辑卷,您可以通过指定 lv_ancestors_fulllv_descendants_full 字段来显示包括这些卷的完整依赖关系链。有关跟踪、显示和删除历史逻辑卷的详情,请参考 第 4.4.21 节 “跟踪并显示历史逻辑卷(Red Hat Enterprise Linux 7.3 及更高版本)”

4.4.8. 创建 LVM 缓存逻辑卷

自 Red Hat Enterprise Linux 7.1 发行版本中,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)手册页。
  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. 另外,从 Red Hat Enterprise Linux 7.2 开始,您可以将缓存逻辑卷转换为精简池逻辑卷。请注意,任何从池中创建的精简逻辑卷都将共享缓存。
    以下命令使用快速设备 /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)
    
有关 LVM 缓存卷的详情,包括额外的管理示例,请参阅 lvmcache(7)手册页。
有关创建精简配置的逻辑卷的详情,请参考 第 4.4.5 节 “创建精简配置的逻辑卷”

4.4.9. 合并快照卷

您可以使用 lvconvert 命令的 --merge 选项将快照合并到其原始卷中。如果原始卷和快照卷都没有打开,则合并将立即开始。否则会在激活原始卷或快照卷并全部处于关闭状态时第一次执行合并。将快照合并到无法关闭的原始卷(如 root 文件系统)的过程中会延迟到下一次原始卷被激活时。当合并开始后,得到的逻辑卷将具有原始卷的名称、副号码和 UUID。在合并过程中,对原始卷的读取和写入将会被指向要合并的快照。当合并完成后,会删除合并的快照。
以下命令将快照卷 vg00/lvol1_snap 合并到其原始卷中。
# lvconvert --merge vg00/lvol1_snap
您可以在命令行中指定多个快照,或者您可以使用 LVM 对象标签指定要合并到其各自原始卷的快照。在以下示例中,逻辑卷 vg00/lvol1vg00/lvol2vg00/lvol3 都标记为标签 @some_tag。以下命令按顺序合并所有三个卷的快照逻辑卷: vg00/lvol1,然后 vg00/lvol2,然后 vg00/lvol3。如果使用了 --background 选项,则所有快照逻辑卷合并都将并行开始。
# lvconvert --merge @some_tag
有关标记 LVM 对象的详情,请参考 附录 D, LVM Object Tags。有关 lvconvert --merge 命令的详情,请参考 lvconvert(8)手册页。

4.4.10. 持久的设备号

在载入模块的时候会自动分配主设备号码和副设备号码。如果总是使用相同的设备(主和副)号码激活块设备,有些应用程序效果最好。您可以使用以下参数通过 lvcreatelvchange 命令来指定这些参数:
--persistent y --major major --minor minor
使用大的副号以确定还没有动态分配给另一个设备。
如果您要使用 NFS 导出文件系统,请在导出文件中指定 fsid 参数,这可以避免在 LVM 中设置持久的设备号。

4.4.11. 更改逻辑卷组的参数

要更改逻辑卷的参数,请使用 lvchange 命令。有关您可以更改的参数列表,请参阅 lvchange(8)手册页。
您可以使用 lvchange 命令来激活和停用逻辑卷。要同时激活和停用卷组中的所有逻辑卷,请使用 vgchange 命令,如 第 4.3.9 节 “更改卷组的参数” 所述。
以下命令将卷组 vg00 中卷 lvol1 的权限更改为只读。
# lvchange -pr vg00/lvol1

4.4.12. 重命名逻辑卷

要重命名现有逻辑卷,请使用 lvrename 命令。
下面的任意一个命令将卷组 vg02 中的逻辑卷 lvold 重命名为 lvnew
# lvrename /dev/vg02/lvold /dev/vg02/lvnew
# lvrename vg02 lvold lvnew
重命名根逻辑卷需要额外的重新配置。有关重命名根卷的详情,请参考 如何在 Red Hat Enterprise Linux 中重命名根卷组或者逻辑卷
有关激活集群中单个节点上的逻辑卷的详情,请参考 第 4.7 节 “激活集群中单个节点上的逻辑卷”

4.4.13. 删除逻辑卷

要删除不活跃的逻辑卷,请使用 lvremove 命令。如果逻辑卷当前已被挂载,请在删除卷前先卸载它。另外,在集群环境中,在删除逻辑卷之前,您必须先停用它。
以下命令从卷组 testvg 中删除逻辑卷 /dev/testvg/testlv。请注意,在这种情况下,逻辑卷还没有被停用。
# lvremove /dev/testvg/testlv
Do you really want to remove active logical volume "testlv"? [y/n]: y
  Logical volume "testlv" successfully removed
在使用 lvchange -an 命令删除逻辑卷前,您可以明确取消激活它,在这种情况下,您不会看到验证是否要删除活跃逻辑卷的提示。

4.4.14. 显示逻辑卷

您可以使用三个命令来显示 LVM 逻辑卷的属性: lvslvdisplaylvscan
lvs 命令以可配置的形式提供逻辑卷信息,每行显示一个逻辑卷。lvs 命令提供大量格式控制,对脚本很有用。有关使用 lvs 命令自定义输出的详情,请参考 第 4.8 节 “自定义 LVM 的报告”
lvdisplay 命令以固定格式显示逻辑卷属性(如大小、布局和映射)。
以下命令显示 vg00lvol2 的属性。如果已为这个原始逻辑卷创建了快照逻辑卷,这个命令会显示所有快照逻辑卷及其状态(活跃或不活跃)的列表。
# lvdisplay -v /dev/vg00/lvol2
lvscan 命令扫描系统中所有逻辑卷并列出它们,如下例所示。
# lvscan
 ACTIVE                   '/dev/vg0/gfslv' [1.46 GB] inherit

4.4.15. 增大逻辑卷

要增大逻辑卷的大小,请使用 lvextend 命令。
当扩展逻辑卷时,可以指定您想要增大的量,或者指定扩展它需要达到的大小。
以下命令将逻辑卷 /dev/myvg/homevol 扩展到 12GB。
# lvextend -L12G /dev/myvg/homevol 
lvextend -- extending logical volume "/dev/myvg/homevol" to 12 GB
lvextend -- doing automatic backup of volume group "myvg"
lvextend -- logical volume "/dev/myvg/homevol" successfully extended
以下命令在逻辑卷 /dev/myvg/homevol 中添加了 1GB。
# lvextend -L+1G /dev/myvg/homevol
lvextend -- extending logical volume "/dev/myvg/homevol" to 13 GB
lvextend -- doing automatic backup of volume group "myvg"
lvextend -- logical volume "/dev/myvg/homevol" successfully extended
lvcreate 命令一样,您可以使用 lvextend 命令的 -l 参数来指定扩展数目,从而增大逻辑卷的大小。您还可以使用此参数指定卷组的比例或者卷组中剩余空间的比例。以下命令将名为 testlv 的逻辑卷扩展到卷组 myvg 中所有未分配的空间。
# lvextend -l +100%FREE /dev/myvg/testlv
  Extending logical volume testlv to 68.59 GB
  Logical volume testlv successfully resized
当扩展逻辑卷后,有必要增大文件系统的大小以匹配文件系统。
默认情况下,大多数重新定义文件系统大小的工具都会将文件系统的大小增加到基本逻辑卷的大小,这样您就不必考虑为两个命令指定相同的容量。

4.4.16. 缩小逻辑卷

您可以使用 lvreduce 命令来减小逻辑卷的大小。
注意
GFS2 或者 XFS 文件系统不支持缩小,因此您无法缩小包含 GFS2 或者 XFS 文件系统的逻辑卷大小。
如果您要缩小的逻辑卷包含一个文件系统,为了防止数据丢失,必须确定该文件系统没有使用将被缩小的逻辑卷中的空间。因此,建议您在逻辑卷包含文件系统时使用 lvreduce 命令的 --resizefs 选项。当您使用这个选项时,lvreduce 命令会在缩小逻辑卷前尝试缩小文件系统。如果缩小文件系统失败,就像文件系统已满或者文件系统不支持缩小一样,则 lvreduce 命令将失败,且不会尝试缩小逻辑卷。
警告
在大多数情况下,lvreduce 命令会警告可能的数据丢失,并要求进行确认。但是,您不应该依赖于这些确认提示来防止数据丢失,因为在某些情况下,您不会看到这些提示信息,比如当逻辑卷不活跃或者没有使用 --resizefs 选项时。
请注意,使用 lvreduce 命令的 --test 选项不指示操作是安全的,因为此选项不会检查文件系统或测试文件系统大小。
以下命令将卷组 vg00 中的逻辑卷 lvol1 缩小到 64MB。在这个示例中,lvol1 包含一个文件系统,这个命令会与逻辑卷一起调整大小。这个示例显示了该命令的输出结果。
# lvreduce --resizefs -L 64M vg00/lvol1
fsck from util-linux 2.23.2
/dev/mapper/vg00-lvol1: clean, 11/25688 files, 8896/102400 blocks
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/mapper/vg00-lvol1 to 65536 (1k) blocks.
The filesystem on /dev/mapper/vg00-lvol1 is now 65536 blocks long.

  Size of logical volume vg00/lvol1 changed from 100.00 MiB (25 extents) to 64.00 MiB (16 extents).
  Logical volume vg00/lvol1 successfully resized.
在调整大小值前指定 - 符号表示将从逻辑卷的实际大小中减去该值。下面的例子显示,您希望将逻辑卷缩小到 64MB,而不是对该卷缩小 64MB。
# lvreduce --resizefs -L -64M vg00/lvol1

4.4.17. 扩展条带卷

要增加条带逻辑卷的大小,组成卷组的底层物理卷中必须有足够的空闲空间才能支持条带。例如,如果您有一个使用了整个卷组的双向条带,那么向卷组中添加一个物理卷将无法允许您扩展条带。反之,您必须在卷组中添加至少两个物理卷。
例如,假设一个由两个底层物理卷组成的卷组 vg,如以下 vgs 命令所示:
# vgs
  VG   #PV #LV #SN Attr   VSize   VFree
  vg     2   0   0 wz--n- 271.31G 271.31G
您可以使用整个卷组空间创建一个条带。
# lvcreate -n stripe1 -L 271.31G -i 2 vg
  Using default stripesize 64.00 KB
  Rounding up size to full physical extent 271.31 GB
  Logical volume "stripe1" created
# lvs -a -o +devices
  LV      VG   Attr   LSize   Origin Snap%  Move Log Copy%  Devices
  stripe1 vg   -wi-a- 271.31G                               /dev/sda1(0),/dev/sdb1(0)
请注意:卷组现在没有剩余空间。
# vgs
  VG   #PV #LV #SN Attr   VSize   VFree
  vg     2   1   0 wz--n- 271.31G    0
下面的命令在卷组中添加了另一个物理卷,它提供了 135GB 的额外空间。
# vgextend vg /dev/sdc1
  Volume group "vg" successfully extended
# vgs
  VG   #PV #LV #SN Attr   VSize   VFree
  vg     3   1   0 wz--n- 406.97G 135.66G
此时您不能将条带逻辑卷扩展为整个卷组大小,因为为了对数据进行条带,需要两个底层设备。
# lvextend vg/stripe1 -L 406G
  Using stripesize of last segment 64.00 KB
  Extending logical volume stripe1 to 406.00 GB
  Insufficient suitable allocatable extents for logical volume stripe1: 34480
more required
要扩展条带逻辑卷,请添加一个物理卷,然后扩展逻辑卷。在这个示例中,在卷组中添加两个物理卷,我们可将逻辑卷扩展成卷组的大小。
# vgextend vg /dev/sdd1
  Volume group "vg" successfully extended
# vgs
  VG   #PV #LV #SN Attr   VSize   VFree
  vg     4   1   0 wz--n- 542.62G 271.31G
# lvextend vg/stripe1 -L 542G
  Using stripesize of last segment 64.00 KB
  Extending logical volume stripe1 to 542.00 GB
  Logical volume stripe1 successfully resized
如果您没有足够的底层物理设备来扩展条带逻辑卷,那么如果扩展不是条带化,就可以扩展卷,这可能会导致性能不均衡。当向逻辑卷中添加空间时,默认操作是使用与现有逻辑卷的最后一段同样的条带参数,但您可以覆盖这些参数。以下示例在初始 lvextend 命令失败后,将扩展现有条带逻辑卷,以使用剩余的空闲空间。
# lvextend vg/stripe1 -L 406G
  Using stripesize of last segment 64.00 KB
  Extending logical volume stripe1 to 406.00 GB
  Insufficient suitable allocatable extents for logical volume stripe1: 34480
more required
# lvextend -i1 -l+100%FREE vg/stripe1

4.4.18. 扩展 RAID 卷

您可以使用 lvextend 命令增大 RAID 逻辑卷,而无需执行新 RAID 区域的同步。
如果您使用 lvcreate 命令创建 RAID 逻辑卷时指定了 --nosync 选项,则在创建逻辑卷时不会同步 RAID 区域。如果您稍后扩展使用 --nosync 选项创建的 RAID 逻辑卷,则同时不会同步 RAID 扩展。
您可以使用 lvs 命令显示卷的属性,来确定现有逻辑卷是否使用 --nosync 选项创建。如果 RAID 卷是在未使用初始同步的情况下创建的,则逻辑卷属性字段的第一个字符将显示"R",如果是使用初始同步创建的,则将显示"r"。
以下命令显示名为 lv 的 RAID 逻辑卷的属性,该逻辑卷是在初始同步的情况下创建的,在属性字段中显示"R"。属性字段中的第七个字符为"r",表示 RAID 的目标类型。有关属性字段含义的详情,请参考 表 4.5 “LVS 显示字段”
# lvs vg
  LV   VG   Attr     LSize Pool Origin Snap%  Move Log Cpy%Sync  Convert
  lv   vg   Rwi-a-r- 5.00g                               100.00
如果您使用 lvextend 命令增大这个逻辑卷,则 RAID 扩展将不会重新同步。
如果您在没有指定 lvcreate 命令的 --nosync 选项的情况下创建了 RAID 逻辑卷,则可以通过指定 lvextend 命令的 --nosync 选项来在不重新同步镜像的情况下增大逻辑卷。
以下示例扩展了在没有使用 --nosync 选项的情况下创建的 RAID 逻辑卷,这表示 RAID 卷在创建时就同步了。但是,本例指定在卷扩展时不同步卷。请注意,卷的属性为"r",但在执行带有 --nosync 选项的 lvextend 命令后,卷具有 "R" 属性。
# lvs vg
  LV   VG   Attr     LSize  Pool Origin Snap%  Move Log Cpy%Sync  Convert
  lv   vg   rwi-a-r- 20.00m                               100.00
# lvextend -L +5G vg/lv --nosync
  Extending 2 mirror images.
  Extending logical volume lv to 5.02 GiB
  Logical volume lv successfully resized
# lvs vg
  LV   VG   Attr     LSize Pool Origin Snap%  Move Log     Cpy%Sync  Convert
  lv   vg   Rwi-a-r- 5.02g                                   100.00
如果 RAID 卷不处于活跃状态,则在扩展卷时它不会自动跳过同步,即使您指定了 --nosync 选项来创建卷。相反,系统会提示您对逻辑卷的扩展部分执行全面重新同步。
注意
如果 RAID 卷正在执行恢复,如果您使用 --nosync 选项创建或扩展了卷,则无法扩展逻辑卷。但如果您没有指定 --nosync 选项,您可以在其恢复时扩展 RAID 卷。

4.4.19. 使用 cling Allocation 策略扩展逻辑卷

在扩展 LVM 卷时,您可以使用 lvextend 命令的 --alloc cling 选项来指定 cling 分配策略。这个策略将选择同一物理卷中的空间作为现有逻辑卷的最后区段。如果物理卷上没有足够的空间,且在 lvm.conf 文件中定义了标签列表,LVM 会检查是否将任何标签附加到物理卷中,并在现有扩展和新扩展之间查找匹配这些物理卷标签。
例如,如果您的逻辑卷在一个卷组的两个站点之间是镜像的,则您可以通过为物理卷标上 @site1@site2 标签来根据其所在位置标记物理卷。然后您可以在 lvm.conf 文件中指定以下行:
cling_tag_list = [ "@site1", "@site2" ]
有关标记物理卷的详情,请参考 附录 D, LVM Object Tags
在以下示例中,lvm.conf 文件已被修改为包含以下行:
cling_tag_list = [ "@A", "@B" ]
另外在这个示例中,创建了卷组 taft,它由物理卷 /dev/sdb1/dev/sdc1/dev/sdd1/dev/sde1/dev/sdf1/dev/sdg1/dev/sdh1 组成。这些物理卷已使用标签 ABC 进行了标记。该示例不使用 C 标签,但这表明 LVM 使用标签来选择使用哪个物理卷用于镜像 leg。
# pvs -a -o +pv_tags /dev/sd[bcdefgh]
  PV         VG   Fmt  Attr PSize  PFree  PV Tags
  /dev/sdb1  taft lvm2 a--  15.00g 15.00g A
  /dev/sdc1  taft lvm2 a--  15.00g 15.00g B
  /dev/sdd1  taft lvm2 a--  15.00g 15.00g B
  /dev/sde1  taft lvm2 a--  15.00g 15.00g C
  /dev/sdf1  taft lvm2 a--  15.00g 15.00g C
  /dev/sdg1  taft lvm2 a--  15.00g 15.00g A
  /dev/sdh1  taft lvm2 a--  15.00g 15.00g A
下面的命令从卷组 taft 中创建了一个 10GB 的镜像卷。
# lvcreate --type raid1 -m 1 -n mirror --nosync -L 10G taft
  WARNING: New raid1 won't be synchronised. Don't read what you didn't write!
  Logical volume "mirror" created
以下命令显示使用哪些设备作为镜像分支和 RAID 元数据子卷。
# lvs -a -o +devices
  LV                VG   Attr       LSize  Log Cpy%Sync Devices
  mirror            taft Rwi-a-r--- 10.00g       100.00 mirror_rimage_0(0),mirror_rimage_1(0)
  [mirror_rimage_0] taft iwi-aor--- 10.00g              /dev/sdb1(1)
  [mirror_rimage_1] taft iwi-aor--- 10.00g              /dev/sdc1(1)
  [mirror_rmeta_0]  taft ewi-aor---  4.00m              /dev/sdb1(0)
  [mirror_rmeta_1]  taft ewi-aor---  4.00m              /dev/sdc1(0)
以下命令使用 cling 分配策略扩展镜像卷的大小,以指示应使用具有相同标签的物理卷扩展镜像 leg。
# lvextend --alloc cling -L +10G taft/mirror
  Extending 2 mirror images.
  Extending logical volume mirror to 20.00 GiB
  Logical volume mirror successfully resized
以下显示命令展示了已使用与 leg 具有相同标记的物理卷扩展了镜像 leg。请注意,具有标签 C 的物理卷被忽略了。
# lvs -a -o +devices
  LV                VG   Attr       LSize  Log Cpy%Sync Devices
  mirror            taft Rwi-a-r--- 20.00g       100.00 mirror_rimage_0(0),mirror_rimage_1(0)
  [mirror_rimage_0] taft iwi-aor--- 20.00g              /dev/sdb1(1)
  [mirror_rimage_0] taft iwi-aor--- 20.00g              /dev/sdg1(0)
  [mirror_rimage_1] taft iwi-aor--- 20.00g              /dev/sdc1(1)
  [mirror_rimage_1] taft iwi-aor--- 20.00g              /dev/sdd1(0)
  [mirror_rmeta_0]  taft ewi-aor---  4.00m              /dev/sdb1(0)
  [mirror_rmeta_1]  taft ewi-aor---  4.00m              /dev/sdc1(0)

4.4.20. 控制逻辑卷激活

您可以使用 lvcreatelvchange 命令的 -k--setactivationskip {y|n} 选项在正常激活命令中标记要跳过的逻辑卷。这个标志在停用过程中不会应用。
您可以使用 lvs 命令确定是否为逻辑卷设置了此标记,该命令显示 k 属性,如下例所示。
# lvs vg/thin1s1
LV         VG  Attr       LSize Pool  Origin
thin1s1    vg  Vwi---tz-k 1.00t pool0 thin1
默认情况下,精简快照卷标记为激活跳过。除了标准的 -ay--activate y 选项外,您还可以使用 -K--ignoreactivationskip 选项来激活具有 k 属性的逻辑卷。
下面的命令激活一个精简快照逻辑卷。
# lvchange -ay -K VG/SnapLV
当逻辑卷是通过指定 lvcreate 命令的 -kn--setactivationskip n 选项创建时,可以关闭持久性 "activation skip" 标志。您可以通过指定 lvchange 命令的 -kn--setactivationskip n 选项为现有逻辑卷关闭标志。您可以使用 -ky--setactivationskip y 选项再次打开标志。
下面的命令创建了一个没有激活跳过标签的快照逻辑卷
# lvcreate --type thin -n SnapLV -kn -s ThinLV --thinpool VG/ThinPoolLV
下面的命令可从快照逻辑卷中删除激活跳过标签。
# lvchange -kn VG/SnapLV
您可以使用 /etc/lvm/lvm.conf 文件中的 auto_set_activation_skip 设置来控制默认的激活跳过设置。

4.4.21. 跟踪并显示历史逻辑卷(Red Hat Enterprise Linux 7.3 及更高版本)

从 Red Hat Enterprise Linux 7.3 开始,您可以通过在 lvm.conf 配置文件中启用 record_lvs_history 元数据选项将系统配置为跟踪已删除的精简快照和精简逻辑卷。这可让您显示完整的精简快照依赖链,其中包括已经从原始依赖链中删除的逻辑卷和已变为 historical 的逻辑卷。
您可以通过在 lvm.conf 配置文件中使用 lvs_history_retention_time 元数据选项指定保留时间(以秒为单位),将您的系统配置为保留历史卷。
历史逻辑卷保留了已删除的逻辑卷的简化表示,其中包括以下卷报告字段:
  • lv_time_removed :逻辑卷删除时间
  • lv_time :逻辑卷的创建时间
  • lv_name :逻辑卷的名称
  • lv_uuid :逻辑卷的 UUID
  • vg_name :包含逻辑卷的卷组。
当删除卷时,历史逻辑卷名称会有一个 hypen 作为前缀。例如,当您删除逻辑卷 lvol1 时,历史卷的名称为 -lvol1。无法重新激活历史逻辑卷。
即使启用了 record_lvs_history 元数据选项,您可以通过指定 lvremove 命令的 --nohistory 选项来防止在删除逻辑卷时单独保留历史逻辑卷。
要在卷显示中包含历史逻辑卷,请指定 LVM display 命令的 -H|--history 选项。您可以通过指定 lv_full_ancestorslv_full_descendants 报告字段以及 -H 选项来显示包括历史卷的完整精简快照依赖关系链。
下面的一系列命令提供了如何显示和管理历史逻辑卷的示例。
  1. 通过在 lvm.conf 文件中设置 record_lvs_history=1 来确保保留了历史逻辑卷。默认不启用这个元数据选项。
  2. 输入以下命令以显示精简置备的快照链。
    在本例中:
    • lvol1 是一个原始卷,链中的第一个卷。
    • lvol2lvol1 的快照。
    • lvol3lvol2 的快照。
    • lvol4lvol3 的快照。
    • lvol5 也是 lvol3 的快照。
    请注意,虽然示例 lvs display 命令包含 -H 选项,但还没有删除精简快照卷,且没有要显示的历史逻辑卷。
    # lvs -H -o name,full_ancestors,full_descendants
      LV    FAncestors        FDescendants
      lvol1                   lvol2,lvol3,lvol4,lvol5
      lvol2 lvol1             lvol3,lvol4,lvol5
      lvol3 lvol2,lvol1       lvol4,lvol5
      lvol4 lvol3,lvol2,lvol1
      lvol5 lvol3,lvol2,lvol1
      pool
    
  3. 从快照链中删除逻辑卷 lvol3,然后再次运行以下 lvs 命令来查看历史逻辑卷是如何显示的,以及它们的 ancestors 和 descendants。
    # lvremove -f vg/lvol3
      Logical volume "lvol3" successfully removed
    # lvs -H -o name,full_ancestors,full_descendants
      LV     FAncestors         FDescendants
      lvol1                     lvol2,-lvol3,lvol4,lvol5
      lvol2  lvol1              -lvol3,lvol4,lvol5
      -lvol3 lvol2,lvol1        lvol4,lvol5
      lvol4  -lvol3,lvol2,lvol1
      lvol5  -lvol3,lvol2,lvol1
      pool
    
  4. 您可以使用 lv_time_removed 报告字段来显示历史卷被删除的时间。
    # lvs -H -o name,full_ancestors,full_descendants,time_removed
      LV     FAncestors         FDescendants              RTime
      lvol1                     lvol2,-lvol3,lvol4,lvol5
      lvol2  lvol1              -lvol3,lvol4,lvol5
      -lvol3 lvol2,lvol1        lvol4,lvol5               2016-03-14 14:14:32 +0100
      lvol4  -lvol3,lvol2,lvol1
      lvol5  -lvol3,lvol2,lvol1
      pool
    
  5. 您可以通过指定 vgname/lvname 格式在 display 命令中单独引用历史逻辑卷,如下例所示。请注意,lv_attr 字段中的第五个位被设置为 h,以指示卷是一个历史卷。
    # lvs -H vg/-lvol3
      LV     VG   Attr       LSize
      -lvol3 vg   ----h-----    0
    
  6. 如果卷没有实时子卷(后代),LVM 不会保存历史逻辑卷。就是说,如果您在快照链末尾删除逻辑卷,则不会保留逻辑卷作为历史逻辑卷。
    # lvremove -f vg/lvol5
      Automatically removing historical logical volume vg/-lvol5.
      Logical volume "lvol5" successfully removed
    # lvs -H -o name,full_ancestors,full_descendants
      LV     FAncestors         FDescendants
      lvol1                     lvol2,-lvol3,lvol4
      lvol2  lvol1              -lvol3,lvol4
      -lvol3 lvol2,lvol1        lvol4
      lvol4  -lvol3,lvol2,lvol1
      pool
    
  7. 运行以下命令以删除卷 lvol1lvol2,并查看 lvs 命令在卷被删除后如何显示它们。
    # lvremove -f vg/lvol1 vg/lvol2
      Logical volume "lvol1" successfully removed
      Logical volume "lvol2" successfully removed
    # lvs -H -o name,full_ancestors,full_descendants
      LV     FAncestors           FDescendants
      -lvol1                      -lvol2,-lvol3,lvol4
      -lvol2 -lvol1               -lvol3,lvol4
      -lvol3 -lvol2,-lvol1        lvol4
      lvol4  -lvol3,-lvol2,-lvol1
      pool
    
  8. 要完全删除历史逻辑卷,您可以再次运行 lvremove 命令,指定现在包含连字符的历史卷的名称,如下例所示。
    # lvremove -f vg/-lvol3
    Historical logical volume "lvol3" successfully removed
    # lvs -H -o name,full_ancestors,full_descendants
      LV     FAncestors    FDescendants
      -lvol1               -lvol2,lvol4
      -lvol2 -lvol1        lvol4
      lvol4  -lvol2,-lvol1
      pool
    
  9. 只要链中包含实时卷,就可以保留一个历史逻辑卷。这意味着,删除历史逻辑卷时也会删除链中的所有逻辑卷,如以下示例所示。
    # lvremove -f vg/lvol4
      Automatically removing historical logical volume vg/-lvol1.
      Automatically removing historical logical volume vg/-lvol2.
      Automatically removing historical logical volume vg/-lvol4.
      Logical volume "lvol4" successfully removed