RAID 陣列

啟動時組裝 RAID 陣列

管理 md 裝置的工具可以在以下位置找到

https://kernel.linux.club.tw/pub/linux/utils/raid/

您可以使用以下核心命令列來啟動您的 md 裝置

適用於沒有持久超級塊的舊 raid 陣列

md=<md device no.>,<raid level>,<chunk size factor>,<fault level>,dev0,dev1,...,devn

適用於具有持久超級塊的 raid 陣列

md=<md device no.>,dev0,dev1,...,devn

或者,組裝一個可分割槽的陣列

md=d<md device no.>,dev0,dev1,...,devn

md 裝置 編號。

md 裝置的編號

md 裝置 編號。

裝置

0

md0

1

md1

2

md2

3

md3

4

md4

raid 級別

RAID 陣列的級別

raid 級別

級別

-1

線性模式

0

條帶模式

其他模式僅在具有持久超級塊的情況下才支援

大小 因子

(僅 raid-0 和 raid-1)

將塊大小設定為 4k << n。

故障 級別

完全忽略

dev0devn

例如 /dev/hda1, /dev/hdc1, /dev/sda1, /dev/sdb1

一個可能的 loadlin 行 (Harald Hoyer <HarryH@Royal.Net>) 看起來像這樣

e:\loadlin\loadlin e:\zimage root=/dev/md0 md=0,0,4,0,/dev/hdb2,/dev/hdc3 ro

啟動時自動檢測 RAID 陣列

當 md 被編譯到核心中(而不是作為模組)時,型別為 0xfd 的分割槽會被掃描並自動組裝成 RAID 陣列。可以使用核心引數 raid=noautodetect 來抑制此自動檢測。 從核心 2.6.9 開始,只有型別為 0 的超級塊的驅動器才能在啟動時被自動檢測和執行。

核心引數 raid=partitionable (或 raid=part) 意味著所有自動檢測到的陣列都組裝為可分割槽的。

啟動時組裝降級/髒陣列

如果一個 raid5 或 raid6 陣列既是髒的又是降級的,它可能具有無法檢測到的資料損壞。 這是因為它是 dirty 意味著奇偶校驗不可信,並且它是降級的意味著一些資料塊丟失並且無法可靠地重建(由於沒有奇偶校驗)。

因此,md 通常會拒絕啟動這樣的陣列。 這需要系統管理員採取行動來顯式啟動陣列,儘管可能存在損壞。 這通常透過以下方式完成

mdadm --assemble --force ....

如果陣列具有根檔案系統,則此選項實際上不可用。 為了支援從此類陣列啟動,md 支援一個模組引數 start_dirty_degraded,當設定為 1 時,會繞過檢查,並允許啟動髒降級的陣列。

因此,要使用髒降級的 raid 5 或 6 的根檔案系統啟動,請使用

md-mod.start_dirty_degraded=1

超級塊格式

md 驅動程式可以支援各種不同的超級塊格式。 目前,它支援超級塊格式 0.90.0 和 2.5 開發系列中引入的 md-1 格式。

核心將自動檢測正在使用的超級塊格式。

出於歷史原因,超級塊格式 0 的處理方式與其他格式不同 - 它是原始的超級塊格式。

通用規則 - 適用於所有超級塊格式

透過將適當的超級塊寫入所有裝置來 建立 陣列。

透過將每個裝置與特定的 md 虛擬裝置關聯來 組裝 它。 一旦它被完全組裝,就可以訪問它。

陣列應該由使用者空間工具建立。 這會將超級塊寫入所有裝置。 它通常會將陣列標記為 unclean,或者缺少一些裝置,以便核心 md 驅動程式可以建立適當的冗餘(在 raid 1 中複製,在 raid 4/5 中計算奇偶校驗)。

當組裝陣列時,首先使用 SET_ARRAY_INFO ioctl 進行初始化。 這尤其包含主要和次要版本號。 主要版本號選擇要使用的超級塊格式。 次要版本號可能用於調整格式的處理,例如建議在每個裝置上查詢超級塊的位置。

