注意:
- 本教學課程包含在 Oracle 提供的免費實驗室環境中。
- 它會使用 Oracle Cloud Infrastructure 證明資料、租用戶以及區間的範例值。完成實驗室之後,請將這些值取代為您雲端環境特有的值。
在 Oracle Linux 上設定 RAID 邏輯磁碟區
簡介
LVM RAID 是一種建立邏輯磁碟區 (LV) 的方式,可使用多個實體裝置來改善效能或容許裝置故障。在 LVM 中,實體裝置是單一磁碟區群組 (VG) 中的實體磁碟區 (PV)。
本教學課程將搭配使用 Oracle Linux Volume Manager 公用程式,以建立 RAID 邏輯磁碟區,然後處理磁碟失敗。
目標
- 建立 RAID 邏輯磁碟區
- 調整 RAID 邏輯磁碟區的大小
- 復原失敗的 RAID 裝置
必要條件
具備下列配置的任何 Oracle Linux 8 系統:
- 具有 sudo 權限的非 root 使用者
- 與 LVM 搭配使用的額外區塊磁碟區
設定實驗室環境
注意:使用免費實驗室環境時,請參閱 Oracle Linux Lab Basics,瞭解連線和其他使用指示。
-
如果尚未連線,請開啟終端機並透過 ssh 連線至上述每個執行處理。
ssh oracle@<ip_address_of_instance>
-
確認區塊磁碟區存在。
sudo lsblk
免費實驗室環境的輸出應顯示現有檔案系統的 /dev/sda,以及可用的磁碟 /dev/sdb、/dev/sdc、/dev/sdd 和 /dev/sde。另外還有兩個額外磁碟 (/dev/sdf、/dev/sdg),我們稍後將會使用。
實體磁碟區 (PV)
-
使用可用的磁碟建立實體磁碟區 (PV)。
sudo pvcreate -v /dev/sd[b-e]
使用
-v
選項執行指令以取得詳細資訊。 -
驗證 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)
-
使用新建立的實體磁碟區建立磁碟區群組 (VG)。
sudo vgcreate -v foo /dev/sd[b-e]
-
驗證 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)
-
建立 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)
線上手冊。 -
驗證 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
-
顯示 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
建立檔案系統
-
在 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
-
掛載檔案系統。
sudo mkdir -p /u01 sudo mount /dev/foo/rr /u01
-
報告檔案系統磁碟用法。
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 大小:
- 使用
lvresize
或lvextend
來增加 LV。 - 使用
lvresize
或lvreduce
來縮小 LV。 - 使用
lvconvert
與--stripes N
參數來變更條形的數目。
重要事項:縮小 LV 會有風險,可能會導致資料遺失。在 LV 上執行 XFS 檔案系統時,請避免縮小 LV,因為 XFS 不允許減少檔案系統大小。
增加 RAID LV 容量
-
使用 VG 中的可用空間,將 RAID LV 大小增加為 10G。
sudo lvresize -L 10G foo/rr
若要將大小增加 10G,請改用
-L +10G
選項。 -
驗證 LV 增加至 10G。
sudo lvs foo/rr
LSize 應顯示 10g。
-
擴大檔案系統。
sudo xfs_growfs /u01
-
報告更新的檔案系統磁碟使用狀況。
df -h
-
繼續之前,請先檢查 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 上變更。每個額外條形在磁碟區群組中都需要相同數目的非配置實體磁碟區 (裝置)。
-
檢查 VG foo 中存在哪些實體磁碟區 (PV)。
sudo pvs
從輸出 /dev/sdb、/dev/sdc、/dev/sdd 以及 /dev/sde 都與 VG foo 相關聯。
-
判斷是否有任何未使用的實體磁碟區。
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 顯示。 -
將另一個 PV 新增至 VG。
由於現有的 RAID LV 使用所有現有的實體磁碟區,請將 /dev/sdf 增加到 PV foo。
sudo vgextend foo /dev/sdf
輸出顯示
vgextend
指令先將 /dev/sdf 轉換為 PV,再將其加入到 VG foo。 -
將分割新增至 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.
-
驗證 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 中的裝置遭到修改或取代時,就需要完整同步。
-
檢查同步化狀態。
執行檢查,直到進度達到 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 之後自動結束。
- 執行
-
顯示新區段範圍與 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 磁碟區中失敗的裝置,而不使用移除失敗的磁碟機,也有可能增加替代品。
-
檢查目前的 RAID LV 版面配置。
sudo lvs --all --options name,copy_percent,devices foo
-
在 /dev/sdd 上模擬失敗。
echo 1 | sudo tee /sys/block/sdd/device/delete
-
失敗之後,請重新檢查 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)
-
取代失敗的裝置。
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
指令。 -
將裝置 /dev/sdg 新增至 VG
sudo vgextend foo /dev/sdg
輸出中的 WARNING 訊息因為仍遺失失敗的磁碟機,
-
重試更換失敗的磁碟機。
sudo lvconvert --repair foo/rr
再次向提示回應
y
。再次輸出顯示有關遺失磁碟機的 WARNING 訊息,但該指令已成功取代 VG 中的錯誤裝置。
-
檢查版面配置。
sudo lvs --all --options name,copy_percent,devices foo
請注意,/dev/sdg 已取代所有 [unknown] 裝置項目。
-
從 VG 移除失敗的裝置。
LVM 公用程式將繼續報告 LVM 找不到失敗的裝置,直到將它從 VG 移除為止。
sudo vgreduce --removemissing foo
輸出中的 WARNING 訊息因為仍遺失失敗的磁碟機,
-
繼續之前,請先檢查 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 的清理功能,可讀取陣列中的所有資料與同位區塊並檢查一致性。
-
在檢查模式中起始清理。
sudo lvchange --syncaction check foo/rr
-
顯示清理動作的狀態。
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
-
清理完畢之後 (同步化),會顯示找到的不一致區塊數目。
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 個不一致 (不相符)。
-
(選擇性) 修正陣列中的差異。
此步驟是選擇性的,因為此範例陣列中可能沒有差異。
sudo lvchange --syncaction repair foo/rr
-
(選擇性) 檢查維修狀態。
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。
Configure RAID Logical Volumes on Oracle Linux
F57866-02
May 2022
Copyright © 2021, Oracle and/or its affiliates.