注意:

在 Oracle Linux 上配置 RAID 逻辑卷

简介

LVM RAID 是创建逻辑卷 (Logical Volume, LV) 的一种方式,它使用多个物理设备来提高性能或容许设备故障。在 LVM 中,物理设备是单个卷组 (VG) 中的物理卷 (Physical Volumes, PV)。

本教程将与 Oracle Linux Volume Manager 实用程序结合使用来创建 RAID 逻辑卷,然后解决磁盘故障。

目标

先决条件

具有以下配置的任何 Oracle Linux 8 系统:

设置实验室环境

注意:使用免费实验室环境时,请参见 Oracle Linux Lab Basics 了解连接和其他使用说明。

  1. 如果尚未连接,请打开一个终端并通过 ssh 连接到上述每个实例。

    ssh oracle@<ip_address_of_instance>
    
  2. 验证块存储卷是否存在。

    sudo lsblk
    

    空闲实验环境的输出应显示现有文件系统的 /dev/sda 以及可用磁盘 /dev/sdb/dev/sdc/dev/sdd/dev/sde。另外还有两个磁盘(/dev/sdf/dev/sdg),稍后我们将使用。

物理卷 (PV)

  1. 使用可用磁盘创建物理卷 (physical volume, PV)。

    sudo pvcreate -v /dev/sd[b-e]
    

    使用 -v 选项运行命令以获取详细信息。

  2. 验证 PV 创建。

    sudo pvs
    

    输出示例:

    [oracle@ol-node01 ~]$ sudo pvs
      PV         VG        Fmt  Attr PSize  PFree 
      /dev/sda3  ocivolume lvm2 a--  45.47g     0 
      /dev/sdb             lvm2 ---  50.00g 50.00g
      /dev/sdc             lvm2 ---  50.00g 50.00g
      /dev/sdd             lvm2 ---  50.00g 50.00g
      /dev/sde             lvm2 ---  50.00g 50.00g
    

卷组 (VG)

  1. 使用新创建的物理卷创建卷组 (VG)。

    sudo vgcreate -v foo /dev/sd[b-e]
    
  2. 验证 VG 创建。

    sudo vgs
    

    输出示例:

    [oracle@ol-node01 ~]$ sudo vgs
      VG             #PV #LV #SN Attr   VSize   VFree  
      foo              4   0   0 wz--n- 199.98g 199.98g
      ocivolume        1   2   0 wz--n-  45.47g      0 
    

逻辑卷 (LV)

  1. 创建 RAID 逻辑卷 (logical volume, LV)。

    sudo lvcreate --type raid5 -i 3 -L 5G -n rr foo
    
    • --type:设置 RAID 级别。LVM 支持 RAID 级别 0、1、4、5、6 和 10。
    • -i:为 RAID 4/5/6 逻辑卷设置条带(设备)的数量 (n)。raid5 LV 需要 n+1 设备。
    • -L:RAID 阵列的总大小。
    • -n:RAID 阵列的名称。

    输出示例:

    [oracle@ol-node01 ~]$ sudo lvcreate --type raid5 -i 3 -L 5G -n rr foo
      Using default stripesize 64.00 KiB.
      Rounding size 5.00 GiB (1280 extents) up to stripe boundary size 5.00 GiB (1281 extents).
      Logical volume "rr" created.
    

    有关详细信息,请查看 lvmraid(7) 手册页。

  2. 验证 LV 创建。

    sudo lvdisplay foo
    

    输出显示 foo VG 中包含的所有逻辑卷。

    输出示例:

    [oracle@ol-node01 ~]$ sudo lvdisplay foo
      --- Logical volume ---
      LV Path                /dev/foo/rr
      LV Name                rr
      VG Name                foo
      LV UUID                vghyRi-nKGM-3b9t-tB1I-biJX-10h6-UJWvm2
      LV Write Access        read/write
      LV Creation host, time ol-node01, 2022-05-19 01:23:46 +0000
      LV Status              available
      # open                 0
      LV Size                5.00 GiB
      Current LE             1281
      Segments               1
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     1024
      Block device           252:10
    
  3. 显示 LV 类型。

    sudo lvs -o name,segtype foo/rr
    
    • lvs 命令可以采用完整的 LV 路径作为缩小结果范围的选项。

    输出示例:

    [oracle@ol-node01 ~]$ sudo lvs -o name,segtype /dev/foo/rr
      LV     Type 
      rr     raid5
    