然後使用 ADD_NEW_DISK ioctl 新增每個裝置。 這尤其提供了標識要新增的裝置的主要和次要編號。

陣列使用 RUN_ARRAY ioctl 啟動。

啟動後,可以新增新裝置。 它們應該有一個適當的超級塊寫入它們,然後透過 ADD_NEW_DISK 傳入。

可以使用 HOT_REMOVE_DISK 從陣列中分離已失敗或尚未啟用的裝置。

適用於 format-0 超級塊陣列和沒有超級塊的陣列(非持久)的特定規則

可以透過在 SET_ARRAY_INFO ioctl 中描述陣列(級別、塊大小等)來 建立 陣列。 這必須具有 major_version==0raid_disks != 0

然後可以使用 ADD_NEW_DISK 新增未初始化的裝置。 傳遞給 ADD_NEW_DISK 的結構必須指定裝置的狀態及其在陣列中的角色。

使用 RUN_ARRAY 啟動後,可以使用 HOT_ADD_DISK 新增未初始化的備用裝置。

sysfs 中的 MD 裝置

md 裝置在 sysfs (/sys) 中顯示為常規塊裝置,例如

/sys/block/md0

每個 md 裝置將包含一個名為 md 的子目錄,其中包含有關該裝置的更多 md 特定資訊。

所有 md 裝置都包含

級別

一個文字檔案,指示 raid 級別。 例如,raid0、raid1、raid5、linear、multipath、faulty。 如果尚未設定 raid 級別(陣列仍在組裝中),則該值將反映已寫入它的內容,這可能是像上面這樣的名稱,也可能是一個數字,例如 05 等。

raid_disks

一個文字檔案,其中包含一個簡單的數字,指示完全功能的陣列中的裝置數量。 如果這還未知,則該檔案將為空。 如果正在調整陣列的大小,這將包含新的裝置數量。 某些 raid 級別允許在陣列處於活動狀態時設定此值。 這將重新配置陣列。 否則,只能在組裝陣列時設定它。 如果更改此屬性會減小陣列的大小,則不允許更改。 要減少例如 raid5 中的驅動器數量,必須首先透過設定 array_size 屬性來減小陣列大小。

chunk_size

這是 的大小(以位元組為單位),並且僅與涉及條帶化的 raid 級別 (0,4,5,6,10) 相關。 陣列的地址空間在概念上分為塊,連續的塊被條帶化到相鄰的裝置上。 大小應至少為 PAGE_SIZE (4k),並且應為 2 的冪。 只能在組裝陣列時設定此值

layout

特定級別的陣列的 layout。 這只是一個數字,由不同的級別以不同的方式解釋。 可以在組裝陣列時寫入它。

array_size

這可以用於人為地限制陣列中的可用空間小於組合裝置上實際可用的空間。 寫入小於可用大小的數字(以千位元組為單位)將設定大小。 陣列的任何重新配置(例如,新增裝置)都不會導致大小發生變化。 寫入單詞 default 將導致陣列的有效大小是基於 levelchunk_sizecomponent_size 實際可用的任何大小。

這可用於在減少 raid4/5/6 中的裝置數量之前減小陣列的大小,或支援強制執行此類裁剪的外部元資料格式。

reshape_position

這是 none 或陣列裝置中的一個扇區號,其中 reshape 達到了。 如果設定了此項,則上面提到的三個屬性(raid_disks、chunk_size、layout)可能具有 2 個值,一箇舊值和一個新值。 如果這些值不同,則讀取該屬性會返回

new (old)

寫入將影響 new 值,而使 old 值保持不變。

component_size

對於具有資料冗餘的陣列(即,不是 raid0、linear、faulty、multipath),所有元件的大小必須相同 - 或者至少必須有一個它們都提供空間的尺寸。 這是陣列幾何形狀的關鍵部分。 它以扇區為單位測量,可以從此處讀取。 如果特性支援(raid1、raid5、raid6)並且元件驅動器足夠大,則寫入此值可能會調整陣列的大小。

