4.4. 逻辑卷管理

本小节论述执行各方面逻辑卷管理的命令。

4.4.1. 创建线性逻辑卷

请使用 lvcreate 命令创建逻辑卷。如果没有为该逻辑卷指定名称,则默认使用 lvol#,其中 # 是逻辑卷的内部编号。
创建逻辑卷后,则会从组成卷组之物理卷中的剩余扩展中分出逻辑卷。通常逻辑卷会用完底层物理卷中的所有可用空间。修改该逻辑卷可释放并重新分配物理卷中的空间。
下面的命令在卷组 vg1 中创建大小为 10GB 的逻辑卷。
# lvcreate -L 10G vg1
下面的命令创建大小为 1500MB,名为 testlv 的线性逻辑卷,该卷位于卷组 testvg 中,创建块设备 /dev/testvg/testlv
# lvcreate -L 1500 -n testlv testvg
下面的命令使用卷组 vg0 中的剩余扩展创建名为 gfslv,大小为 50GB 的逻辑卷。
# lvcreate -L 50G -n gfslv vg0
可使用 lvcreate 命令的 -l 参数,以范围为单位指定逻辑卷大小。还可以使用这个参数指定用于该逻辑卷的卷组百分比。下面的命令创建名为 mylv,使用卷组 testvg 总空间 60% 的逻辑卷。
# lvcreate -l 60%VG -n mylv testvg
还可以使用 lvcreate 命令的 -l 参数指定卷组中剩余可用空间的百分比作为逻辑卷的大小。下面的命令创建名为 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 testvg -n mylv
如果需要删除物理卷,则用来创建逻辑卷的基层物理卷会变得很重要,因此需要考虑创建该逻辑卷的可能性。有关从卷组中删除物理卷的详情,请查看 第 4.3.7 节 “从卷组中删除物理卷”
要创建使用卷组中具体物理卷分配的逻辑卷,请在 lvcreate 命令行的末端指定物理卷或多个物理卷。下面的命令在卷组 testvg 中创建名为 testlv 的逻辑卷,将其分配到物理卷 /dev/sdg1 中。
# lvcreate -L 1500 -ntestlv 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-
如何扩展逻辑卷的默认策略是采用 inherit 分配,它在卷组中应用相同的策略。可使用 lvchange 命令更改这些策略。有关分配策略的详情,请查看 第 4.3.1 节 “创建卷组”

4.4.2. 创建条带卷

如果有大量连续读、写操作,创建条带逻辑卷可提高数据 I/O 的效率。有关条带卷的常规信息,请查看 第 2.3.2 节 “条带逻辑卷”
创建条带逻辑卷时,可使用 lvcreate 命令的 -i 参数指定条带数。这样就决定了逻辑卷会在多少物理卷之间形成条带。条带数不能超过该卷组中的物理卷数(除非使用 --alloc anywhere 参数)。
如果组成逻辑卷的底层物理设备大小不同,则最大的条带卷是由最小的底层设备决定。例如:在有两个分支的条带中,条带卷大小不能超过较小设备的两倍。在有三个分支的条带中,条带卷大小不能超过最小设备的三倍。
下面的命令在两个物理卷之间创建条带逻辑卷,条带大小为 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 -nstripelv testvg /dev/sda1:0-49 /dev/sdb1:50-99
  Using default stripesize 64.00 KB
  Logical volume "stripelv" created

4.4.3. RAID 逻辑卷

LVM 支持 RAID1/4/5/6/10。

注意

集群无法识别 RAID 逻辑卷。由于只可在一台机器中创建并激活 RAID 逻辑卷,因此无法在一台以上的机器中同时激活它们。如果需要费独占镜像卷,则必须使用 mirror 片段类型创建卷,如 第 4.4.4 节 “创建镜像卷” 所述。
可使用 lvcreate 命令的 --type 参数指定 raid 类型,以便创建 RAID 逻辑卷。可能的 RAID 片段类型如 表 4.1 “RAID 片段类型” 所述。

表 4.1. RAID 片段类型

