RAID 陣列¶
啟動時組裝 RAID 陣列¶
- 管理 md 裝置的工具可以在以下位置找到
您可以使用以下核心命令列來啟動您的 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 裝置的編號
|
裝置 |
|---|---|
0 |
md0 |
1 |
md1 |
2 |
md2 |
3 |
md3 |
4 |
md4 |
raid 級別¶
RAID 陣列的級別
|
級別 |
|---|---|
-1 |
線性模式 |
0 |
條帶模式 |
其他模式僅在具有持久超級塊的情況下才支援
塊 大小 因子¶
(僅 raid-0 和 raid-1)
將塊大小設定為 4k << n。
故障 級別¶
完全忽略
dev0 到 devn¶
例如 /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==0 和 raid_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 級別(陣列仍在組裝中),則該值將反映已寫入它的內容,這可能是像上面這樣的名稱,也可能是一個數字,例如0、5等。- raid_disks
一個文字檔案,其中包含一個簡單的數字,指示完全功能的陣列中的裝置數量。 如果這還未知,則該檔案將為空。 如果正在調整陣列的大小,這將包含新的裝置數量。 某些 raid 級別允許在陣列處於活動狀態時設定此值。 這將重新配置陣列。 否則,只能在組裝陣列時設定它。 如果更改此屬性會減小陣列的大小,則不允許更改。 要減少例如 raid5 中的驅動器數量,必須首先透過設定
array_size屬性來減小陣列大小。- chunk_size
這是
塊的大小(以位元組為單位),並且僅與涉及條帶化的 raid 級別 (0,4,5,6,10) 相關。 陣列的地址空間在概念上分為塊,連續的塊被條帶化到相鄰的裝置上。 大小應至少為 PAGE_SIZE (4k),並且應為 2 的冪。 只能在組裝陣列時設定此值- layout
特定級別的陣列的
layout。 這只是一個數字,由不同的級別以不同的方式解釋。 可以在組裝陣列時寫入它。- array_size
這可以用於人為地限制陣列中的可用空間小於組合裝置上實際可用的空間。 寫入小於可用大小的數字(以千位元組為單位)將設定大小。 陣列的任何重新配置(例如,新增裝置)都不會導致大小發生變化。 寫入單詞
default將導致陣列的有效大小是基於level、chunk_size和component_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_mode。certain 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
這指示了陣列的寫入意圖點陣圖的儲存位置。
它可以是
none、file或[+-]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
這可以是
internal或external。
internal是預設值,表示點陣圖的元資料儲存在分配空間的前 256 個位元組中,並由 md 模組管理。
external表示點陣圖元資料在核心外部管理(即,由某些使用者空間程式)。
- bitmap/can_clear
這可以是
true或false。 如果true,則當認為相應的塊已同步時,點陣圖中的位將被清除。 如果false,則位將永遠不會被清除。 如果在降級的陣列上發生寫入,或者陣列在寫入期間變為降級,則會自動將其設定為false。 當元資料在外部管理時,一旦陣列變為非降級,就應將其設定為 true,並且此事實已記錄在元資料中。- consistency_policy
這指示陣列如何在意外關閉的情況下保持一致性。 它可以是
- none
陣列沒有冗餘資訊,例如 raid0、linear。
- resync
執行完全重新同步,並在不乾淨關閉後啟動陣列時重新生成所有冗餘。
- bitmap
由寫入意圖點陣圖輔助的重新同步。
- journal
對於 raid4/5/6,使用日誌裝置來記錄事務並在不乾淨關閉後重播。
- ppl
僅對於 raid5,部分奇偶校驗日誌用於關閉寫入孔並消除重新同步。
寫入此檔案時接受的值為
ppl和resync,用於啟用和停用 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。對
faulty或blocked的任何更改都會導致事件。- 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停止了resync或recovery,則可以使用它們來重新啟動相應的操作。如果當前狀態為
idle,check和repair將啟動相應的過程。此檔案響應 select/poll。該值中的任何重要更改都會觸發 poll 事件。有時,如果似乎需要恢復但無法實現,則該值會短暫地變為
recover。在這種情況下,不會通知到recover的轉換,但會通知離開的轉換。- degraded (降級)
這包含陣列降級的裝置數量的計數。因此,一個最佳陣列將顯示
0。單個故障/缺失的驅動器將顯示1,等等。此檔案響應 select/poll,缺失裝置數量的任何增加或減少都會觸發一個事件。
- mismatch_count (不匹配計數)
當執行
check和repair時,以及可能在執行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時,它將暫停,而不是完成。您可以使用select或poll在sync_completed上等待該數字達到 sync_max。然後,您可以增加sync_max,或者可以將idle寫入sync_action。
sync_max的max值有效地停用了該限制。當 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。