metadata_version

這指示用於記錄有關陣列的元資料的格式。 它可以是 0.90(傳統格式)、1.0、1.1、1.2(不同位置的較新格式)或 none,指示核心根本不管理元資料。 或者,它可以是 external: 後跟一個字串,該字串由使用者空間設定。 這指示元資料由使用者空間程式管理。 任何裝置故障或需要元資料更新的其他事件都將導致陣列活動暫停,直到事件被確認。

resync_start

重新同步應該開始的點。 如果不需要重新同步,這將是一個非常大的數字(或自 2.6.30-rc1 以來的 none)。 在陣列建立時,它將預設為 0,但將陣列作為 clean 啟動會將其設定得更大。

new_dev

可以寫入此檔案但不能讀取。 寫入的值應該是塊裝置號,格式為 major:minor。 例如,8:0 這將導致該裝置附加到陣列,如果它可用的話。 然後它將出現在 md/dev-XXX (取決於裝置的名稱),並且可以進行進一步的配置。

safe_mode_delay

當 md 陣列在一段時間內沒有看到寫入請求時,它將被標記為 clean。 當另一個寫入請求到達時,陣列在寫入開始之前被標記為 dirty。 這被稱為 safe_modecertain period 由此檔案控制,該檔案將該週期儲存為秒數。 預設值為 200 毫秒 (0.200)。 寫入 0 值會停用安全模式。

array_state

此檔案包含一個單詞,描述了陣列的當前狀態。 在許多情況下,可以透過寫入所需狀態的單詞來設定狀態,但是某些狀態無法顯式設定,並且不允許某些轉換。

Select/poll 在此檔案上工作。 除了 Active_idle 和 active 之間的所有更改(這可能是頻繁的並且不是很令人感興趣)都會收到通知。 如果元資料是外部管理的,則報告 active->active_idle。

clear

沒有裝置,沒有大小,沒有級別

寫入等同於 STOP_ARRAY ioctl

inactive

可能有一些設定,但陣列未處於活動狀態,所有 IO 都會導致錯誤

寫入時,不會拆除陣列,而只是停止它

suspended(尚不支援)

所有 IO 請求都將被阻止。 可以重新配置陣列。

寫入此內容(如果被接受)將阻止,直到陣列處於靜止狀態

readonly

不會發生重新同步。 不會寫入超級塊。

寫入請求失敗

read-auto

像 readonly 一樣,但在寫入請求時表現得像 clean

clean

沒有掛起的寫入,但在其他方面處於活動狀態。

當寫入到非活動陣列時,啟動時不進行重新同步

如果到達寫入請求,則如果元資料已知,則標記為 dirty 並切換到 active。 如果未知,則阻止並切換到 write-pending

如果寫入到具有掛起寫入的活動陣列,則失敗。

active

完全活動:IO 和重新同步可能正在發生。 當寫入到非活動陣列時,啟動時進行重新同步

write-pending

clean,但寫入被阻止,等待寫入 active

active-idle

像 active 一樣,但一段時間內(safe_mode_delay)沒有看到寫入。

bitmap/location

這指示了陣列的寫入意圖點陣圖的儲存位置。

它可以是 nonefile[+-]N 之一。 file 稍後可能會擴充套件為 file:/file/name [+-]N 意味著從元資料開始的許多扇區。

這在所有裝置上都複製。 對於具有外部管理的元資料的陣列,偏移量是從裝置開始計算的。

bitmap/chunksize

將由單個位表示的塊的大小(以位元組為單位)。 對於 RAID456,它是單個裝置的一部分。 對於 RAID10,它是陣列的一部分。 對於 RAID1,兩者都是(它們的意思相同)。

bitmap/time_base

在點陣圖中查詢要清除的位之間的時間(以秒為單位)。 在當前的實現中,在一個位被覆蓋的所有塊已知同步後,該位將在 2 到 3 倍的 time_base 之間被清除。

bitmap/backlog