片段类型描述
raid1RAID1 镜像。这是在指定 -m 但没有指定条带时,lvcreate 命令 --type 参数的默认值。
raid4RAID2 专用奇偶磁盘
raid5raid5_ls
raid5_la
RAID5 左侧不对称。
Rotating parity 0 with data continuation
raid5_ra
RAID5 右侧不对称。
Rotating parity N with data continuation
raid5_ls
RAID5 左侧不对称。
Rotating parity 0 with data restart
raid5_rs
RAID5 右侧不对称。
Rotating parity N with data restart
raid6raid6_zr
raid6_zr
RAID6 零重启
Rotating parity zero (left-to-right) with data restart
raid6_nr
RAID6 N 重启
Rotating parity N (left-to-right) with data restart
raid6_nc
RAID6 N 延续
Rotating parity N (left-to-right) with data continuation
raid10
条带镜像。如果指定 -m 并制定大于 1 的条带数,这就是 lvcreate--type 参数的默认值。
条带镜像集
对大多数用户来说,指定五个主要类型(raid1raid4raid5raid6raid10)之一应该就足够了。有关 RAID5/6 所使用的不同算法的详情,请查看《通用 RAID 磁盘数据格式规格》一书中的第四章,网址为:http://www.snia.org/sites/default/files/SNIA_DDF_Technical_Position_v2.0.pdf
创建 RAID 逻辑卷时,LVM 会为每个数据生成大小为 1 个扩展的元数据子卷,或在阵列中生成奇偶校验子卷。例如:生成双向 RAID1 阵列可得到两个元数据子卷(即 lv_rmeta_0lv_rmeta_1)和两个数据子卷(lv_rimage_0lv_rimage_1)。同样,创建三向条带(加上一个隐式奇偶校验设备)RAID4 得到四个元数据子卷(lv_rmeta_0lv_rmeta_1lv_rmeta_2lv_rmeta_3)及四个数据子卷(lv_rimage_0lv_rimage_1lv_rimage_2lv_rimage_3)。
下面的命令在 1GB 的卷组 my_vg 中创建名为 my_lv 的双向 RAID1 阵列。
# lvcreate --type raid1 -m 1 -L 1G -n my_lv my_vg
可根据指定的 -m 参数值使用不同副本数创建 RAID1 阵列。同样,可使用 -i argument 选项为 RAID4/5/6 逻辑卷指定条带数。还可以使用 -I 参数指定条带大小。
下面的命令在 1GB 的卷组 my_vg 中创建名为 my_lv 的 RAID5 阵列(三个条带 + 一个隐式奇偶校验驱动器)。注:指定要在 LVM 条带卷中的条带数,会自动添加奇偶校验驱动器的正确数字。
# lvcreate --type raid5 -i 3 -L 1G -n my_lv my_vg
下面的命令在 1GB 的卷组 my_vg 中创建名为 my_lv 的 RAID6 阵列(三个条带 + 两个隐式奇偶校验驱动器)。
# lvcreate --type raid6 -i 3 -L 1G -n my_lv my_vg
使用 LVM 创建 RAID 逻辑卷后,可如同其他 LVM 逻辑卷一样激活、更改、删除、显示并使用该卷。
创建 RAID10 逻辑卷后,初始化附带 sync 操作逻辑卷所需的后台 I/O 会将其他 I/O 操作挤入 LVM 设备,比如卷组元数据更新,特别是在创建很多 RAID 逻辑卷时。这样会导致其他 LVM 操作变缓。
可使用恢复限制控制 RAID 逻辑卷初始化的比例。通过使用 lvcreate 命令的 --minrecoveryrate--maxrecoveryrate 选项设定那些操作的最小和最大 I/O 比例控制 sync 操作的执行比例。可按以下方法指定这些选项。
  • --maxrecoveryrate Rate[bBsSkKmMgG]
    为 RAID 逻辑卷设定最大恢复比例,以便其不会排挤正常 I/O 操作。将 Rate 指定为该阵列中每个设备的每秒恢复数量。如果没有给出后缀,则假设使用 kiB/sec/device。将恢复比例设定为 0 的含义是不绑定。
  • --minrecoveryrate Rate[bBsSkKmMgG]
    为 RAID 逻辑卷设定最小恢复比例,这样可以保证即使有很多正常 I/O 操作,sync 操作的 I/O 也可达到最小的吞吐量。将 Rate 指定为阵列中的每台设备的每秒恢复量。如果没有给出后缀,则假设为 kiB/sec/device。
