注意:

在 Oracle Linux 上設定 RAID 邏輯磁碟區

簡介

LVM RAID 是一種建立邏輯磁碟區 (LV) 的方式,可使用多個實體裝置來改善效能或容許裝置故障。在 LVM 中,實體裝置是單一磁碟區群組 (VG) 中的實體磁碟區 (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. 使用可用的磁碟建立實體磁碟區 (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 邏輯磁碟區 (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/r 不在同步,因此過於快速進入下一個步驟可能會出現錯誤。

    如果在調整上方 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 中存在哪些實體磁碟區 (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
    ...
    

    pvdisplay 指令搭配 -m 選項顯示實體擴充區塊與邏輯磁碟區及記錄擴充區塊的對應。範例輸出中的 PV /dev/sdb 顯示與 RAID LV 關聯的實體擴充區塊。同時也應該針對 /dev/sdc/dev/sdd/dev/sde 顯示。

  3. 將另一個 PV 新增至 VG。

    由於現有的 RAID LV 使用所有現有的實體磁碟區,請將 /dev/sdf 增加到 PV foo。

    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,在 60s 之後自動結束。
  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.
    

    警告:如果錯誤包含「無法在未同步的情況下取代 foo/r 中的裝置」訊息,請執行 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 中的資料一致性 (Scrubbing)

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 Learning Explorer。

如需產品文件,請瀏覽 Oracle Help Center