67.7. 配置 RAID 逻辑卷


您可以使用逻辑卷管理器(LVM)创建和管理 Redundant Array of Independent Disks (RAID)卷。LVM 支持 RAID 0、1、4、5、6 和 10。LVM RAID 卷有以下特征:

  • LVM 会创建和管理利用多设备 (MD) 内核驱动程序的 RAID 逻辑卷。
  • 您可以从阵列中临时分割 RAID1 镜像,并在之后将其合并到阵列中。
  • LVM RAID 卷支持快照。
  • RAID 逻辑卷不是集群感知的。您可以只在一台机器中创建和激活 RAID 逻辑卷,但不能在多台机器中同时激活它们。
  • 当您创建 RAID 逻辑卷(LV)时,LVM 会创建一个元数据子卷,它是阵列中的每个数据或奇偶校验子卷的大小的一个区块。例如,创建一个双向 RAID1 阵列会导致两个元数据子卷(lv_rmeta_0lv_rmeta_1)以及两个数据子卷(lv_rimage_0lv_rimage_1)。
  • 在 RAID LV 中添加完整性可减少或防止软崩溃。

67.7.1. RAID 级别和线性支持

以下是 RAID 支持的配置,包括级别 0、1、4、5、6、10 和线性:

0 级

RAID 级别 0,通常称为条带化的数据映射技术。这意味着,要写入阵列的数据被分成条块,并在阵列的成员磁盘中写入,这样可以在成本低的情况下提供高的 I/O 性能,但不提供冗余。

RAID 级别 0 的实现只在成员设备间条状分布到阵列中最小设备的大小。就是说,如果您有多个设备,它们的大小稍有不同,那么每个设备的大小都被视为与最小设备的大小相同。因此,级别 0 阵列的常见存储容量是所有磁盘的总容量。如果成员磁盘具有不同的大小,RAID0 将使用可用区使用这些磁盘的所有空间。

1 级

RAID 级别 1 或称为镜像(mirroring),通过将相同数据写入阵列的每个磁盘来提供冗余,在每个磁盘上保留"镜像"副本。因为其简单且数据高度可用,RAID 1 仍然被广泛使用。级别 1 需要两个或者多个磁盘,它提供了很好的数据可靠性,提高了需要读取的应用程序的性能,但是成本相对高。

为了实现数据可靠性,需要向阵列中的所有磁盘写入相同的信息,所以 RAID 1 的成本会很高。与基于奇偶校验的其他级别(如级别 5)相比,空间的利用效率较低。然而,对空间利用率的牺牲提供了高性能:基于奇偶校验的 RAID 级别会消耗大量 CPU 资源以便获得奇偶校验,而 RAID 级别 1 只是一次向多个 RAID 成员中写入同样数据,其对 CPU 的消耗较小。因此,在使用软件 RAID 的系统中,或系统中有其他操作需要大量使用 CPU 资源时,RAID 1 可能会比使用基于奇偶校验的 RAID 级别的性能更好。

级别 1 阵列的存储容量等于硬件 RAID 中最小镜像硬盘或者软件 RAID 中最小镜像分区的容量相同。级别 1 所提供的冗余性是所有 RAID 级别中最高的,因为阵列只需要在有一个成员可以正常工作的情况下就可以提供数据。

级别 4

级别 4 使用单一磁盘驱动器中的奇偶校验来保护数据。奇偶校验信息根据阵列中其余成员磁盘的内容计算。然后当阵列中的一个磁盘失败时,这个信息就可以被用来重建数据。然后,在出现问题的磁盘被替换前,使用被重建的数据就可以满足 I/O 的请求。在磁盘被替换后,可以在上面重新生成数据。

因为专用奇偶校验磁盘代表所有写交易到 RAID 阵列的固有瓶颈,因此在没有写回缓存等技术的情况下,级别 4 很少被使用。或者在特定情况下,系统管理员有意设计具有这个瓶颈的软件 RAID 设备,比如当阵列使用数据填充后没有写入事务的数组。因此,Anaconda 中并没有提供 RAID 4 这个选项。但是,如果需要,用户可以手动创建它。

硬件 RAID 4 的存储容量等于分区数量减一乘以最小成员分区的容量。RAID 4 阵列的性能是非对称的,即读的性能会好于写的性能。这是因为,写操作会在生成奇偶校验时消耗额外的 CPU 和主内存带宽,然后在将实际数据写入磁盘时也会消耗额外的总线带宽,因为您不仅写数据,而且还写奇偶校验。读操作只需要读取数据而不是奇偶校验,除非该阵列处于降级状态。因此,在正常操作条件下,对于相同数量的数据传输,读操作会对驱动器和计算机总线产生较少的流量。

5 级

这是最常见的 RAID 类型。通过在一个阵列的所有成员磁盘中分布奇偶校验,RAID 5 解除了级别 4 中原有的写入瓶颈。唯一性能瓶颈是奇偶校验计算过程本身。现代 CPU 可以非常快速地计算奇偶校验。但是,如果您在 RAID 5 阵列中有大量磁盘,以便在所有设备间合并数据传输速度非常高,则奇偶校验计算可能会成为瓶颈。

5 级具有非对称性能,读性能显著提高。RAID 5 的存储容量的计算方法与级别 4 的计算方法是一样的。

级别 6

如果数据的冗余性和保护性比性能更重要,且无法接受 RAID 1 的空间利用率低的问题,则通常会选择使用级别 6。级别 6 使用一个复杂的奇偶校验方式,可以在阵列中出现任意两个磁盘失败的情况下进行恢复。因为使用的奇偶校验方式比较复杂,软件 RAID 设备会对 CPU 造成较大负担,同时对写操作造成更大的负担。因此,与级别 4 和 5 相比,级别 6 的性能不对称性更严重。

RAID 6 阵列的总容量与 RAID 5 和 4 类似,但您必须从额外奇偶校验存储空间的设备数中减去 2 个设备(而不是 1 个)。

级别 10

这个 RAID 级别将级别 0 的性能优势与级别 1 的冗余合并。它还可减少在具有多于两个设备的 1 级阵列中发现的一些空间。对于 10 级,可以创建一个 3 个驱动器阵列,来仅存储每块数据的 2 个副本,然后允许整个阵列的大小为最小设备的 1.5 倍,而不是只等于最小设备(这与 3 设备1 级阵列类似)。与 RAID 级别 6 相比,计算奇偶校验对 CPU 的消耗较少,但空间效率较低。

在安装过程中,不支持创建 RAID 10。您可在安装后手动创建。

线性 RAID

线性 RAID 是创建更大的虚拟驱动器的一组驱动器。

在线性 RAID 中,块会被从一个成员驱动器中按顺序分配,只有在第一个完全填充时才会进入下一个驱动器。这个分组方法不会提供性能优势,因为 I/O 操作不太可能在不同成员间同时进行。线性 RAID 也不提供冗余性,并会降低可靠性。如果有任何一个成员驱动器失败,则无法使用整个阵列,数据可能会丢失。该容量是所有成员磁盘的总量。

