解析Linux環境下RAID 6的Q校驗演算法
【前言】
RAID 為廉價磁碟冗餘陣列( Redundant Array of Inexpensive Disks ), RAID 技術將一個個單獨的磁碟以不同的組合方式形成一個邏輯硬碟,從而提高了磁碟讀取的效能和資料的安全性。不同的組合方式用 RAID 級別來標識,常見 RAID 的級別有 、 1 、 01 、 10 、 5 、 6 等等。具體實現的資料儲存的原理請參考相關文章。本章主要概述 Linux 環境下 RAID 6 級別的儲存原理。 Linux 環境下配置 RAID 的命令是 “mdadm” 。
【 RAID 6 概述】
RAID 6 是指帶有兩種分佈儲存的奇偶校驗碼(既 P 和 Q )的獨立硬碟結構。與 RAID 5 相比, RAID 6 增加了第二個獨立校驗碼( Q )資訊塊,兩個獨立的奇偶校驗系統使用不同的演算法,資料的可靠性非常高,即使兩塊硬碟同時失效也不會影響資料的使用,主要是用於要求資料絕對安全的場合。如下圖:
上圖中 Q 為 RAID 6 的第二個校驗資訊塊,採用的是非常複雜的 “ 伽羅華域 ” 演算法,稍後會講到。
【 RAID 6 的 P 校驗概述】
其實 RAID 6 的 P 校驗和 RAID 5 的校驗是一樣的,都是採用的 “ 異或 ” 運算。異或運算子的原則就是相同為 ,不同為 1 的。在 RAID 5 的環境中只能掉一塊硬碟,但是 RAID 6 在 RAID 5 的基礎上新增了 Q 校驗,因此 RAID 6 支援同時掉兩塊盤。異或運算如下:
P = A + B + C = A xor B xor C
A = P - B - C = P xor B xor C
注意:上述的加減法都是異或運算。
【 RAID 6 的 Q 校驗概述】
說到 Q 校驗就有點複雜了,它採用上面所提到的 “ 伽羅華域 ” 演算法。 “ 伽羅華域 ” 實際上就是 “0-255” 的一個有限域 GF(2^8) ,在 GF(2^8) 內不管是是加、減、乘、除都不會超過這個範圍。並且,加減法可逆,乘除法可逆,而且計算的值在 GF(2^8) 內是唯一的。注意:此處提到的加、減、乘、除法不是日常使用的加減乘除,而是 “ 伽羅華域 ” 內的運算。在 GF(2^8) 中,如果 2 的 n 次方大於某個值(本原多項式)就會對該值(本原多項式)取餘,結果又會返回到 GF(2^8) 中。因此,保證了 2^0 到 2^255 的結果值在 GF(2^8) 內是唯一的。
在 GF(2^8) 中一共有 16 個本原多項式,分別如下:
1 x8+x7+x6+x5+x4+x2+1 1 1111 0101 = 0x1F5
2 x8+x7+x6+x5+x2+x+1 1 1110 0111 = 0x1E7
3 x8+x7+x6+x3+x2+x+1 1 1100 1111 = 0x1CF
4 x8+x7+x6+x+1 1 1100 0011 = 0x1C3
5 x8+x7+x5+x3+1 1 1010 1001 = 0x1A9
6 x8+x7+x3+x2+1 1 1000 1101 = 0x18D
7 x8+x7+x2+x+1 1 1000 0111 = 0x187
8 x8+x6+x5+x4+1 1 0111 0001 = 0x171
9 x8+x6+x5+x3+1 1 0110 1001 = 0x169
10 x8+x6+x5+x2+1 1 0110 0101 = 0x165
11 x8+x6+x5+x+1 1 0110 0011 = 0x163
12 x8+x6+x4+x3+x2+x+1 1 0101 1111 = 0x15F
13 x8+x6+x3+x2+1 1 0100 1101 = 0x14D
14 x8+x5+x3+x2+1 1 0010 1101 = 0x12D
15 x8+x5+x3+x+1 1 0010 1011 = 0x12B
16 x8+x4+x3+x2+1 1 0001 1101 = 0x11D
RAID 6 常用的本原多項式為 0X11D ,既上列中最後一個。 Linux 環境中的 RAID 6 也是如此。
好了回到 Q 校驗上, Q 校驗和 P 校驗結合正好組成了一個二元一次方程, K1 、 K2 、 K3 為 GF(2^8) 中多項式的數值。
P = A + B + C
Q = A*K1 + B*K2 + C*K3
【伽羅華域的乘除法運算】
伽羅華域中的加減法也是異或運算,所以就不做詳細解釋了,重點解釋一下乘除法。透過上面的 Q 校驗知道 Q 校驗的生成需要伽羅華域中的乘法運算,計算乘法運算是一件非常複雜的事情,最好的解決辦法就是將 GF(2^8) 中所有多項式的值生成表格,透過查表得知乘法運算的值。
1 、生成正表 GFILOG
透過下表的方法生成正表 GFILOG ,注意:此表的本原多項式為 0X11D 。
如下:是正表 GFILOG
2 、生成反表 GFLOG
有了正向變換表,要得到逆向表就很簡單了,把正向中的表變換值做為索引,在把正向表中的索引作為值就 OK 了。如下表:
3 、計算乘除法運算(查表法)
乘法: A * K1 = GFILOG[(GFLOG[A]+GFLOG[K1]) mod 255];
除法: A / K1 = GFILOG[(GFLOG[A]-GFLOG[K1]+255) mod 255];
現在知道了伽羅華域的乘除法,那麼我們計算 Q 校驗就方便了許多。
【根據 Q 校驗生成丟失的資料】
當 RAID 6 中壞掉兩塊磁碟,那該如何生成丟失的資料呢?用 RAID 6 的一個條帶舉例說明。
1 、如果某個條帶中丟失的兩塊資料是 P 和 Q ,那麼正好,資料沒有丟失,正常提取即可。
2 、如果某個條帶中丟失的兩塊資料是 P 和 A ,那麼可以根據 Q 校驗計算出 A 的資料。
P = A*K1 + B*K2 + C*K3
A*K1 = P + B*K2 + C*K3
A = ( P + B*K2 + C*K3 ) / K1 // 注: K1 可以同過查表獲取
3 、如果某個條帶中丟失的兩塊資料是 Q 和 A ,那麼可以根據校驗 P 計算出 A 的資料。
P = A + B + C
A = P + B + C
4 、如果某個條帶中丟失的兩塊資料是 A 和 B ,那麼可以根據校驗 P 和 Q 計算出 A 和 B 的資料。
P = A + B + C
Q = A*K1 + B*K2 + C*K3
A = P + B + C
Q = (P + B + C)*K1 + B*K2 +C*K3
Q = P*K1 + B*K1 + C*K1 + B*K2 + C*K3
Q = P*K1 + C*K1 + C*K3 + B*K1 + B*K2
Q + P*K1 + C*K1 + C*K3 = (K1+K2) * B
B = ( Q + P*K1 + C*K1 + C*K3) / (K1+K2)
計算出 B 的值以後,再根據 P 校驗和計算出 A 的值就容易很多了。
A = P + B + C
【 Linux 環境下的 RAID 6 】
根據前的內容已經知道 RAID 6 的大致原理了。因為伽羅華域的本原多項式有 16 種,因此 RAID 6 的種類有很多,再加上 K 值的不固定。因此計算某個 RAID 6 的 Q 校驗值會變的很複雜。不過 Linux 環境下的 RAID 6 的 K 值經過測試,其值根據夠成 RAID 6 陣列的磁碟數,從本原多項式 0X11D 的開始取( RAID 6 總磁碟數 -2 )個多項式的值作為 K 的值。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31380569/viewspace-2654098/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- raid6磁碟陣列的Q校驗演算法深度挖掘AI陣列演算法
- 在 Linux 下使用 RAID(五):安裝 RAID 6(條帶化雙分散式奇偶校驗)LinuxAI分散式
- Linux環境下如何驗證提供時間校準的NTP伺服器是否可用Linux伺服器
- 在 Linux 下使用 RAID(四):建立 RAID 5(條帶化與分散式奇偶校驗)LinuxAI分散式
- linux下檔案的校驗Linux
- 使用 runcluvfy 校驗Oracle RAC安裝環境Oracle
- 【伺服器資料恢復】Linux環境下RAID6磁碟陣列資料恢復案例伺服器資料恢復LinuxAI陣列
- linux環境下的undelete(轉)Linuxdelete
- linux下配置java環境LinuxJava
- linux 下搭建php環境LinuxPHP
- Linux下NDK環境搭建!Linux
- Oracle RAC一鍵部署001(主機環境校驗)Oracle
- linux或者CentOS環境下安裝.NET Core環境LinuxCentOS
- Linux環境下 RabbitMQ 的下載與安裝LinuxMQ
- RAID群組和奇偶校驗群組(轉)AI
- Linux下Java環境變數的配置LinuxJava變數
- gdb linux下eclipse環境的建立LinuxEclipse
- linux下jsp環境的搭建薦LinuxJS
- 關於aix, linux下的shell環境AILinux
- Linux環境下的Socket程式設計Linux程式設計
- Linux下安裝Go環境LinuxGo
- Linux 下配置 node + mongodb 環境LinuxMongoDB
- Windows環境下安裝LinuxWindowsLinux
- linux環境下redis安裝LinuxRedis
- Linux環境下安裝NginxLinuxNginx
- linux環境下ssh 互信配置Linux
- linux環境下搭建個人微博Linux
- Linux環境下Swap配置方法Linux
- LINUX環境下安裝TIPTOPLinux
- Linux下Java環境安裝LinuxJava
- Windows環境下的Nginx環境搭建WindowsNginx
- 在linux環境下安裝JDK並配置環境變數LinuxJDK變數
- yapi 在linux環境下的安裝部署APILinux
- linux環境下的c++程式設計LinuxC++程式設計
- linux下的PS1環境變數Linux變數
- Linux環境下的網路程式設計Linux程式設計
- linux下的java環境變數設定LinuxJava變數
- linux下rac環境下刪除節點Linux