创建文件系统

  1. 在 RAID LV 上创建 XFS 文件系统。

    sudo mkfs.xfs -f /dev/foo/rr
    
    • -f:强制覆盖现有文件系统。

    输出示例:

    [oracle@ol-node01 ~]$ sudo mkfs.xfs -f /dev/foo/rr
    meta-data=/dev/foo/rr            isize=512    agcount=8, agsize=163952 blks
             =                       sectsz=4096  attr=2, projid32bit=1
             =                       crc=1        finobt=1, sparse=1, rmapbt=0
             =                       reflink=1
    data     =                       bsize=4096   blocks=1311616, imaxpct=25
             =                       sunit=16     swidth=48 blks
    naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
    log      =internal log           bsize=4096   blocks=2560, version=2
             =                       sectsz=4096  sunit=1 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    

    注:XFS 文件系统在创建后无法减小其大小。但是,xfs_growfs 命令可以扩展该命令。

挂载 RAID LV

  1. 挂载文件系统。

    sudo mkdir -p /u01
    sudo mount /dev/foo/rr /u01
    
  2. 报告文件系统磁盘使用情况。

    df -h
    

    输出示例:

    [oracle@ol-node01 ~]$ df -h
    Filesystem                         Size  Used Avail Use% Mounted on
    ...
    /dev/mapper/foo-rr                 5.0G   69M  5.0G   2% /u01
    

调整 RAID LV 的大小

有多种方法可调整 RAID LV 的大小:

重要提示:收缩 LV 有风险,可能会导致数据丢失。在 LV 上运行 XFS 文件系统时,请避免收缩 LV,因为 XFS 不允许减少文件系统大小。

提高 RAID LV 容量

  1. 使用 VG 中的可用空闲空间,将 RAID LV 大小增加到 10G。

    sudo lvresize -L 10G foo/rr
    

    要将大小增加 10G,请改用选项 -L +10G

  2. 验证 LV 是否已增大到 10G。

    sudo lvs foo/rr
    

    LSize 应显示 10g。

  3. 增长文件系统。

    sudo xfs_growfs /u01
    
  4. 报告更新的文件系统磁盘使用情况。

    df -h
    
  5. 请先检查 RAID 同步状态,然后再继续。

    警告:由于 foo/rr 未处于同步状态,太快到下一步可能会显示错误。

    如果在调整上面的 RAID LV 大小后同步未完成,将出现此错误。

    使用 watch sudo lvs foo/rr 检查 RAID LV 并等待 Cpy%Sync 字段达到 100%。一旦 Cpy%Sync 达到 100%,请使用 ctrl-c 退出 watch 命令。

有关更多信息,请参见 lvresize(8)lvextend(8)lvreduce(8) 手册页。

增加 RAID LV 上的条带