67.7.2. LVM RAID 片段类型

要创建 RAID 逻辑卷,您可以使用 lvcreate 命令的 --type 参数指定 RAID 类型。对于大多数用户,指定五个可用主类型之一 raid1raid4raid5raid6raid10 应足够。

下表描述了可能的 RAID 片段类型。

表 67.1. LVM RAID 片段类型
片段类型描述

raid1

RAID1 镜像。当您指定 -m 参数而不指定条带时,这是 lvcreate 命令的 --type 参数的默认值。

raid4

RAID4 专用奇偶校验磁盘。

raid5_la

  • RAID5 左非对称。
  • 轮转奇偶校验 0 并分配数据。

raid5_ra

  • RAID5 右非对称。
  • 轮转奇偶校验 N 并分配数据.

raid5_ls

  • RAID5 左对称。
  • 它与 raid5 相同。
  • 使用数据重启轮转奇偶校验 0。

raid5_rs

  • RAID5 右对称。
  • 使用数据重启轮转奇偶校验 N。

raid6_zr

  • RAID6 零重启。
  • 它与 raid6 相同。
  • 数据重启时的旋转奇偶校验零(从左到右)。

raid6_nr

  • RAID6 N 重启。
  • 数据重启时的旋转奇偶校验 N (从左到右)。

raid6_nc

  • RAID6 N 继续。
  • 数据持续的旋转奇偶校验 N (从左到右)。

raid10

  • 条带镜像。如果您指定了 -m 参数以及大于 1 的条带数,则这是 lvcreate 命令的 --type 参数的默认值。
  • 镜像集合的条带。

raid0/raid0_meta

条带。RAID0 以条带大小的单位在多个数据子卷间分布逻辑卷数据。这可以提高性能。如果任何数据子卷失败,逻辑卷数据将会丢失。

67.7.3. 创建 RAID0 的参数

您可以使用 lvcreate --type raid0[meta] --stripes _Stripes --stripesize StripeSize VolumeGroup [PhysicalVolumePath] 命令创建 RAID0 条状逻辑卷。

下表描述了不同的参数,您可以在创建 RAID0 条状逻辑卷时使用它们。

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

67.7.4. 创建 RAID 逻辑卷

您可以根据您为 -m 参数指定的值,来创建具有不同副本数的 RAID1 阵列。同样,您可以使用 -i 参数为 RAID 0、4、5、6 和 10 逻辑卷指定条带数。您还可以使用 -I 参数指定条带大小。下面的步骤描述了创建不同类型的 RAID 逻辑卷的不同方法。

流程

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

    # lvcreate --type raid1 -m 1 -L 1G -n my_lv my_vg
    Logical volume "my_lv" created.
  • 使用条带创建 RAID5 阵列。以下命令在卷组 my_vg 中创建具有三个条带的 RAID5 阵列和一个隐式奇偶校验驱动器,名为 my_lv,大小为 1G。请注意,您可以指定与 LVM 条带卷类似的条带数。自动添加正确奇偶校验驱动器数。

    # lvcreate --type raid5 -i 3 -L 1G -n my_lv my_vg
  • 使用条带创建 RAID6 阵列。以下命令在卷组 my_vg 中创建具有三个 3 个条带的 RAID6 阵列,以及名为 my_lv 的两个隐式奇偶校验驱动器,大小为 1G

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

验证

  • 显示 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)

其它资源

  • 系统中 lvcreate (8)lvmraid (7) 手册页

67.7.5. 使用 storage RHEL 系统角色配置带有 RAID 的 LVM 池

使用 storage 系统角色,您可以使用 Red Hat Ansible Automation Platform 在 RHEL 上配置带有 RAID 的 LVM 池。您可以使用可用参数建立一个 Ansible playbook,来配置带有 RAID 的 LVM 池。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Manage local storage
      hosts: managed-node-01.example.com
      tasks:
        - name: Configure LVM pool with RAID
          ansible.builtin.include_role:
            name: rhel-system-roles.storage
          vars:
            storage_safe_mode: false
            storage_pools:
              - name: my_pool
                type: lvm
                disks: [sdh, sdi]
                raid_level: raid1
                volumes:
                  - name: my_volume
                    size: "1 GiB"
                    mount_point: "/mnt/app/shared"
                    fs_type: xfs
                    state: present

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 验证您的池是否在 RAID 中:

    # ansible managed-node-01.example.com -m command -a 'lsblk'

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件
  • /usr/share/doc/rhel-system-roles/storage/ 目录
  • 管理 RAID

67.7.6. 创建 RAID0 条带化逻辑卷

RAID0 逻辑卷以条的大小为单位,将逻辑卷数据分散到多个数据子卷中。下面的步骤创建了一个名为 mylv 的 LVM RAID0 逻辑卷,该逻辑卷在磁盘间条状分布数据。

先决条件

  1. 您已创建了三个或者多个物理卷。有关创建物理卷的更多信息,请参阅 创建 LVM 物理卷
  2. 您已创建了卷组。如需更多信息,请参阅创建 LVM 卷组

流程

  1. 从现有卷组中创建 RAID0 逻辑卷。以下命令从卷组 myvg 中创建 RAID0 卷 mylv,大小为 2G,有三个条带,条带大小为 4kB

    # lvcreate --type raid0 -L 2G --stripes 3 --stripesize 4 -n mylv my_vg
      Rounding size 2.00 GiB (512 extents) up to stripe boundary size 2.00 GiB(513 extents).
      Logical volume "mylv" created.
  2. 在 RAID0 逻辑卷中创建文件系统。以下命令在逻辑卷中创建 ext4 文件系统:

    # mkfs.ext4 /dev/my_vg/mylv
  3. 挂载逻辑卷并报告文件系统磁盘空间使用情况:

    # mount /dev/my_vg/mylv /mnt
    
    # df
    Filesystem             1K-blocks     Used  Available  Use% Mounted on
    /dev/mapper/my_vg-mylv   2002684     6168  1875072    1%   /mnt

验证

  • 查看创建的 RAID0 剥离的逻辑卷:

    # lvs -a -o +devices,segtype my_vg
      LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices Type
      mylv my_vg rwi-a-r--- 2.00g mylv_rimage_0(0),mylv_rimage_1(0),mylv_rimage_2(0) raid0
      [mylv_rimage_0] my_vg iwi-aor--- 684.00m /dev/sdf1(0) linear
      [mylv_rimage_1] my_vg iwi-aor--- 684.00m /dev/sdg1(0) linear
      [mylv_rimage_2] my_vg iwi-aor--- 684.00m /dev/sdh1(0) linear

67.7.7. 使用 storage RHEL 系统角色为 RAID LVM 卷配置条带大小