下面的命令使用大小为 10GB 的三个条带创建一个双向 RAID10 阵列,其最大恢复比例为 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.7.4 节 “擦除 RAID 逻辑卷”
下面各小节论述了可在 LVM RAID 设备中执行的管理任务:

4.4.3.1. 将线性设备转换为 RAID 设备

可使用 lvconvert 命令的 --type 参数将现有线性逻辑卷转换为 RAID 设备。
使用下面的命令可将卷组 my_vg 中的线性逻辑卷 my_lv 转换为双向 RAID1 阵列。
# lvconvert --type raid1 -m 1 my_vg/my_lv
因为 RAID 逻辑卷由元数据及数据子卷对组成,当将线性设备转换为 RAID1 阵列时,会创建新的元数据子卷,并与该线性卷所在物理卷相同的原始逻辑卷(之一)关联。会将该附加映像添加到元数据/数组子卷对中。例如:如果原始设备如下:
# 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.2. 将 LVM RAID1 逻辑卷转换为 LVM 线性逻辑卷

使用 lvconvert 命令的 -m0 参数可将现有 RAID2 LVM 逻辑卷转换为 LVM 现有逻辑卷。这样会删除所有 RAID 数据子卷,及组成 RAID 阵列的所有 RAID 元数据子卷,让顶层 RAID2 映像保留为线性逻辑卷。
下面的示例显示现有 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/sda2。在这个示例中,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.3. 将镜像 LVM 卷转换为 RAID1 设备

可使用 lvconvert 命令的 --type raid1 参数将现有使用 mirror 片段类型的镜像 LVM 设备转换为 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)

4.4.3.4. 更改现有 RAID1 设备中的映像数

可与更改之前的 LVM 镜像部署中的映像数一样更改现有 RAID1 阵列的映像数,方法是使用 lvconvert 命令指定要添加或删除的额外元数据/数据子卷对。有关在之前的 LVM 镜像实施中更改卷配置的详情,请查看 第 4.4.4.4 节 “更改镜像卷配置”
使用 lvconvert 命令在 RAID1 设备中添加映像时,可为得到的设备指定映像总数,或指定要在该设备中添加多少映像。还可自选指定新元数据/数据映像对所在物理卷。
元数据子卷(名为 *_rmeta_*)总是位于其数据子卷副本(*_rimage_*)所在的同一物理设备中。不会在该 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)
下面的命令将双向 RAID 1 设备 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_0lv_rimage_1lv_rimage_2 组成的三向 RAID1 阵列中删除 lv_rimage_1,得到的 RAID1 阵列由 lv_rimage_0lv_rimage_1 组成。该子卷 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.5. 将 RAID 映像拆分为独立的逻辑卷