更改 RAID LV 上的条带数量会增加总体容量,并且可以在 RAID4/5/6/10 上进行更改。每个额外的条带要求卷组中具有相同数量的未分配的物理卷(设备)。

  1. 检查 VG foo 中存在哪些物理卷 (physical volume, PV)。

    sudo pvs
    

    在输出 /dev/sdb/dev/sdc/dev/sdd/dev/sde 中,都与 VG foo 关联。

  2. 确定是否有任何未使用的物理卷。

    sudo pvdisplay -m /dev/sd[b-e]
    

    输出示例:

      --- Physical volume ---
      PV Name               /dev/sdb
      VG Name               foo
      PV Size               50.00 GiB / not usable 4.00 MiB
      Allocatable           yes 
      PE Size               4.00 MiB
      Total PE              12799
      Free PE               11944
      Allocated PE          855
      PV UUID               Q1uEMC-0zL1-dgrA-9rIT-1xrA-Vnfr-2E8tJT
       
      --- Physical Segments ---
      Physical extent 0 to 0:
        Logical volume	/dev/foo/rr_rmeta_0
        Logical extents	0 to 0
      Physical extent 1 to 854:
        Logical volume	/dev/foo/rr_rimage_0
        Logical extents	0 to 853
      Physical extent 855 to 12798:
        FREE
    ...
    

    -m 选项的 pvdisplay 命令显示物理区到逻辑卷和逻辑区的映射。示例输出中的 PV /dev/sdb 显示了与 RAID LV 关联的物理区。对于 /dev/sdc/dev/sdd/dev/sde,也应该出现这种情况。

  3. 向 VG 添加另一个 PV。

    由于现有 RAID LV 使用所有现有物理卷,请将 /dev/sdf 添加到 PV 镜像中。

    sudo vgextend foo /dev/sdf
    

    输出显示 vgextend 命令将 /dev/sdf 转换为 PV,然后再将其添加到 VG foo。

  4. 向 RAID LV 添加条带。

    sudo lvconvert --stripes 4 foo/rr
    

    使用 y 响应提示。

    输出示例:

    [oracle@ol-node01 ~]$ sudo lvconvert --stripes 4 foo/rr
      Using default stripesize 64.00 KiB.
      WARNING: Adding stripes to active and open logical volume foo/rr will grow it from 2562 to 3416 extents!
      Run "lvresize -l2562 foo/rr" to shrink it or use the additional capacity.
    Are you sure you want to add 1 images to raid5 LV foo/rr? [y/n]: y
      Logical volume foo/rr successfully converted.
    
  5. 验证 LV 新大小。

    sudo lvs foo/rr
    

    输出示例:

    [oracle@ol-node01 ~]$ sudo lvs foo/rr
      LV   VG  Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
      rr   foo rwi-aor--- 13.34g                                    2.24          
    

    容量 (LSize) 由 3.34g 增长,同步 (Cpy%Sync) 开始。同步是使 RAID LV 中的所有设备彼此一致的过程,在修改或更换 RAID LV 中的设备时,完全同步是必需的。

  6. 检查同步状态。

    运行检查,直到进度达到 100%。

    watch sudo lvs foo/rr
    

    一旦 Cpy%Sync 达到 100%,请使用 ctrl-c 退出 watch 命令。

    使用 watch 命令的其他方法包括:

    • 运行 watch -n 5 sudo lvs foo/rr 可刷新每 5 秒,而不刷新默认 2 秒。
    • 运行 timeout 60 watch -n 5 sudo lvs foo/rr 以在 60 秒后自动退出。
  7. 显示新的段范围和 PV,现在包括 /dev/sdf

    sudo lvs -a -o lv_name,attr,segtype,seg_pe_ranges,dataoffset foo
    

恢复 LV 中发生故障的 RAID 设备

RAID 阵列可以继续使用发生故障的设备运行。对于 RAID1 以外的 RAID 类型,删除设备意味着转换为较低级别的 RAID(在本例中为 RAID5 转换为 RAID0)。