使用 storage 系统角色,您可以使用 Red Hat Ansible Automation Platform 在 RHEL 上为 RAID LVM 卷配置条带大小。您可以使用可用参数建立一个 Ansible playbook,来配置带有 RAID 的 LVM 池。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Manage local storage
      hosts: managed-node-01.example.com
      tasks:
        - name: Configure stripe size for RAID LVM volumes
          ansible.builtin.include_role:
            name: rhel-system-roles.storage
          vars:
            storage_safe_mode: false
            storage_pools:
              - name: my_pool
                type: lvm
                disks: [sdh, sdi]
                volumes:
                  - name: my_volume
                    size: "1 GiB"
                    mount_point: "/mnt/app/shared"
                    fs_type: xfs
                    raid_level: raid0
                    raid_stripe_size: "256 KiB"
                    state: present

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 验证条带大小是否已设置为所需的大小:

    # ansible managed-node-01.example.com -m command -a 'lvs -o+stripesize /dev/my_pool/my_volume'

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件
  • /usr/share/doc/rhel-system-roles/storage/ 目录
  • 管理 RAID

67.7.8. 软数据崩溃

数据存储中的软崩溃意味着,从存储设备中检索的数据与写入到那个设备中的数据不同。错误的数据可以在存储设备中无限期存在。在检索并尝试使用此数据之前,您可能不会发现此损坏数据。

根据配置类型,一个独立磁盘的冗余阵列 (RAID) 逻辑卷 (LV) 可防止设备失败时数据丢失。如果由 RAID 阵列组成的设备失败,可以从 RAID LV 一部分的其他设备中恢复数据。但是 RAID 配置不能保证数据本身的完整性。软崩溃、静默崩溃、软错误和静默错误用来描述,即使系统和软件仍继续按预期工作,但数据已损坏的情况的术语。

当创建一个具有 DM 完整性或在现有 RAID LV 中添加完整性的 RAID LV 时,请考虑以下点:

  • 完整性元数据需要额外的存储空间。对于每个 RAID 镜像,每个 500MB 数据都需要 4MB 的额外存储空间,因为校验和被添加到数据中。
  • 添加 DM 完整性会因为访问数时延迟而影响到性能,有些 RAID 的配置会比其他 RAID 配置受到的影响更大。RAID1 配置通常比 RAID5 或其变体提供更好的性能。
  • RAID 完整性块的大小也会影响性能。配置更大的 RAID 完整块可提供更好的性能。但是,一个较小的 RAID 完整性块可以提供更好的兼容性。
  • 完整性有两种模式:位图(bitmap)日志(journal)bitmap 完整性模式通常比journal 模式提供更好的性能。
提示

如果您遇到性能问题,请使用带有完整性的 RAID1,或者测试特定 RAID 配置的性能以确保它满足您的要求。

67.7.9. 创建具有 DM 完整性的 RAID 逻辑卷

当您创建带有设备映射器(DM)完整性的 RAID LV 或者在现有 RAID 逻辑卷(LV)中添加完整性时,它会降低因为软崩溃而丢失数据的风险。在使用 LV 前,等待完整性同步和 RAID 元数据完成。否则,在后台进行的初始化可能会影响 LV 的性能。

设备映射程序(DM)完整性与 RAID 级别 1、4、5、6 和 10 一起使用,用于缓解或防止软崩溃导致数据丢失。RAID 层可确保数据没有破坏的副本可以修复软崩溃错误。

流程

  1. 创建具有 DM 完整性的 RAID LV。以下示例在 my_vg 卷组中创建一个名为 test-lv 的 RAID LV,可用大小为 256M 和 RAID 级别 1

    # lvcreate --type raid1 --raidintegrity y -L 256M -n test-lv my_vg
    Creating integrity metadata LV test-lv_rimage_0_imeta with size 8.00 MiB.
    Logical volume "test-lv_rimage_0_imeta" created.
    Creating integrity metadata LV test-lv_rimage_1_imeta with size 8.00 MiB.
    Logical volume "test-lv_rimage_1_imeta" created.
    Logical volume "test-lv" created.
    注意

    要在现有 RAID LV 中添加 DM 完整性,请使用以下命令:

    # lvconvert --raidintegrity y my_vg/test-lv

    在 RAID LV 中添加完整性限制了您可以在那个 RAID LV 上执行的一些操作。

  2. 可选:在执行某些操作前删除完整性。

    # lvconvert --raidintegrity n my_vg/test-lv
    Logical volume my_vg/test-lv has removed integrity.

验证

  • 查看有关添加的 DM 完整性的信息:

    • 查看在 my_vg 卷组中创建的 test-lv RAID LV 的信息:

      # lvs -a my_vg
        LV                        VG      Attr       LSize   Origin                 Cpy%Sync
        test-lv                   my_vg rwi-a-r--- 256.00m                          2.10
        [test-lv_rimage_0]        my_vg gwi-aor--- 256.00m [test-lv_rimage_0_iorig] 93.75
        [test-lv_rimage_0_imeta]  my_vg ewi-ao----   8.00m
        [test-lv_rimage_0_iorig]  my_vg -wi-ao---- 256.00m
        [test-lv_rimage_1]        my_vg gwi-aor--- 256.00m [test-lv_rimage_1_iorig] 85.94
       [...]

      下面描述了此输出的不同选项:

      g 属性
      它是 Attr 列下的属性列表,表示 RAID 镜像使用完整性。完整性将校验和存储在 _imeta RAID LV 中。
      Cpy%Sync
      它指示顶层 RAID LV 和每个 RAID 镜像的同步进度。
      RAID 镜像
      它通过 raid_image_N 在 LV 列中指示。
      LV
      它确保对顶层 RAID LV 和每个 RAID 镜像显示 100% 同步进度。
    • 显示每个 RAID LV 的类型:

      # lvs -a my-vg -o+segtype
        LV                       VG      Attr       LSize   Origin                 Cpy%Sync Type
        test-lv                  my_vg rwi-a-r--- 256.00m                          87.96    raid1
        [test-lv_rimage_0]       my_vg gwi-aor--- 256.00m [test-lv_rimage_0_iorig] 100.00   integrity
        [test-lv_rimage_0_imeta] my_vg ewi-ao----   8.00m                                   linear
        [test-lv_rimage_0_iorig] my_vg -wi-ao---- 256.00m                                   linear
        [test-lv_rimage_1]       my_vg gwi-aor--- 256.00m [test-lv_rimage_1_iorig] 100.00   integrity
       [...]
    • 有一个增量的计数器,它计算在每个 RAID 镜像上检测到的不匹配数。查看 my_vg/test-lv 下的 rimage_0 检测到的数据不匹配:

      # lvs -o+integritymismatches my_vg/test-lv_rimage_0
        LV                 VG      Attr       LSize   Origin                    Cpy%Sync IntegMismatches
        [test-lv_rimage_0] my_vg gwi-aor--- 256.00m [test-lv_rimage_0_iorig]    100.00                 0

      在这个示例中,完整性还没有检测到任何不匹配的数据,因此 IntegMismatches 计数器会显示 0 (0)。

    • 查看 /var/log/messages 日志文件中的数据完整性信息,如下例所示:

      例 67.1. 内核消息日志中的 dm-integrity 不匹配示例

      device-mapper: integrity: dm-12:校验和在扇区 0x24e7 时失败

      例 67.2. 来自内核消息日志的 dm-integrity 数据更正示例

      md/raid1:mdX: 读取错误修正(8 扇区位在 dm-16 上 的 9448)