可拆分 RAID 逻辑卷映像,以便组成新的逻辑卷。这个拆分 RAID 映像的过程与拆分镜像逻辑卷冗余映像的过程一样,如 第 4.4.4.2 节 “拆分镜像逻辑卷的冗余映象” 所述。
拆分 RAID 映像的命令格式如下:
lvconvert --splitmirrors count -n splitname vg/lv [removable_PVs]
与从现有 RAID1 逻辑卷中删除 RAID 映像一样(如 第 4.4.3.4 节 “更改现有 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 拆分为一个双向逻辑卷 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.6. 拆分及合并 RAID 映象

可与 lvconvert 命令的 --splitmirrors 参数联合使用 --trackchanges 参数临时拆分 RAID1 阵列,同时跟踪所有变更。这样可稍后将该映象合并回该阵列,同时只重新同步那些将该映象拆分后阵列有变化的部分。
lvconvert 命令拆分 RAID 映象的格式如下。
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 命令,即重复最初用来拆分该映象的 lvconvert 命令,但不指定 --trackchanges 参数,即可永久获得该拆分。这样会破坏 --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.7. 设定 RAID 错误策略

LVM RAID 根据 lvm.conf 文件中 raid_fault_policy 字段所定义的属性,以自动方式处理设备失败。
  • 如果将 raid_fault_policy 字段设定为 allocate,则系统会尝试使用该卷组中的可用设备替换失败的设备。如果没有可用的剩余设备,则会在系统日志中记录。
  • 如果将 raid_fault_policy 字段设定为 warn,则该系统会生成警告,并在日志中记录该设备已失败。这样可让用户决定要采取的行动。
只要有足够的设备可供使用,RAID 逻辑卷就会继续运行。
4.4.3.7.1. allocate 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.7.2 节 “警告 RAID 出错策略” 所述。另外,还可以替换设备的设备,如 第 4.4.3.7.3 节 “替换 RAID 设备” 所述。
4.4.3.7.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.7.3. 替换 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.7.4. 擦除 RAID 逻辑卷
LVM 为 RAID 逻辑卷提供擦除支持。RAID 擦除是读取某个阵列中的所有数据及奇偶校验块,检查其是否一致的过程。
使用 lvchange 命令的 --syncaction 选项启动 RAID 擦除操作。可指定 check 或者 repair 操作。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:初始化阵列或在机器失败后恢复
  • recover:替换阵列中的设备
  • check:查找阵列不一致的地方
  • repair:查找并修复阵列不一致的地方
raid_mismatch_count 字段显示 check 操作中找到的差异。
lvs 命令的 Cpy%Sync 字段现在输出 raid_sync_action 操作的过程,其中包括 checkrepair
lvs 命令的 lv_attr 字段显示目前可在 RAID 擦除操作支持中提供额外的识别符。这个字段的字节 9 显示逻辑卷是否正常工作,它现在支持以下识别符。
  • m(不匹配)表示在 RAID 逻辑卷中存在差异。如果擦除操作探测到 RAID 的部分有不一致的情况后会显示这个字符。
  • r(刷新))表示阵列中的设备已经失败,且内核将其视为失败,即使 LVM 可读取该设备标签,并将其视为可操作。该逻辑卷应该可以刷新以通知内核该设备现在可用;也可以在怀疑该设备失败后将其替换。
有关 lvs 命令的详情,请查看 第 4.8.2 节 “对象选择”
执行 RAID 擦除操作时,sync(同步)操作要求的后台 I/O 会被 LVM 设备的其他操作挤掉,比如更新到卷组元数据。这样可能会造成其他 LVM 操作变慢。您可以通过设定恢复限制控制 RAID 逻辑卷的擦除比例。
可通过为 lvchange 命令的 --minrecoveryrate--maxrecoveryrate 选项设定 sync 操作的最小和最大 I/O 比例,控制该操作比例。可按照以下方式指定这些选项。
  • --maxrecoveryrate Rate[bBsSkKmMgG]
    为 RAID 逻辑卷设定最大恢复比例,以便其不会排挤正常 I/O 操作。将 Rate 指定为该阵列中每个设备的每秒恢复数量。如果没有给出后缀,则假设使用 kiB/sec/device。将恢复比例设定为 0 的含义是不绑定。
  • --minrecoveryrate Rate[bBsSkKmMgG]
    设定 RAID 逻辑卷的最小恢复比例,保证 sync 操作取得最小吞吐量,即使有大量常规 I/O。以阵列中的每个设备的每秒数量为单位指定 Rate。如果没有给出后缀,则假设使用 kiB/sec/device。
