RAID
RAID 5の問題として有名だが、複数のHDDを束ねて1つのグループと見なす、すべてのRAIDシステムで起こりうる。 RAID 2以外のRAIDは読み出し時のエラー検出をHDDのエラー検出に依存しているので、RAIDシステムではエラー検出が出来ない。 物理的な破損等でHDDから応答が無かった場合や読み出しエラーをHDDが返した場合に限り、RAIDシステムではエラーを検出できるが、正しく読み出せる場合はエラー検出が出来ない。
例えば、2台でのRAID 1の場合、RAIDコントローラからHDD AとHDD Bに同時に書き込みリクエストは発生するが、HDDには書き込み時の処理のタイムラグがあるため、HDD Aには書き込みが完了したがHDD Bには書き込みが発生していないと言うタイミングが存在する(逆もしかり)。 このタイミングで電源断等により処理が中断した場合、HDD Aには新しく書き込まれたデータ、HDD Bには上書きされる前の古いデータが記録されており、HDD AとHDD Bのミラーとして対になるセクタの値が同一ではなくなる。 ブロックサイズが大きい場合は、ブロック自体が複数のセクタで構成されているため、同一HDDの中でも、ブロックを構成する一部のセクタのみ書き込み完了しそれ以外は書き換えられていないということも発生する。 このようにRAIDを構成するグループのHDDのブロックすべてに書き込めずに、穴が開いたのように書き込まれるためライトホールと呼ばれる。
プログラムをコピーペーストして拡張子を(.vbs)して開くとRAID容量の計算ができます。
このプログラムではRAID0,1,1e,10,5,6が計算できます。
PパリティはRAID5と同じXORによるパリティであり、もう一つの冗長データであるQパリティは重みつきのガロア体GF(2) における剰余、つまり8ビットのCRCを用いる。8ビットCRCの制限により、この方式を用いる限りデータディスクは255台(+冗長ディスク2台)までしかサポートできない。
規格のようなものがないため、生成多項式や重みのつけかたが各社で異なる。また高速化やハードウェア的な最適化のためにあらかじめ定数をかけたテーブルが用意されているなど、単純なCRCには見えない場合もある。あるいは、これ以外の算出方法を採っている場合も有り得る。
具体的な算出方法は以下の通りである。
データディスクをA・B・C・Dとし、冗長ディスクをP・Qとする。現実には冗長ディスクは分散されているが、便宜上こうしておく。
P=A+B+C+D (RAID5と同じ)
Q=CRC(A+B*2+C*4+D*8)
ここで、AとはデータディスクAにある1バイトのデータであり、以下B・C・D・P・Qそれぞれ、対応する同じ位置にある1バイトのデータを示す。またCRC(x) は、値xをビット列とした時のCRC符号である。このCRCは、生成多項式が既約性を持つ(==原始多項式である)必要がある。