其它资源

  • 系统中 lvcreate (8)lvmraid (7) 手册页

67.7.10. 将 RAID 逻辑卷转换为另一个 RAID 级别

LVM 支持 RAID 接管,这意味着将 RAID 逻辑卷从一个 RAID 级别转换为另一个 RAID 级别,例如从 RAID 5 转换到 RAID 6。您可以更改 RAID 级别,以增加或减少设备故障的恢复能力。

流程

  1. 创建 RAID 逻辑卷:

    # lvcreate --type raid5 -i 3 -L 500M -n my_lv my_vg
    Using default stripesize 64.00 KiB.
    Rounding size 500.00 MiB (125 extents) up to stripe boundary size 504.00 MiB (126 extents).
    Logical volume "my_lv" created.
  2. 查看 RAID 逻辑卷:

    # lvs -a -o +devices,segtype
      LV               VG            Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Devices                                                                 Type
      my_lv            my_vg         rwi-a-r--- 504.00m                                    100.00           my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0),my_lv_rimage_3(0) raid5
      [my_lv_rimage_0] my_vg         iwi-aor--- 168.00m                                                     /dev/sda(1)                                                             linear
  3. 将 RAID 逻辑卷转换为另一个 RAID 级别:

    # lvconvert --type raid6 my_vg/my_lv
    Using default stripesize 64.00 KiB.
    Replaced LV type raid6 (same as raid6_zr) with possible type raid6_ls_6.
    Repeat this command to convert to raid6 after an interim conversion has finished.
    Are you sure you want to convert raid5 LV my_vg/my_lv to raid6_ls_6 type? [y/n]: y
    Logical volume my_vg/my_lv successfully converted.
  4. 可选:如果这个命令提示重复转换,请运行:

    # lvconvert --type raid6 my_vg/my_lv

验证

  1. 查看具有转换的 RAID 级别的 RAID 逻辑卷:

    # lvs -a -o +devices,segtype
      LV               VG            Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Devices                                                                                   Type
      my_lv            my_vg         rwi-a-r--- 504.00m                                    100.00           my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0),my_lv_rimage_3(0),my_lv_rimage_4(0) raid6
      [my_lv_rimage_0] my_vg         iwi-aor--- 172.00m                                                     /dev/sda(1)                                                                               linear

其它资源

  • 系统中 lvconvert (8)lvmraid (8) 手册页

67.7.11. 将线性设备转换为 RAID 逻辑卷

您可以将现有的线性逻辑卷转换为 RAID 逻辑卷。要执行此操作,请使用 lvconvert 命令的 --type 参数。

RAID 逻辑卷由元数据和数据子卷对组成。当您将线性设备转换为 RAID1 阵列时,它会创建一个新的元数据子卷,并将其与线性卷所在的同一物理卷中的原始逻辑卷相关联。其他镜像添加到 metadata/data 子卷对中。如果无法将与原始逻辑卷配对的元数据镜像放在同一个物理卷上,则 lvconvert 将失败。

流程

  1. 查看需要转换的逻辑卷设备:

    # lvs -a -o name,copy_percent,devices my_vg
      LV     Copy%  Devices
      my_lv         /dev/sde1(0)
  2. 将线性逻辑卷转换为 RAID 设备。以下命令将卷组 __my_vg 中的线性逻辑卷 my_lv 转换为双向 RAID1 阵列:

    # lvconvert --type raid1 -m 1 my_vg/my_lv
      Are you sure you want to convert linear LV my_vg/my_lv to raid1 with 2 images enhancing resilience? [y/n]: y
      Logical volume my_vg/my_lv successfully converted.

验证

  • 确定逻辑卷是否转换为 RAID 设备:

    # 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 (8) 手册页

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

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

流程

  1. 显示现有 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)
  2. 将现有的 RAID1 LVM 逻辑卷转换为 LVM 线性逻辑卷。以下命令将 LVM RAID1 逻辑卷 my_vg/my_lv 转换为 LVM 线性设备:

    # lvconvert -m0 my_vg/my_lv
      Are you sure you want to convert raid1 LV my_vg/my_lv to type linear losing all resilience? [y/n]: y
      Logical volume my_vg/my_lv successfully converted.

    当您将 LVM RAID1 逻辑卷转换成 LVM 线性卷,,您可以指定要删除的物理卷。在以下示例中,lvconvert 命令指定要删除 /dev/sde1,保留 /dev/sdf1 作为组成线性设备的物理卷:

    # lvconvert -m0 my_vg/my_lv /dev/sde1

验证

  • 验证 RAID1 逻辑卷是否转换为 LVM 线性设备:

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

其它资源

  • 系统上的 lvconvert (8) 手册页

67.7.13. 将镜像 LVM 设备转换为 RAID1 逻辑卷

您可以将片段类型为 mirror 的现有镜像 LVM 设备转换为 RAID1 LVM 设备。要执行此操作,请使用带有 --type raid1 参数的 lvconvert 命令。这会将名为 mimage 的镜像子卷重命名为名为 rimage 的 RAID 子卷。

另外,它还会删除镜像日志,并为同一物理卷上的数据子卷创建名为 rmeta 的元数据子卷,来作为响应的数据子卷。

流程

  1. 查看镜像逻辑卷 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)
  2. 将镜像逻辑卷 my_vg/my_lv 转换为 RAID1 逻辑卷:

    # lvconvert --type raid1 my_vg/my_lv
    Are you sure you want to convert mirror LV my_vg/my_lv to raid1 type? [y/n]: y
    Logical volume my_vg/my_lv successfully converted.

验证

  • 验证镜像逻辑卷是否转换为 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(0)
      [my_lv_rimage_1]        /dev/sdf1(0)
      [my_lv_rmeta_0]         /dev/sde1(125)
      [my_lv_rmeta_1]         /dev/sdf1(125)

其它资源

  • 系统上的 lvconvert (8) 手册页

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

您可以更改现有 RAID1 阵列中的镜像数量,类似于更改 LVM 镜像实现中的镜像数量。

当您使用 lvconvert 命令将镜像添加到 RAID1 逻辑卷时,您可以执行以下操作:

  • 指定生成的设备的镜像总数,
  • 要添加到该设备的镜像数量,以及
  • 可以指定新元数据/数据镜像对所在的物理卷。