4.4.3.7.5. 控制 RAID 逻辑卷中的 I/O 操作
可使用 lvchange 命令的 --writemostly--writebehind 参数为 RAID1 逻辑卷中的设备控制 I/O 操作。
  • --[raid]writemostly PhysicalVolume[:{t|y|n}]
    将 RAID1 逻辑卷中的设备标记为 write-mostly。除非必要,应避免读取这些驱动器。设定这个参数以保证该驱动器的最小 I/O 操作数。默认行为是为了解决在指定的物理卷设定 write-mostly 刷新。可在该物理卷中附加 :n 删除 write-mostly 标记。在单一命令中可多次指定 write-mostly 参数,使其可以一次为逻辑卷中的所有物理卷触发 write-mostly 属性。
  • --[raid]writebehind IOCount
    指定 RAID1 逻辑卷中设备允许的最大未完成写入数,将其标记为 write-mostly。超过此数值后,写入变为同步,导致所有对组成设备的写入会在阵列发出完成写入信号前完成。将该值设定为 0 会清除该属性,并允许该系统随机选择该值。

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.3 节 “将镜像 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
该镜像日志是在于创建该镜像分支设备不同的设备中创建。但也可以使用 vgcreate 命令的 --alloc anywhere 参数在创建该镜像分支设备的同一设备中创建该镜像日志。这样可能会降低性能,但可让您在只有两个底层设备的情况下创建镜像。
下面的命令在创建镜像分支的同一设备中为单一镜像创建镜像逻辑卷。在这个示例中,卷组 vg0 由两个设备组成。这个命令在卷组 vg0 中创建名为 mirrorlv,大小为 500MB 的卷。
# lvcreate --type mirror -L 500M -m 1 -n mirrorlv -alloc anywhere vg0

注意

在集群镜像中,镜像日志管理完全由目前集群 ID 最低的集群节点控制。因此,当存储集群镜像日志的设备在集群的某个子集中不可用时,只要 ID 数最小的集群节点可以访问该集群该日志,则该集群镜像可继续运行,不受任何影响。因为该镜像不会受到影响,因此也不会进行自动修正(修复)。但当 ID 数最低的集群节点无法访问该镜像日志后,则会执行自动操作(无论其他节点是否可以访问该日志)。
要创建自我对称的镜像日志,可指定 --mirrorlog mirrored 参数。下面的命令在卷组 bigvg 中创建镜像逻辑卷。该逻辑卷名为 twologvol,有一个镜像。该卷大小为 12MB,镜像日志为对称的。
# lvcreate --type mirror -L 12MB -m 1 --mirrorlog mirrored -n twologvol bigvg
  Logical volume "twologvol" created
与标准镜像日志一样,可以使用 vgcreate 命令的 --alloc anywhere 参数在创建镜像分支的同一设备中创建冗余镜像日志。这样可能会降低性能,但可让您在没有足够底层设备以保证每个设备预期镜像分支处于不同设备的情况下创建冗余镜像日志。
创建镜像后,则会同步镜像区域。对于较大的镜像组件,同步过程可能会较长。创建不需要恢复的新镜像时,可指定 --nosync 参数,表示不需要根据第一个设备初始化同步。
可指定使用镜像分支及日志的设备以及该设备中要使用的扩展。要强制将日志记录在特定磁盘中,可指定保存日志的磁盘具体扩展。LVM 不需要遵守命令行中列出的顺序。如果列出任意物理卷,则只能在该设备中保存日志。列表中列出的已分配物理扩展将被忽略。
下面的命令创建使用单一镜像的镜像逻辑卷,且单一日志为不对称。该卷大小为 500MB,名为 mirrorlv,由卷组 vg0 生成。该镜像的第一个分支位于设备 /dev/sda1,第二个镜像位于设备 /dev/sdb1,而第三个镜像位于设备 /dev/sdc1
# lvcreate --type mirror -L 500M -m 1 -n mirrorlv vg0 /dev/sda1 /dev/sdb1 /dev/sdc1
下面的命令创建使用单一镜像的镜像逻辑卷。其大小为 500MB,名为 mirrorlv,由卷组 vg0 生成。该镜像的第一个分支位于设备 /dev/sda1 的第 0-499 扩展,第二个分支位于 /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. 镜像逻辑卷失败策略