當 write-mostly 裝置在 RAID1 中處於活動狀態時,對這些裝置的寫入請求在後臺進行 - 檔案系統(或裝置的其他使用者)不必等待它們。 backlog 設定了併發後臺寫入次數的限制。 如果超過此數量,則新的寫入將是同步的。

bitmap/metadata

這可以是 internalexternal

internal

是預設值,表示點陣圖的元資料儲存在分配空間的前 256 個位元組中,並由 md 模組管理。

external

表示點陣圖元資料在核心外部管理(即,由某些使用者空間程式)。

bitmap/can_clear

這可以是 truefalse。 如果 true,則當認為相應的塊已同步時,點陣圖中的位將被清除。 如果 false,則位將永遠不會被清除。 如果在降級的陣列上發生寫入,或者陣列在寫入期間變為降級,則會自動將其設定為 false。 當元資料在外部管理時,一旦陣列變為非降級,就應將其設定為 true,並且此事實已記錄在元資料中。

consistency_policy

這指示陣列如何在意外關閉的情況下保持一致性。 它可以是

none

陣列沒有冗餘資訊,例如 raid0、linear。

resync

執行完全重新同步,並在不乾淨關閉後啟動陣列時重新生成所有冗餘。

bitmap

由寫入意圖點陣圖輔助的重新同步。

journal

對於 raid4/5/6,使用日誌裝置來記錄事務並在不乾淨關閉後重播。

ppl

僅對於 raid5,部分奇偶校驗日誌用於關閉寫入孔並消除重新同步。

寫入此檔案時接受的值為 pplresync,用於啟用和停用 PPL。

uuid

這指示陣列的 UUID,格式如下:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

當元件裝置新增到 md 陣列時,它們會以命名的新目錄的形式出現在 md 目錄中

dev-XXX

其中 XXX 是核心已知的裝置的名稱,例如 hdb1。 每個目錄包含

block

指向 /sys/block 中的塊裝置的符號連結,例如

/sys/block/md0/md/dev-hdb1/block -> ../../../../block/hdb/hdb1
super

一個檔案,其中包含從該裝置讀取或寫入的超級塊的影像。

state

一個檔案,記錄裝置在陣列中的當前狀態,它可以是用逗號分隔的列表

faulty

由於檢測到的故障,裝置已從活動使用中剔除,或者它具有未確認的壞塊

in_sync

裝置是陣列的完全同步的成員

writemostly

只有在沒有其他選項時,裝置才會受到讀取請求的影響。

這僅適用於 raid1 陣列。

blocked

裝置已發生故障,並且元資料處理程式尚未確認該故障。

如果不是故障,則會阻止寫入此裝置的寫入。

spare

裝置正在工作,但不是完整的成員。

這包括正在恢復到的備用裝置

write_error

裝置曾經看到過寫入錯誤。

want_replacement

裝置(大部分)正在工作,但可能應該更換,無論是由於錯誤還是由於使用者請求。

replacement

裝置是具有相同 raid_disk 的另一個活動裝置的替代品。

此列表將來可能會增長。

可以寫入此內容。

寫入 faulty 會模擬裝置上的故障。

寫入 remove 會從陣列中刪除裝置。

寫入 writemostly 會設定 writemostly 標誌。

寫入 -writemostly 會清除 writemostly 標誌。

寫入 blocked 會設定 blocked 標誌。

寫入 -blocked 會清除 blocked 標誌,並允許寫入完成,並可能模擬錯誤。

寫入 in_sync 會設定 in_sync 標誌。

寫入 write_error 會設定 writeerrorseen 標誌。

寫入 -write_error 會清除 writeerrorseen 標誌。

除了替換裝置或備用裝置外,允許隨時寫入 want_replacement。 它設定標誌。

允許隨時寫入 -want_replacement。 它清除標誌。

只允許在啟動陣列之前寫入 replacement-replacement。它設定或清除標誌。

此檔案響應 select/poll。對 faultyblocked 的任何更改都會導致事件。

errors (錯誤)