流程

  1. 显示 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)

    元数据子卷(名为 rmeta)始终与它们的数据子卷 rimage 存在于同一物理设备上。元数据/数据子卷对不会与 RAID 阵列中另一元数据/数据子卷对创建在同一物理卷上(除非您指定了 --alloc anywhere)。

  2. 将双向 RAID1 逻辑卷 my_vg/my_lv 转换为三向 RAID1 逻辑卷:

    # lvconvert -m 2 my_vg/my_lv
    Are you sure you want to convert raid1 LV my_vg/my_lv to 3 images enhancing resilience? [y/n]: y
    Logical volume my_vg/my_lv successfully converted.

    以下是更改现有 RAID1 设备中的镜像数的几个示例:

    • 您还可以在 RAID 中添加镜像时要使用的物理卷。以下命令通过指定用于阵列的物理卷 /dev/sdd1 ,将双向 RAID1 逻辑卷 my_vg/my_lv 转换为三向 RAID1 逻辑卷:

      # lvconvert -m 2 my_vg/my_lv /dev/sdd1
    • 将三向 RAID1 逻辑卷转换成双向 RAID1 逻辑卷:

      # lvconvert -m1 my_vg/my_lv
      Are you sure you want to convert raid1 LV my_vg/my_lv to 2 images reducing resilience? [y/n]: y
      Logical volume my_vg/my_lv successfully converted.
    • 通过指定物理卷 /dev/sde1,其中包含要删除的镜像,将三向 RAID1 逻辑卷转换成双向 RAID1 逻辑卷:

      # lvconvert -m1 my_vg/my_lv /dev/sde1

      另外,当您删除镜像及其关联的元数据子卷时,任何高数字镜像都会被切换以填充插槽。如果您从包含 lv_rimage_0lv_rimage_1lv_rimage_2 的三向 RAID1 阵列中删除lv_rimage_1,则会产生一个由lv_rimage_0lv_rimage_1 组成的 RAID1 阵列。lv_rimage_2 将会被重命名,并接管空插槽,成为 lv_rimage_1

验证

  • 在更改现有 RAID1 设备中的镜像数后查看 RAID1 设备:

    # lvs -a -o name,copy_percent,devices my_vg
      LV Cpy%Sync 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/sdd1(1)
      [my_lv_rimage_1] /dev/sde1(1)
      [my_lv_rimage_2] /dev/sdf1(1)
      [my_lv_rmeta_0] /dev/sdd1(0)
      [my_lv_rmeta_1] /dev/sde1(0)
      [my_lv_rmeta_2] /dev/sdf1(0)

其它资源

  • 系统上的 lvconvert (8) 手册页

67.7.15. 将 RAID 镜像分离为一个独立的逻辑卷

您可以分离 RAID 逻辑卷的镜像形成新的逻辑卷。和您从现有 RAID1 逻辑卷中删除 RAID 镜像一样,当您从设备的中间部分删除 RAID 数据子卷(及其关联的元数据子卷)时,会使用数字高的镜像来填充空的位置。因此,构成 RAID 阵列的逻辑卷上的索引号将是一个完整的整数序列。

注意

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

流程

  1. 显示 LVM 设备 my_vg/my_lv,它是一个双向 RAID1 阵列:

    # 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)
  2. 将 RAID 镜像分成一个单独的逻辑卷:

    • 以下示例将一个双向 RAID1 逻辑卷 my_lv 分成两个线性逻辑卷 my_lvnew

      # lvconvert --splitmirror 1 -n new my_vg/my_lv
      Are you sure you want to split raid1 LV my_vg/my_lv losing all resilience? [y/n]: y
    • 以下示例将一个三向 RAID1 逻辑卷 my_lv 分成一个双向 RAID1 逻辑卷 my_lv 以及一个线性逻辑卷 new

      # lvconvert --splitmirror 1 -n new my_vg/my_lv

验证

  • 在分离 RAID 逻辑卷的镜像后查看逻辑卷:

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

其它资源

  • 系统上的 lvconvert (8) 手册页

67.7.16. 分割和合并 RAID 镜像

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

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

  • 创建的新卷为只读。
  • 不能调整新卷的大小。
  • 不能重命名剩余的数组。
  • 不能调整剩余的数组大小。
  • 您可以独立激活新卷和剩余的阵列。

您可以合并分离的镜像。当您合并镜像时,只有自镜像分割后更改的阵列部分会被重新同步。

流程

  1. 创建 RAID 逻辑卷:

    # lvcreate --type raid1 -m 2 -L 1G -n my_lv my_vg
      Logical volume "my_lv" created
  2. 可选:查看创建的 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/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)
  3. 从创建的 RAID 逻辑卷中分割镜像,并跟踪对剩余的阵列的更改:

    # 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
  4. 可选:在分割镜像后查看逻辑卷:

    # 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)
  5. 将卷合并回阵列中:

    # 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)

其它资源

  • 系统上的 lvconvert (8) 手册页

67.7.17. 将 RAID 失败策略设置为 allocate

您可以在 /etc/lvm/lvm.conf 文件中将 raid_fault_policy 字段设置为 allocate 参数。使用这个首选项,系统会尝试使用卷组中的备用设备替换失败的设备。如果没有备用设备,系统日志会包含此信息。

流程

  1. 查看 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/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)
  2. 如果 /dev/sdb 设备失败,请查看 RAID 逻辑卷:

    # lvs --all --options name,copy_percent,devices my_vg
    
      /dev/sdb: open failed: No such device or address
      Couldn't find device with uuid A4kRl2-vIzA-uyCb-cci7-bOod-H5tX-IzH4Ee.
      WARNING: Couldn't find all devices for LV my_vg/my_lv_rimage_1 while checking used and assumed devices.
      WARNING: Couldn't find all devices for LV my_vg/my_lv_rmeta_1 while checking used and assumed devices.
      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]        [unknown](1)
      [my_lv_rimage_1]        /dev/sdc1(1)
      [...]

    如果 /dev/sdb 设备失败,您还可以查看系统日志中的错误消息。

  3. lvm.conf 文件中,将 raid_fault_policy 字段设置为 allocate

     # vi /etc/lvm/lvm.conf
     raid_fault_policy = "allocate"
    注意

    如果将 raid_fault_policy 设置为 allocate,但没有备用设备,则分配会失败,逻辑卷保留原样。如果分配失败,您可以使用 lvconvert --repair 命令修复和替换失败的设备。如需更多信息,请参阅 在逻辑卷中替换失败的 RAID 设备

验证

  • 验证失败的设备现在是否被卷组中的新设备替换了:

    # lvs -a -o name,copy_percent,devices my_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/sdc1(1)
      [lv_rimage_2]        /dev/sdd1(1)
      [lv_rmeta_0]         /dev/sdh1(0)
      [lv_rmeta_1]         /dev/sdc1(0)
      [lv_rmeta_2]         /dev/sdd1(0)
    注意

    即使失败的设备现在被替换了,但显示仍然表示 LVM 没有找到失败的设备,因为该设备还没有从卷组中删除。您可以通过执行 vgreduce --removemissing my_vg 命令从卷组中删除失败的设备。