您可以使用 mirror_image_fault_policymirror_log_fault_policy 参数在 lvm.conf 文件的 activation 部分定义逻辑卷在设备失败事件中的行为。将这些参数设定为 activation 后,系统会尝试移除出错的设备,并在没有这些设备的情况下运行。将这些参数设定为 allocate 后,系统会尝试移除出错的设备,并尝试在新设备中分配空间替换失败的设备。如果没有合适的设备,且没有可为替换失败的设备分配的空间,则这个策略与 remove 策略的行为一致。
默认情况下,mirror_log_fault_policy 参数为 allocate。在日志中使用这个策略非常迅速,并可保证在崩溃及重启后可记住同步状态。如果将这个策略设定为 remove,则会在日志设备失败,镜像转而使用内存日志后,该镜像不会记住出现故障和重启后的同步状态,因而会重新同步整个镜像。
默认情况下,mirror_image_fault_policy 参数为 remove。使用这个策略后,如果镜像映象失败,且只还有一个工作的副本,则该镜像会转而使用非镜像设备。为镜像设备将这个策略设定为 allocate 后,则要求该镜像设备重新同步该设备。这样会让过程变缓,但会保留该设备的镜像特征。

注意

LVM 镜像卷有失败的设备时,会进行两个阶段的恢复。第一个阶段包括删除失败的设备。这样可得到成为线性设备的镜像。在第二个阶段中,如果将 mirror_log_fault_policy 参数设定为 allocate,则会尝试替换失败的设备。注:但不保证在第二阶段中会选取之前由该镜像使用,但不是失败设备一部分的设备可用。
从 LVM 镜像失败中手动恢复的详情请查看 第 6.3 节 “恢复 LVM 镜像错误”

4.4.4.2. 拆分镜像逻辑卷的冗余映象

可拆分镜像逻辑卷的冗余映象以形成新逻辑卷。要拆分映象,可使用 lvconvert 命令的 --splitmirrors 参数,指定要拆分的冗余映象数。必须使用该命令的 --name 参数指定新拆分逻辑卷的名称。
下面的命令从镜像逻辑卷 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

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
将线性卷转换为镜像卷时,基本上均可为现有卷创建镜像分支。这就是说您的卷组必须包含用于该镜像分支及镜像日志的设备和空间。
如果丢失镜像分支,则 LVM 会将该卷转换为线性卷,以便您可以在没有镜像冗余的情况下访问该卷。替换该分支后,可使用 lvconvert 命令恢复该镜像,如 第 6.3 节 “恢复 LVM 镜像错误” 所述。
下面的命令将线性逻辑卷 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)

4.4.5. 创建精简配置逻辑卷

可对逻辑卷进行精简配置。这样就可以让您创建比可用扩展大的逻辑卷。可使用精简配置管理剩余空间的存储池,也称精简池,应用程序可使用该池根据需要分配随机数量的设备。然后可以创建绑定到精简池的设备,以便稍后应用程序实际写入该逻辑卷时分配。该精简池可在需要时动态扩展,以便进行符合成本效益的存储空间分配。

注意

本小节提供用来创建并增大精简配置逻辑卷的基本命令概述。有关 LVM 精简配置详情及使用 LVM 命令和利用精简配置逻辑卷的详情,请查看 lvmthin(7) man page。

注意

在集群的节点间不支持精简卷。该精简池及其所有精简卷必须只在一个集群节点中激活。
请执行以下任务创建精简卷:
  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,大小为 100M,名为 mythinpool 的精简池。
# 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
创建池时支持条带。下面的命令在有两个 64kB 条带及一个 256kB 区块的卷组 vg001 中创建名为 pool,大小为 100M 的精简池。它还会创建一个 1T 精简卷 vg00/thin_lv
# lvcreate -i 2 -I 64 -c 256 -L 100M -T vg00/pool -V 1T --name thin_lv
可使用 lvextend 命令扩展精简卷的大小。但不能将其减小。
下面的命令可为现有精简池扩充 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 命令的 --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.17 节 “控制逻辑卷激活”
下面的命令创建大小为 100MB,名为 /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 命令显示原始卷及每个快照卷目前使用的百分比。以下示例显示了系统 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_thresholdsnapshot_autoextend_percent 的详情。有关 lvm.conf 文件的详情,请查看 附录 B, LVM 配置文件