在此裝置上檢測到的讀取錯誤的近似計數,這些錯誤尚未導致裝置從陣列中移除(要麼是因為它們已被糾正,要麼是因為它們發生在陣列處於只讀狀態時)。當使用 version-1 元資料時,此值在陣列重啟後仍然保留。

此值可以在組裝陣列時寫入,從而為使用者空間管理的元資料的陣列提供持續計數。

slot (槽位)

這給出了裝置在陣列中的角色。如果裝置在陣列中不活動(即是備用盤或已失效),則為 none,或者是一個小於陣列的 raid_disks 數量的整數,指示它當前佔據的位置。這隻能在組裝陣列時設定。為此設定的裝置被假定為工作正常。

offset (偏移量)

這給出了裝置中儲存陣列資料的位置(從起始扇區算起)。除非用於儲存元資料(格式 1.1 和 1.2),否則不會觸及此偏移量之前的裝置的任何部分。

size (大小)

裝置在偏移量之後可用於儲存資料的量。這通常與 component_size 相同。這可以在組裝陣列時寫入。如果寫入的值小於當前的 component_size,它將被拒絕。

recovery_start (恢復起點)

當裝置未 in_sync 時,這將記錄裝置起始處已知正確的扇區數。這通常為零,但在恢復操作期間,它將穩步增加,如果恢復中斷,恢復此值可以使恢復避免重複之前的塊。使用 v1.x 元資料,此值會自動儲存和恢復。

只要裝置不是陣列的活動成員,就可以設定此值,可以在啟用陣列之前或設定 slot 之前。

將其設定為 none 等同於設定 in_sync。設定為任何其他值也會清除 in_sync 標誌。

bad_blocks (壞塊)

這給出了所有已知壞塊的列表,形式為起始地址和長度(分別以扇區為單位)。如果輸出太大而無法容納在一個頁面中,它將被截斷。將 sector length 寫入此檔案會新增新的已確認(即安全地記錄到磁碟)的壞塊。

unacknowledged_bad_blocks (未確認的壞塊)

這給出了已知但尚未儲存到磁碟的壞塊的列表,形式與 bad_blocks 相同。如果輸出太大而無法容納在一個頁面中,它將被截斷。寫入此檔案會新增壞塊而不確認它們。這主要用於測試。

ppl_sector, ppl_size

用於此裝置上部分奇偶校驗日誌的空間的位置和大小(以扇區為單位)。

活動的 md 裝置還將包含陣列中每個活動裝置的條目。這些被命名為

rdNN

其中 NN 是陣列中的位置,從 0 開始。因此,對於一個 3 驅動器陣列,將有 rd0、rd1、rd2。這些是指向相應的 dev-XXX 條目的符號連結。因此,例如

cat /sys/block/md*/md/rd*/state

將在每行上顯示 in_sync

支援資料冗餘的級別(1,4,5,6,10)的活動 md 裝置也有

sync_action (同步操作)

一個文字檔案,可用於監控和控制重建過程。它包含一個單詞,可以是以下之一

resync

resync

recover (恢復)

正在構建熱備盤以替換故障/缺失裝置

idle (空閒)

沒有任何事情發生

check (檢查)

已請求並正在進行冗餘的全面檢查。這將讀取所有塊並檢查它們。對於某些 raid 級別,也可能發生修復。

repair (修復)

正在進行全面檢查和修復。這類似於 resync,但由使用者請求,並且未使用寫入意圖點陣圖來最佳化該過程。

此檔案是可寫的,並且可以讀取的每個字串對於寫入都有意義。

idle 將停止活動的 resync/recovery 等。不能保證不會自動再次啟動另一個 resync/recovery,但需要一些事件來觸發它。

如果使用 idle 停止了 resyncrecovery,則可以使用它們來重新啟動相應的操作。

如果當前狀態為 idlecheckrepair 將啟動相應的過程。

此檔案響應 select/poll。該值中的任何重要更改都會觸發 poll 事件。有時,如果似乎需要恢復但無法實現,則該值會短暫地變為 recover。在這種情況下,不會通知到 recover 的轉換,但會通知離開的轉換。