其它资源

  • 在您的系统中的 lvm.conf (5) 手册页

67.7.18. 将 RAID 失败策略设置为 warn

您可以在lvm.conf 文件中将 raid_fault_policy 字段设置为 warn 参数。有了这个首选项,系统会在系统日志中添加了一条指示失败设备的警告。根据警告,您可以确定后续步骤。

默认情况下,lvm.confraid_fault_policy 字段的值是 warn

流程

  1. 查看 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/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)
  2. 在 lvm.conf 文件中将 raid_fault_policy 字段设置为 warn :

    # vi /etc/lvm/lvm.conf
     # This configuration option has an automatic default value.
     raid_fault_policy = "warn"
  3. 如果 /dev/sdb 设备失败,请查看系统日志以显示错误消息:

    # grep lvm /var/log/messages
    
    Apr 14 18:48:59 virt-506 kernel: sd 25:0:0:0: rejecting I/O to offline device
    Apr 14 18:48:59 virt-506 kernel: I/O error, dev sdb, sector 8200 op 0x1:(WRITE) flags 0x20800 phys_seg 0 prio class 2
    [...]
    Apr 14 18:48:59 virt-506 dmeventd[91060]: WARNING: VG my_vg is missing PV 9R2TVV-bwfn-Bdyj-Gucu-1p4F-qJ2Q-82kCAF (last written to /dev/sdb).
    Apr 14 18:48:59 virt-506 dmeventd[91060]: WARNING: Couldn't find device with uuid 9R2TVV-bwfn-Bdyj-Gucu-1p4F-qJ2Q-82kCAF.
    Apr 14 18:48:59 virt-506 dmeventd[91060]: Use 'lvconvert --repair my_vg/ly_lv' to replace failed device.

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

其它资源

  • 在您的系统中的 lvm.conf (5) 手册页

67.7.19. 替换正常工作的 RAID 设备

您可以使用 lvconvert 命令的 --replace 参数替换逻辑卷中正常工作的 RAID 设备。

警告

如果 RAID 设备失败,以下命令无法工作。

先决条件

  • RAID 设备没有失败。

流程

  1. 创建 RAID1 阵列:

    # lvcreate --type raid1 -m 2 -L 1G -n my_lv my_vg
      Logical volume "my_lv" created
  2. 检查创建的 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_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)
  3. 根据您的要求,使用以下任一方法替换 RAID 设备:

    1. 通过指定要替换的物理卷来替换 RAID1 设备:

      # lvconvert --replace /dev/sdb2 my_vg/my_lv
    2. 通过指定要用于替换的物理卷来替换 RAID1 设备:

      # lvconvert --replace /dev/sdb1 my_vg/my_lv /dev/sdd1
    3. 通过指定多个 replace 参数来一次替换多个 RAID 设备:

      # lvconvert --replace /dev/sdb1 --replace /dev/sdc1 my_vg/my_lv

验证

  1. 在指定要替换的物理卷后检查 RAID1 阵列:

    # 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)
  2. 在指定要用于替换的物理卷后检查 RAID1 阵列:

    # 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)
  3. 一次替换多个 RAID 设备后检查 RAID1 阵列:

    # 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 (8) 手册页

67.7.20. 在逻辑卷中替换失败的 RAID 设备

RAID 与传统的 LVM 镜像不同。如果是 LVM 镜像,请删除失败的设备。否则,当 RAID 阵列继续使用失败的设备运行时,镜像逻辑卷将挂起。对于 RAID1 以外的 RAID 级别,删除设备意味着转换到较低 RAID 级别,例如从 RAID6 转换到 RAID5,或者从 RAID4 或 RAID5 转换到 RAID0。

您可以使用 lvconvert 命令的 --repair 参数替换 RAID 逻辑卷中作为物理卷的故障设备,而不是删除失败的设备并分配一个替换品。

先决条件

  • 卷组包含一个物理卷,它有足够的可用容量替换失败的设备。

    如果卷组中没有有足够可用扩展的物理卷,请使用 vgextend 程序添加一个新的、足够大的物理卷。

流程

  1. 查看 RAID 逻辑卷:

    # lvs --all --options name,copy_percent,devices my_vg
      LV               Cpy%Sync 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/sdc1(1)
      [my_lv_rimage_2]          /dev/sdd1(1)
      [my_lv_rmeta_0]           /dev/sde1(0)
      [my_lv_rmeta_1]           /dev/sdc1(0)
      [my_lv_rmeta_2]           /dev/sdd1(0)
  2. /dev/sdc 设备失败后查看 RAID 逻辑卷:

    # lvs --all --options name,copy_percent,devices my_vg
      /dev/sdc: open failed: No such device or address
      Couldn't find device with uuid A4kRl2-vIzA-uyCb-cci7-bOod-H5tX-IzH4Ee.
      WARNING: Couldn't find all devices for LV my_vg/my_lv_rimage_1 while checking used and assumed devices.
      WARNING: Couldn't find all devices for LV my_vg/my_lv_rmeta_1 while checking used and assumed devices.
      LV               Cpy%Sync 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]          [unknown](1)
      [my_lv_rimage_2]          /dev/sdd1(1)
      [my_lv_rmeta_0]           /dev/sde1(0)
      [my_lv_rmeta_1]           [unknown](0)
      [my_lv_rmeta_2]           /dev/sdd1(0)
  3. 替换失败的设备:

    # lvconvert --repair my_vg/my_lv
      /dev/sdc: open failed: No such device or address
      Couldn't find device with uuid A4kRl2-vIzA-uyCb-cci7-bOod-H5tX-IzH4Ee.
      WARNING: Couldn't find all devices for LV my_vg/my_lv_rimage_1 while checking used and assumed devices.
      WARNING: Couldn't find all devices for LV my_vg/my_lv_rmeta_1 while checking used and assumed devices.
    Attempt to replace failed RAID images (requires full device resync)? [y/n]: y
    Faulty devices in my_vg/my_lv successfully replaced.
  4. 可选:手动指定替换失败设备的物理卷:

    # lvconvert --repair my_vg/my_lv replacement_pv
  5. 使用替换检查逻辑卷:

    # lvs --all --options name,copy_percent,devices my_vg
    
      /dev/sdc: open failed: No such device or address
      /dev/sdc1: open failed: No such device or address
      Couldn't find device with uuid A4kRl2-vIzA-uyCb-cci7-bOod-H5tX-IzH4Ee.
      LV               Cpy%Sync Devices
      my_lv            43.79    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/sdb1(1)
      [my_lv_rimage_2]          /dev/sdd1(1)
      [my_lv_rmeta_0]           /dev/sde1(0)
      [my_lv_rmeta_1]           /dev/sdb1(0)
      [my_lv_rmeta_2]           /dev/sdd1(0)

    在您从卷组中删除失败的设备前,LVM 工具仍然指示 LVM 无法找到失败的设备。

  6. 从卷组中删除失败的设备:

    # vgreduce --removemissing my_vg