4.4.7. 创建精简配置快照卷

Red Hat Enterprise Linux 提供精简配置快照卷支持。有关精简快照卷的优点及局限,请参看 第 2.3.6 节 “精简配置快照卷”

注意

本小节提供用来创建并增大精简配置快照据的基本命令概述。有关 LVM 精简配置的详情,以及在精简配置逻辑卷中使用 LVM 命令及程序的详情,请查看 lvmthin(7) man page。

重要

创建精简快照卷时,不能指定该卷的大小。如果指定 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.17 节 “控制逻辑卷激活”
还可以在非精简配置逻辑卷中创建精简配置快照。因为非精简配置逻辑卷不存在于精简池中,因此将其视为外部原始卷。外部原始卷可由很多精简配置快照卷使用并共享,即使这些快照卷来自不同的精简池。创建该精简配置快照时,外部原始卷必须为不活跃卷,且处于只读状态。
要创建外部原始卷的精简配置快照,则必须指定 --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

4.4.8. 合并快照卷

可使用 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 对象的详情,请查看 附录 C, LVM 对象标签。有关 lvconvert --merge 命令的详情,请查看 lvconvert(8) man page。

4.4.9. 永久设备号

载入模块时会动态分配主要和次要设备号。有些应用程序在块设备永远使用同一设备(主要和次要)号激活状态时工作状态最佳。可使用下面的参数,通过 lvcreatelvchange 命令的指定这些内容:
--persistent y --major major --minor minor
使用较大的次要号码以保证尚未将其动态分配给另一个设备。
如果要使用 NFS 导出文件系统,在导出文件中指定 fsid 参数可避免在 LVM 中设定持久设备号。

4.4.10. 重新定义逻辑卷大小

可使用 lvreduce 命令减小逻辑卷大小。如果该逻辑卷包含一个文件系统,请确定首先减小该文件系统(或使用 LVM GUI),以便逻辑卷总是可至少达到文件系统所需要的大小。
下面的命令将卷组 vg00 中逻辑卷 lvol1 大小减小 3 个逻辑扩展。
# lvreduce -l -3 vg00/lvol1

4.4.11. 更改逻辑卷组的参数

可使用 lvchange 命令更改逻辑卷的参数。有关可更改的参数列表,请查看 lvchange(8) man page。
可使用 lvchange 命令激活和停用逻辑卷。可使用 vgchange 命令同时激活和停用卷组中的所有逻辑卷,如 第 4.3.8 节 “更改卷组参数” 所述。
下面的命令将卷组 vg00 中卷 lvol1 的权限改为只读。
# lvchange -pr vg00/lvol1

4.4.12. 重命名逻辑卷

请使用 lvrename 命令重命名现有逻辑卷。
下面的命令将卷组 vg02 中的逻辑卷 lvold 重命名为 lvnew
# lvrename /dev/vg02/lvold /dev/vg02/lvnew
# lvrename vg02 lvold lvnew
有关在集群的独立节点中激活逻辑卷的详情,请查看 第 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 的属性。如果已为这个原始逻辑卷创建快照逻辑卷,这个命令会显示所有快照逻辑卷及其状态(active 或者 inactive)列表。
# 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 逻辑卷中添加另一个 GB。
# 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.15.1. 扩展条带卷

要增大条带逻辑卷的大小,则必须在底层物理卷中有足够的剩余空间,以便组成卷组支持该条带。例如:如果有一个使用整个卷组的双向条带,在该卷组中添加单一物理卷不会让您有扩展该条带的能力,而必须在该卷组中添加至少两个物理卷方可有此能力。
例如:可使用下面的 vgs 命令显示由两个底层物理卷组成的卷组 vg
# 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
下面的命令在卷组中添加另一个物理卷,之后该卷组就有 135G 附加空间。
# 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.15.2. 扩展 RAID 卷