LVM 允许在单个步骤中使用 lvconvert --repair 命令替换 RAID 卷中发生故障的设备,而不是移除发生故障的驱动器并可能添加更换。

  1. 检查当前的 RAID LV 布局。

    sudo lvs --all --options name,copy_percent,devices foo
    
  2. 模拟 /dev/sdd 上的故障。

    echo 1 | sudo tee /sys/block/sdd/device/delete
    
  3. 出现故障后,重新检查 RAID LV 布局。

    sudo lvs --all --options name,copy_percent,devices foo
    

    请注意 [unknown] 设备。

    输出示例:

    [oracle@ol-node01 ~]$ sudo lvs --all --options name,copy_percent,devices foo
      WARNING: Couldn't find device with uuid o1JwCl-DTpi-anww-rYt3-1LCq-vmLV-FQCKyc.
      WARNING: VG foo is missing PV o1JwCl-DTpi-anww-rYt3-1LCq-vmLV-FQCKyc (last written to /dev/sdd).
      LV            Cpy%Sync Devices                                                                   
      rr            100.00   rr_rimage_0(0),rr_rimage_1(0),rr_rimage_2(0),rr_rimage_3(0),rr_rimage_4(0)
      [rr_rimage_0]          /dev/sdb(855)                                                             
      [rr_rimage_0]          /dev/sdb(1)                                                               
      [rr_rimage_1]          /dev/sdc(855)                                                             
      [rr_rimage_1]          /dev/sdc(1)                                                               
      [rr_rimage_2]          [unknown](855)                                                            
      [rr_rimage_2]          [unknown](1)                                                              
      [rr_rimage_3]          /dev/sde(855)                                                             
      [rr_rimage_3]          /dev/sde(1)                                                               
      [rr_rimage_4]          /dev/sdf(855)                                                             
      [rr_rimage_4]          /dev/sdf(1)                                                               
      [rr_rmeta_0]           /dev/sdb(0)                                                               
      [rr_rmeta_1]           /dev/sdc(0)                                                               
      [rr_rmeta_2]           [unknown](0)                                                              
      [rr_rmeta_3]           /dev/sde(0)                                                               
      [rr_rmeta_4]           /dev/sdf(0)        
    
  4. 更换出现故障的设备。

    sudo lvconvert --repair foo/rr
    

    使用 y 响应提示。

    该命令无法找到要在 VG 中使用的可用空间或设备。

    输出示例:

    [oracle@ol-node01 ~]$ sudo lvconvert --repair foo/rr
      WARNING: Couldn't find device with uuid o1JwCl-DTpi-anww-rYt3-1LCq-vmLV-FQCKyc.
      WARNING: VG foo is missing PV o1JwCl-DTpi-anww-rYt3-1LCq-vmLV-FQCKyc (last written to /dev/sdd).
      WARNING: Couldn't find device with uuid o1JwCl-DTpi-anww-rYt3-1LCq-vmLV-FQCKyc.
    Attempt to replace failed RAID images (requires full device resync)? [y/n]: y
      Insufficient free space: 856 extents needed, but only 0 available
      Failed to replace faulty devices in foo/rr.
    

    警告:如果错误包含 "Unable to replace device in foo/r while it is in-sync" 消息,请通过运行 watch sudo lvs foo/rr 并确认 Cpy%Sync 为 100%,确认 RAID-LV 是同步的。然后重试 lvconvert 命令。

  5. 将设备 /dev/sdg 添加到 VG

    sudo vgextend foo /dev/sdg
    

    输出中的 WARNING 消息是由于仍缺少故障驱动器。

  6. 重试更换发生故障的驱动器。

    sudo lvconvert --repair foo/rr
    

    使用 y 再次响应提示。

    输出再次显示有关缺少的驱动器的 WARNING 消息,但是该命令成功替换了 VG 中的故障设备。

  7. 检查布局。

    sudo lvs --all --options name,copy_percent,devices foo
    

    请注意,/dev/sdg 替换了所有 [unknown] 设备条目。

  8. 从 VG 中移除发生故障的设备。

    LVM 实用程序将继续报告 LVM 在从 VG 中删除故障设备之前无法找到该设备。

    sudo vgreduce --removemissing foo
    

    输出中的 WARNING 消息是由于仍缺少故障驱动器。

  9. 请先检查 RAID 同步状态,然后再继续。

    警告:过快地继续到下一部分可能会显示以下错误消息:

    输出示例:

    [oracle@ol-node01 ~]$ sudo lvchange --syncaction check foo/rr
      foo/rr state is currently "recover".  Unable to switch to "check".
    

    如果在将条带添加到 RAID LV 之后同步未完成,将出现此错误。

    使用 watch sudo lvs foo/rr 检查 RAID LV 并等待 Cpy%Sync 字段达到 100%。

检查 RAID LV 中的数据一致性(清理)

LVM 为 RAID LV 提供清理功能,可读取数组中的所有数据和奇偶校验块并检查一致性。

  1. 在检查模式下启动清理。

    sudo lvchange --syncaction check foo/rr
    
  2. 显示清理操作的状态。

    watch sudo lvs -a -o name,raid_sync_action,sync_percent foo/rr
    

    输出示例:

    [oracle@ol-node01 ~]$ sudo lvs -a -o name,raid_sync_action,sync_percent foo/rr
      LV   SyncAction Cpy%Sync
      rr   check      30.08   
    
  3. 清理(同步)完成后,显示找到的不一致块的数量。

    sudo lvs -o +raid_sync_action,raid_mismatch_count foo/rr
    

    raid_sync_action 选项使用以下值之一显示 SyncAction 字段:

    • idle:所有操作都已完成。
    • resync:在系统故障后初始化或恢复。
    • recover:替换数组中的设备。
    • check:查找差异。
    • repair:查找和修复差异。

    输出示例:

    [oracle@ol-node01 ~]$ lvs -o +raid_sync_action,raid_mismatch_count foo/rr
      LV   VG  Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert SyncAction Mismatches
      rr   foo rwi-aor--- 13.34g                                    44.42            check               0
    

    输出显示 0 个不一致 (不匹配)。

  4. (可选)修复数组中的差异。

    此步骤是可选的,因为此示例数组中可能不存在任何差异。

    sudo lvchange --syncaction repair foo/rr
    
  5. (可选)检查维修状态。

    sudo lvs -o +raid_sync_action,raid_mismatch_count foo/rr
    

    请注意,SyncAction 字段已更改为 repair

有关更多信息,请参见 lvchange(8)lvmraid(7) 手册页。

详细信息:

更多学习资源

浏览 docs.oracle.com/learn 上的其他实验室,或者在 Oracle Learning YouTube 频道上访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle 学习资源管理器。

有关产品文档,请访问 Oracle 帮助中心