验证

  1. 删除失败的设备后查看可用的物理卷:

    # pvscan
    PV /dev/sde1 VG rhel_virt-506 lvm2 [<7.00 GiB / 0 free]
    PV /dev/sdb1 VG my_vg lvm2 [<60.00 GiB / 59.50 GiB free]
    PV /dev/sdd1 VG my_vg lvm2 [<60.00 GiB / 59.50 GiB free]
    PV /dev/sdd1 VG my_vg lvm2 [<60.00 GiB / 59.50 GiB free]
  2. 替换失败的设备后检查逻辑卷:

    # lvs --all --options name,copy_percent,devices my_vg
    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/sdb1(1)
      [my_lv_rimage_2]          /dev/sdd1(1)
      [my_lv_rmeta_0]           /dev/sde1(0)
      [my_lv_rmeta_1]           /dev/sdb1(0)
      [my_lv_rmeta_2]           /dev/sdd1(0)

其它资源

  • 系统中 lvconvert (8)vgreduce (8) 手册页

67.7.21. 检查 RAID 逻辑卷中数据的一致性

LVM 提供对 RAID 逻辑卷的清理支持。RAID 清理是读取阵列中的所有数据和奇偶校验块的过程,并检查它们是否是分配的。lvchange --syncaction repair 命令对阵列启动后台同步操作。

流程

  1. 可选:通过设置以下选项之一来控制 RAID 逻辑卷初始化的速度:

    • --maxrecoveryrate Rate[bBsSkKmMgG] 为 RAID 逻辑卷设置最大恢复率,使其不会加快 I/O 操作。
    • --minrecoveryrate Rate[bBsSkKmMgG] 设置 RAID 逻辑卷的最小恢复率,以确保 sync 操作的 I/O 达到最小吞吐量,即使存在大量小 I/O

      # lvchange --maxrecoveryrate 4K my_vg/my_lv
      Logical volume _my_vg/my_lv_changed.

      使用恢复率值替换 4K,它是阵列中每个设备的每秒数量。如果没有后缀,选项会假定为 kiB/每秒/每个设备。

      # lvchange --syncaction repair my_vg/my_lv

      当您执行 RAID 清理操作时,sync 操作所需的后台 I/O 可能会排挤 LVM 设备的其它 I/O,如对卷组元数据的更新。这可能导致其它 LVM 操作速度下降。

      注意

      您还可以在创建 RAID 设备时使用这些最大值和最小 I/O 速率。例如,lvcreate --type raid10 -i 2 -m 1 -L 10G --maxrecoveryrate 128 -n my_lv my_vg 创建一个双向 RAID10 阵列 my_lv,它位于卷组 my_vg 中,其大小为 10G,最大恢复率为 128 kiB/sec/device。

  2. 显示阵列中未修复的差异的数量,没有修复它们:

    # lvchange --syncaction check my_vg/my_lv

    此命令对阵列启动后台同步操作。

  3. 可选:查看 var/log/syslog 文件以了解内核消息。
  4. 修正阵列中的差异:

    # lvchange --syncaction repair my_vg/my_lv

    这个命令修复或者替换 RAID 逻辑卷中失败的设备。您可以在执行此命令后,在 var/log/syslog 文件查看内核消息。

验证

  1. 显示有关清理操作的信息:

    # lvs -o +raid_sync_action,raid_mismatch_count my_vg/my_lv
    LV    VG    Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert SyncAction Mismatches
    my_lv my_vg rwi-a-r--- 500.00m                                    100.00           idle        0

其它资源

67.7.22. RAID1 逻辑卷上的 I/O 操作

您可以使用 lvchange 命令的 --writemostly--writebehind 参数来控制对 RAID1 逻辑卷中设备的 I/O 操作。以下是使用这些参数的格式:

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

将 RAID1 逻辑卷中的一个设备标记为 write-mostly,并避免对这些驱动器的所有读操作(除非有必要)。设置此参数会使驱动器中的 I/O 操作数量保持最小。

使用 lvchange --writemostly /dev/sdb my_vg/my_lv 命令来设置此参数。

您可以使用以下方法设置 writemostly 属性:

:y
默认情况下,对于逻辑卷中指定的物理卷,writemostly 属性的值是 yes。
:n
要删除 writemostly 标志,请将 :n 附加到物理卷上。
:t

要切换 writemostly 属性的值,请指定 --writemostly 参数。

您可以在单个命令中多次使用此参数,例如 lvchange --writemostly /dev/sdd1:n --writemostly /dev/sdb1:t --writemostly /dev/sdc1:y my_vg/my_lv。因此,可以一次为逻辑卷中的 所有物理卷切换写 属性。

--[raid]writebehind IOCount

将待处理写的最大数量标记为 writemostly。这些是适用于 RAID1 逻辑卷中设备的写操作的数量。超过这个参数值后,在 RAID 阵列通知所有写操作完成前,对组成设备的所有写操作都会同步完成。

您可以使用 lvchange --writebehind 100 my_vg/my_lv命令来 设置此参数。将 writemostly 属性的值设置为零来清除首选项。使用这个设置,系统可以任意选择值。

67.7.23. 重塑 RAID 卷

RAID 重塑意味着在不更改 RAID 级别的情况下更改 RAID 逻辑卷的属性。您可以更改的一些属性包括 RAID 布局、条带大小和条带数目。