在不执行新 RAID 区域同步的情况下使用 lvextend 命令增大 RAID 逻辑卷。
使用 lvcreate 命令创建 RAID 逻辑卷时,如果指定 --nosync 选项,则在创建该逻辑卷后不会同步 RAID 区域。如果稍后使用 --nosync 选项扩展已创建的 RAID 逻辑卷,此时也不会同步该 RAID 扩展。
使用 lvs 命令的 --nosync 选项决定是否让已创建的现有逻辑卷显示该卷的属性。如果逻辑卷 attribute 字段第一个字符为“R”,则表示创建该 RAID 卷时没有启用初始同步;如果该字符为“r”,则表示创建时启动初始同步。
下面的命令显示名为 lv 的 RAID 逻辑卷的属性,创建该卷时没有启动同步,attribute 字段的第一个字符为 “R”。该字段的第七个字符为 “r”,代表 RAID 目标类型。有关 attribute 字段的含义,请查看 表 4.4 “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 选项,则可以使用 lvextend 命令的 --nosync 选项增大该逻辑卷,且无需重新同步该镜像。
下面的示例扩展了 RAID 逻辑卷,创建该卷时没有使用 --nosync 选项,表示在创建时同步该 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.15.3. 使用 cling 分配策略扩展逻辑卷

可使用 lvextend 命令的 --alloc cling 选项指定 cling 分配策略扩展 LVM 卷。这个策略会在与现有逻辑卷的最后片段所在的同一物理卷中选择空间。如果在该物理卷中没有足够的空间,并在 lvm.conf 文件中定义了一组标签,则 LVM 会检查是否在该物理卷中附加任何标签,并在现有扩展和新扩展之间映射那些物理卷标签。
例如:如果您有逻辑卷是某个单一卷组中两个网站间的镜像,就可以使用 @site1 和 @site2 标签,根据其所在位置标记该物理卷,并在 lvm.conf 文件中指定以下行:
cling_tag_list = [ "@site1", "@site2" ]
有关物理卷标签的详情,请查看 附录 C, LVM 对象标签
在下面的示例中修改了 lvm.conf 文件使其包含以下行:
cling_tag_list = [ "@A", "@B" ]
同样在此示例中,创建的卷组 taft 由物理卷 /dev/sdb1/dev/sdc1/dev/sdd1/dev/sde1/dev/sdf1/dev/sdg1/dev/sdh1 组成。该示例不使用 C 标签,但这样会显示该 LVM 使用标签选择用于镜像分支的物理卷。
# 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 中创建一个大小为 100GB 的镜像卷。
# 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 分配策略表示需要使用有相同标签的物理卷扩展的镜像分支。
# lvextend --alloc cling -L +10G taft/mirror
  Extending 2 mirror images.
  Extending logical volume mirror to 20.00 GiB
  Logical volume mirror successfully resized
下面的命令显示使用与该分支有相同标签的物理卷扩展的镜像卷。注:忽略使用标签 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.16. 缩小逻辑卷

要缩小逻辑卷,首先请卸载该文件系统。然后可使用命令 lvreduce 缩小该卷。缩小该卷后,创新挂载该文件系统。

警告

关键是要在缩小该卷前,减小文件系统或者其在该卷中所在位置的大小,否则可能会有丢失数据的风险。
缩小逻辑卷可释放一些卷组空间,将其分配该该卷组中的其他逻辑卷。
下面的示例将卷组 vg00 中的逻辑卷 lvol1 减少 3 个逻辑扩展。
# lvreduce -l -3 vg00/lvol1

4.4.17. 控制逻辑卷激活

可使用 lvcreate 或者 lvchange 命令的 -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 再打开该标志。
下面的命令创建没有 activation skip 标志的快照逻辑卷
# lvcreate --type thin -n SnapLV -kn -s ThinLV --thinpool VG/ThinPoolLV
下面的命令从快照逻辑卷中删除 activation skip 标签。
# lvchange -kn VG/SnapLV
可使用 /etc/lvm/lvm.conf 文件中的 auto_set_activation_skip 设置控制默认的跳过激活指定。