degraded (降級)

這包含陣列降級的裝置數量的計數。因此,一個最佳陣列將顯示 0。單個故障/缺失的驅動器將顯示 1,等等。

此檔案響應 select/poll,缺失裝置數量的任何增加或減少都會觸發一個事件。

mismatch_count (不匹配計數)

當執行 checkrepair 時,以及可能在執行 resync 時,md 將計算發現的錯誤數量。mismatch_cnt 中的計數是已重新寫入的扇區數,或者(對於 check)本應重新寫入的扇區數。由於大多數 raid 級別以頁而不是扇區為單位工作,因此這可能比實際錯誤數大一個因子,該因子是頁面中的扇區數。

bitmap_set_bits (點陣圖設定位)

如果陣列具有寫入意圖點陣圖,則寫入此屬性可以設定點陣圖中的位,表明 resync 需要檢查相應的塊。可以寫入單個數字或起始-結束對。多個數字可以用空格分隔。

請注意,這些數字是 bit 數字,而不是 block 數字。它們應該按 bitmap_chunksize 縮放。

sync_speed_min, sync_speed_max

這些與 /proc/sys/dev/raid/speed_limit_{min,max} 類似,但它們僅適用於特定的陣列。

如果未向這些寫入任何值,或者寫入單詞 system,則使用系統範圍的值。如果寫入一個值(以千位元組/秒為單位),則使用該值。

讀取檔案時,它們會顯示當前活動值,後跟 (local)(system),具體取決於它是本地設定的值還是系統範圍的值。

sync_completed (同步完成)

這顯示了當前 sync_action 已完成的扇區數,後跟可能需要處理的總扇區數。這兩個數字用 / 分隔,從而有效地顯示一個值,即已完成的程序的一小部分。

當 resync 完成時,當它達到當前的 sync_max(如下)時,並且可能在其他時間,在此屬性上的 select 將返回。

sync_speed (同步速度)

這顯示了當前 sync_action 的當前實際速度,以 K/秒為單位。它在過去 30 秒內平均。

suspend_lo, suspend_hi (掛起下限,掛起上限)

這兩個值以扇區數為單位給出,表示陣列中 IO 將被阻止的範圍。目前僅支援 raid4/5/6。

sync_min, sync_max (同步下限,同步上限)

這兩個值以扇區數為單位給出,表示陣列中 check/repair 將執行的範圍。必須是 chunk_size 的倍數。當它達到 sync_max 時,它將暫停,而不是完成。您可以使用 selectpollsync_completed 上等待該數字達到 sync_max。然後,您可以增加 sync_max,或者可以將 idle 寫入 sync_action

sync_maxmax 值有效地停用了該限制。當 resync 處於活動狀態時,該值只能增加,永遠不能減少。sync_min 的最小值為 0

每個活動的 md 裝置也可能具有特定於管理它的個性的模組的屬性。這些屬性特定於模組的實現,如果實現發生變化,則可能會發生重大變化。

這些目前包括

stripe_cache_size (條帶快取大小) (目前僅 raid5)

條帶快取中的條目數。這是可寫的,但有上限和下限(32768, 17)。預設為 256。

strip_cache_active (條帶快取活動) (目前僅 raid5)

條帶快取中活動條目的數量

preread_bypass_threshold (預讀旁路閾值) (目前僅 raid5)

需要預讀的條帶將被不需要預讀的條帶旁路的次數。為了公平起見,預設為 1。將其設定為 0 會停用旁路記帳,並要求預讀條帶等待所有全寬條帶寫入完成。有效值為 0 到 stripe_cache_size。

journal_mode (日誌模式) (目前僅 raid5)

raid5 的快取模式。 raid5 可以包含額外的磁碟用於快取。模式可以是“write-throuth”和“write-back”。預設值為“write-through”。(直寫和回寫)

ppl_write_hint

為每個 PPL 寫入請求設定的 NVMe 流 ID。