流程

  1. 创建 RAID 逻辑卷:

    # lvcreate --type raid5 -i 2 -L 500M -n my_lv my_vg
    
    Using default stripesize 64.00 KiB.
    Rounding size 500.00 MiB (125 extents) up to stripe boundary size 504.00 MiB (126 extents).
    Logical volume "my_lv" created.
  2. 查看 RAID 逻辑卷:

    # lvs -a -o +devices
    
    LV               VG    Attr       LSize   Pool   Origin Data% Meta% Move Log Cpy%Sync Convert Devices
    my_lv            my_vg rwi-a-r--- 504.00m                                    100.00            my_lv_rimage_0(0),my_lv_rimage_1(0),my_lv_rimage_2(0)
    [my_lv_rimage_0] my_vg iwi-aor--- 252.00m                                                      /dev/sda(1)
    [my_lv_rimage_1] my_vg iwi-aor--- 252.00m                                                      /dev/sdb(1)
    [my_lv_rimage_2] my_vg iwi-aor--- 252.00m                                                      /dev/sdc(1)
    [my_lv_rmeta_0]  my_vg ewi-aor---   4.00m                                                      /dev/sda(0)
    [my_lv_rmeta_1]  my_vg ewi-aor---   4.00m                                                      /dev/sdb(0)
    [my_lv_rmeta_2]  my_vg ewi-aor---   4.00m                                                      /dev/sdc(0)
  3. 可选:查看 RAID 逻辑卷的 stripes 镜像和 stripesize

    # lvs -o stripes my_vg/my_lv
      #Str
         3
    # lvs -o stripesize my_vg/my_lv
      Stripe
      64.00k
  4. 根据您的要求,使用以下方法修改 RAID 逻辑卷的属性:

    1. 修改 RAID 逻辑卷的 stripes 镜像:

      # lvconvert --stripes 3 my_vg/my_lv
      Using default stripesize 64.00 KiB.
      WARNING: Adding stripes to active logical volume my_vg/my_lv will grow it from 126 to 189 extents!
      Run "lvresize -l126 my_vg/my_lv" to shrink it or use the additional capacity.
      Are you sure you want to add 1 images to raid5 LV my_vg/my_lv? [y/n]: y
      Logical volume my_vg/my_lv successfully converted.
    2. 修改 RAID 逻辑卷的 stripesize

      # lvconvert --stripesize 128k my_vg/my_lv
        Converting stripesize 64.00 KiB of raid5 LV my_vg/my_lv to 128.00 KiB.
      Are you sure you want to convert raid5 LV my_vg/my_lv? [y/n]: y
        Logical volume my_vg/my_lv successfully converted.
    3. 修改 maxrecoveryrateminrecoveryrate 属性:

      # lvchange --maxrecoveryrate 4M my_vg/my_lv
        Logical volume my_vg/my_lv changed.
      # lvchange --minrecoveryrate 1M my_vg/my_lv
        Logical volume my_vg/my_lv changed.
    4. 修改 syncaction 属性:

      # lvchange --syncaction check my_vg/my_lv
    5. 修改 writemostlywritebehind 属性:

      # lvchange --writemostly /dev/sdb my_vg/my_lv
        Logical volume my_vg/my_lv changed.
      # lvchange --writebehind 100 my_vg/my_lv
        Logical volume my_vg/my_lv changed.

验证

  1. 查看 RAID 逻辑卷的 stripes 镜像和 stripesize

    # lvs -o stripes my_vg/my_lv
      #Str
         4
    # lvs -o stripesize my_vg/my_lv
      Stripe
      128.00k
  2. 修改 maxrecoveryrate 属性后,查看 RAID 逻辑卷:

    # lvs -a -o +raid_max_recovery_rate
      LV               VG       Attr        LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert MaxSync
      my_lv            my_vg    rwi-a-r---  10.00g                                     100.00           4096
      [my_lv_rimage_0] my_vg    iwi-aor---  10.00g
     [...]
  3. 修改 minrecoveryrate 属性后,查看 RAID 逻辑卷:

    # lvs -a -o +raid_min_recovery_rate
      LV               VG     Attr        LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert MinSync
      my_lv            my_vg  rwi-a-r---  10.00g                                     100.00           1024
      [my_lv_rimage_0] my_vg  iwi-aor---  10.00g
      [...]
  4. 修改 syncaction 属性后,查看 RAID 逻辑卷:

    # lvs -a
      LV               VG      Attr        LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
      my_lv            my_vg   rwi-a-r---  10.00g                                     2.66
      [my_lv_rimage_0] my_vg   iwi-aor---  10.00g
      [...]

其它资源

  • 系统中 lvconvert (8)lvmraid (8) 手册页

67.7.24. 在 RAID 逻辑卷中更改区域大小

当您创建 RAID 逻辑卷时,/etc/lvm/lvm.conf 文件中的 raid_region_size 参数代表 RAID 逻辑卷的区域大小。创建 RAID 逻辑卷后,您可以更改卷的区域大小。此参数定义跟踪脏或干净状态的粒度。位图中的脏位定义 RAID 卷脏关闭(例如系统故障)后要同步的工作集。

如果将 raid_region_size 设置为更高的值,它会减小位图的大小以及拥塞。但它会影响重新同步区域期间的 write 操作,因为写入 RAID 会延迟,直到同步区域完成为止。

流程

  1. 创建 RAID 逻辑卷:

    # lvcreate --type raid1 -m 1 -L 10G test
      Logical volume "lvol0" created.
  2. 查看 RAID 逻辑卷:

    # lvs -a -o +devices,region_size
    
    LV                VG      Attr     LSize Pool Origin Data% Meta% Move Log   Cpy%Sync Convert Devices                              Region
    lvol0             test rwi-a-r--- 10.00g                                    100.00           lvol0_rimage_0(0),lvol0_rimage_1(0)  2.00m
    [lvol0_rimage_0]  test iwi-aor--- 10.00g                                                     /dev/sde1(1)                            0
    [lvol0_rimage_1]  test iwi-aor--- 10.00g                                                     /dev/sdf1(1)                            0
    [lvol0_rmeta_0]   test ewi-aor---  4.00m                                                     /dev/sde1(0)                            0
    [lvol0_rmeta_1]   test ewi-aor---  4.00m

    Region 列显示 raid_region_size 参数的值。

  3. 可选:查看 raid_region_size 参数的值:

    # cat /etc/lvm/lvm.conf | grep raid_region_size
    
    # Configuration option activation/raid_region_size.
    	# raid_region_size = 2048
  4. 更改 RAID 逻辑卷的区域大小:

    # lvconvert -R 4096K my_vg/my_lv
    
    Do you really want to change the region_size 512.00 KiB of LV my_vg/my_lv to 4.00 MiB? [y/n]: y
      Changed region size on RAID LV my_vg/my_lv to 4.00 MiB.
  5. 重新同步 RAID 逻辑卷:

    # lvchange --resync my_vg/my_lv
    
    Do you really want to deactivate logical volume my_vg/my_lv to resync it? [y/n]: y

验证

  1. 查看 RAID 逻辑卷:

    # lvs -a -o +devices,region_size
    
    LV               VG   Attr        LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices                              Region
    lvol0            test rwi-a-r--- 10.00g                                    6.25           lvol0_rimage_0(0),lvol0_rimage_1(0)  4.00m
    [lvol0_rimage_0] test iwi-aor--- 10.00g                                                   /dev/sde1(1)                            0
    [lvol0_rimage_1] test iwi-aor--- 10.00g                                                   /dev/sdf1(1)                            0
    [lvol0_rmeta_0]  test ewi-aor---  4.00m                                                   /dev/sde1(0)                            0

    Region 列表示 raid_region_size 参数的更改值。

  2. 查看 lvm.conf 文件中 raid_region_size 参数的值:

    # cat /etc/lvm/lvm.conf | grep raid_region_size
    
    # Configuration option activation/raid_region_size.
    	# raid_region_size = 4096

其它资源

  • 系统上的 lvconvert (8) 手册页
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.