「RAID」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
17行目: 17行目:
 
独立ディスク冗長アレイ (Redundant Array of Independent Disks, RAID) は複数のディスクドライブの構成部品 (一般的にはディスクドライブまたはそのパーティション) をまとめて一つの論理ユニットにするストレージ技術です。RAID の実装によって、この論理ユニットはファイルシステム、あるいは複数のパーティションを保持する追補的な透過レイヤーになります。データは "RAID レベル" と呼ばれる様々な方法によって、必要とされる冗長性やパフォーマンスにあわせて、ドライブに分散されます。RAID レベルの選択によって、ハードディスクが壊れた時にデータが喪失することを防いだり、パフォーマンスを向上させたり、あるいはその両方を実現できます。
 
独立ディスク冗長アレイ (Redundant Array of Independent Disks, RAID) は複数のディスクドライブの構成部品 (一般的にはディスクドライブまたはそのパーティション) をまとめて一つの論理ユニットにするストレージ技術です。RAID の実装によって、この論理ユニットはファイルシステム、あるいは複数のパーティションを保持する追補的な透過レイヤーになります。データは "RAID レベル" と呼ばれる様々な方法によって、必要とされる冗長性やパフォーマンスにあわせて、ドライブに分散されます。RAID レベルの選択によって、ハードディスクが壊れた時にデータが喪失することを防いだり、パフォーマンスを向上させたり、あるいはその両方を実現できます。
   
ほとんどの RAID レベルでは冗長性が確保されていますが、RAID はデータが安全であることを保証するものではありません。火事があったときや、コンピュータが盗まれたとき、または複数のドライブが同時に壊れた場合など RAID はデータを保護しません。さらに、RAID でシステムをインストールするのは複雑な作業であり、そのときにデータを破壊してしまう可能性もあります。 {{Warning|従って、RAID を設定する前に、かならず全てのデータを[[Backup programs|バックアップ]]しておきましょう。}}
+
ほとんどの RAID レベルでは冗長性が確保されていますが、RAID はデータが安全であることを保証するものではありません。火事があったときや、コンピュータが盗まれたとき、または複数のドライブが同時に壊れた場合など RAID はデータを保護しません。さらに、RAID でシステムをインストールするのは複雑な作業であり、そのときにデータを破壊してしまう可能性もあります。 {{Warning|従って、RAID を設定する前に、かならず全てのデータを[[バックアッププログラム|バックアップ]]しておきましょう。}}
   
{{Note|データの保存や冗長性のために RAID アレイを使おうと思っているユーザーは [[ZFS|ZFS]] によって実装されている RAIDZ についても採用を検討すると良いでしょう。ソフトウェア RAID の代替としてより近代的でパワフルな能力があります。}}
+
{{Note|データの保存や冗長性のために RAID アレイを使おうと思っているユーザーは [[ZFS]] によって実装されている RAIDZ についても採用を検討すると良いでしょう。ソフトウェア RAID の代替としてより近代的でパワフルな能力があります。}}
   
 
===通常の RAID レベル===
 
===通常の RAID レベル===
75行目: 75行目:
 
:* 抽象レイヤー (例: [[#セットアップ|mdadm]])。 {{Note|このガイドで使用する方法です。}}
 
:* 抽象レイヤー (例: [[#セットアップ|mdadm]])。 {{Note|このガイドで使用する方法です。}}
 
:* 論理ボリュームマネージャ (例: [[LVM]])。
 
:* 論理ボリュームマネージャ (例: [[LVM]])。
:* ファイルシステムのコンポーネント (例: [[ZFS]])。
+
:* ファイルシステムのコンポーネント (例: [[ZFS]], [[Btrfs]])。
   
 
; ハードウェア RAID
 
; ハードウェア RAID
95行目: 95行目:
 
{{Warning|このステップではデバイス上の全てのデータを消去します、消去を行うデバイスを間違えないように気をつけて入力して下さい。}}
 
{{Warning|このステップではデバイス上の全てのデータを消去します、消去を行うデバイスを間違えないように気をつけて入力して下さい。}}
   
問題が発生しないように RAID の各デバイスで中身を[[Securely wipe disk|完全に消去]]したほうが良いでしょう。デバイスを既存のアレイから再利用する場合、古い RAID 設定情報を全て削除して下さい:
+
問題が発生しないように RAID の各デバイスで中身を[[ディスクの完全消去|完全に消去]]したほうが良いでしょう。デバイスを既存のアレイから再利用する場合、古い RAID 設定情報を全て削除して下さい:
 
# mdadm --zero-superblock /dev/<drive>
 
# mdadm --zero-superblock /dev/<drive>
   
118行目: 118行目:
 
{{Warning|下のサンプルをコピーペーストするだけですませないでください。頭を使って適切なオプション・ドライブ文字に置き換えましょう。}}
 
{{Warning|下のサンプルをコピーペーストするだけですませないでください。頭を使って適切なオプション・ドライブ文字に置き換えましょう。}}
   
{{Note|RAID1 アレイを [[Syslinux|Syslinux]] から起動する場合 syslinux v4.07 の制限として metadata の値をデフォルトの 1.2 ではなく 1.0 にする必要があります。}}
+
{{Note|RAID1 アレイを [[Syslinux]] から起動する場合 syslinux v4.07 の制限として metadata の値をデフォルトの 1.2 ではなく 1.0 にする必要があります。}}
   
 
以下の例では2つのデバイスによる RAID1 アレイを作成します:
 
以下の例では2つのデバイスによる RAID1 アレイを作成します:
204行目: 204行目:
 
=== mdadm フックを mkinitcpio.conf に追加する ===
 
=== mdadm フックを mkinitcpio.conf に追加する ===
 
{{Note|以下は chroot 中に実行します。}}
 
{{Note|以下は chroot 中に実行します。}}
init イメージに直接 mdadm のサポートを追加するために [[Mkinitcpio|mkinitcpio]] の [[Mkinitcpio#HOOKS|HOOKS]] セクションに {{ic|mdadm_udev}} を追加してください:
+
init イメージに直接 mdadm のサポートを追加するために [[mkinitcpio]] の [[Mkinitcpio#HOOKS|HOOKS]] セクションに {{ic|mdadm_udev}} を追加してください:
 
{{bc|1= HOOKS="base udev autodetect block '''mdadm_udev''' filesystems usbinput fsck"}}
 
{{bc|1= HOOKS="base udev autodetect block '''mdadm_udev''' filesystems usbinput fsck"}}
   
389行目: 389行目:
 
RAID をベンチマークするツールは複数存在します。同じ RAID ボリュームからマルチスレッドで読み取るときの速度向上が一番の改善点になります。
 
RAID をベンチマークするツールは複数存在します。同じ RAID ボリュームからマルチスレッドで読み取るときの速度向上が一番の改善点になります。
   
特に [http://sourceforge.net/projects/tiobench/ Tiobench] はフルスレッドによるディスク I/O を計測することでパフォーマンスがどれくらい向上したかベンチマークします。
+
{{AUR|tiobench}} はフルスレッドによるディスク I/O を計測することでパフォーマンスがどれくらい向上したかベンチマークします。
   
[http://www.coker.com.au/bonnie++/ Bonnie++] はひとつまたは複数のファイルへのデータベースタイプのアクセスをテストしたり、小さなファイルを作成・読込・削除することで Squid や INN、または Maildir フォーマットのメールなどといったプログラムの使用をシミュレートします。同梱されている [http://www.coker.com.au/bonnie++/zcav/ ZCAV] プログラムはディスクに書き込みを行わずにハードドライブの領域のパフォーマンスをテストします。
+
{{Pkg|bonnie++}} はひとつまたは複数のファイルへのデータベースタイプのアクセスをテストしたり、小さなファイルを作成・読込・削除することで Squid や INN、または Maildir フォーマットのメールなどといったプログラムの使用をシミュレートします。同梱されている [http://www.coker.com.au/bonnie++/zcav/ ZCAV] プログラムはディスクに書き込みを行わずにハードドライブの領域のパフォーマンスをテストします。
   
 
{{ic|hdparm}} を RAID のベンチマークに使っては'''いけません'''、出てくる結果には全く一貫性がありません。
 
{{ic|hdparm}} を RAID のベンチマークに使っては'''いけません'''、出てくる結果には全く一貫性がありません。

2015年8月5日 (水) 21:18時点における版

関連記事

この記事では RAID とは何なのか、そして mdadm によるソフトウェア RAID アレイの作成・管理方法を説明しています。

イントロダクション

この項目について詳しくは Wikipedia の記事を見て下さい: RAID

独立ディスク冗長アレイ (Redundant Array of Independent Disks, RAID) は複数のディスクドライブの構成部品 (一般的にはディスクドライブまたはそのパーティション) をまとめて一つの論理ユニットにするストレージ技術です。RAID の実装によって、この論理ユニットはファイルシステム、あるいは複数のパーティションを保持する追補的な透過レイヤーになります。データは "RAID レベル" と呼ばれる様々な方法によって、必要とされる冗長性やパフォーマンスにあわせて、ドライブに分散されます。RAID レベルの選択によって、ハードディスクが壊れた時にデータが喪失することを防いだり、パフォーマンスを向上させたり、あるいはその両方を実現できます。

ほとんどの RAID レベルでは冗長性が確保されていますが、RAID はデータが安全であることを保証するものではありません。火事があったときや、コンピュータが盗まれたとき、または複数のドライブが同時に壊れた場合など RAID はデータを保護しません。さらに、RAID でシステムをインストールするのは複雑な作業であり、そのときにデータを破壊してしまう可能性もあります。

警告: 従って、RAID を設定する前に、かならず全てのデータをバックアップしておきましょう。
ノート: データの保存や冗長性のために RAID アレイを使おうと思っているユーザーは ZFS によって実装されている RAIDZ についても採用を検討すると良いでしょう。ソフトウェア RAID の代替としてより近代的でパワフルな能力があります。

通常の RAID レベル

RAID のレベルはたくさん存在します、以下は最も一般的に使われているレベルです。

RAID 0
ストライピングを使ってディスクを結合します。RAID 0 には冗長性がありませんが、RAID とされています。耐障害性がない代わりに、速度が向上する恩恵があります。データが消失する可能性を差し引いても速度を上げる価値がある場合 (例えばスワップパーティション)、この RAID レベルを選択します。サーバーでは、RAID 1 や RAID 5 アレイを使う方が適切です。RAID 0 アレイのブロックデバイスのサイズは一番小さいコンポーネントパーティションとコンポーネントパーティションの数を掛けた値になります。
RAID 1
最もシンプルな RAID レベル: ミラーリングです。他の RAID レベルと同様に、パーティションを複数の物理ディスクドライブに配置した時にだけ意味をなします。ドライブのどれか一台が故障しても、RAID アレイによるブロックデバイスは通常通りに稼働し続けます。例ではスワップや一時的なデータを除いて全てを RAID 1 に保存します。ソフトウェア実装を使う場合、ブートパーティションで使えるのは RAID 1 レベルしかないので注意してください。ブートパーティションを読み込むブートローダーは RAID を認識できないながらも、RAID 1 のコンポーネントパーティションは通常のパーティションとして読み込めるからです。RAID 1 アレイのブロックデバイスのサイズは一番小さいコンポーネントパーティションと同じになります。
RAID 5
三台以上の物理ドライブが必要で、RAID 0 の速度・サイズのメリットを残しながら RAID 1 の冗長性を実現します。RAID 5 は RAID 0 と同じようにストライピングを使いますが、それに加えてそれぞれのディスクに分散してパリティブロックの記録を行います。ディスクが故障した時は、パリティブロックを利用して交換したディスクにデータを再構築します。RAID 5 は一台のディスクの喪失まで耐えることが可能です。
ノート: 速度とデータの冗長性を両得できることから RAID 5 はよく使われています。ただし一台のドライブが壊れてから、ドライブを置き換える前にもう一台ドライブが故障すると、全てのデータを喪失するので注意してください。

ネストされた RAID レベル

RAID 1+0
一般的に RAID 10 と呼ばれる、2つの標準 RAID レベルを組み合わせてパフォーマンスと冗長性を獲得する入れ子の RAID です。冗長性が非常に重要な場合に RAID 5 の代わりとして最適です。

RAID レベルの比較

RAID レベル データの冗長性 物理ドライブの利用効率 読込パフォーマンス 書込パフォーマンス 最小ドライブ数
0 なし 100% nX

最高

nX

最高

2
1 あり 50% nX (理論値)

1X (実測値)

1X 2
5 あり 67% - 94% (n−1)X

高速

(n−1)X

高速

3
6 あり 50% - 88% (n−2)X (n−2)X 4
10 あり 50% nX (理論値) (n/2)X 4

* n は利用するディスクの数。

実装

RAID デバイスの制御方法は様々です:

ソフトウェア RAID
不明瞭なプロプライエタリのファームウェアや使用するソフトウェアに依存しないため楽な実装方法です。アレイはオペレーティングシステムによって以下のいずれかで管理されます:
  • 抽象レイヤー (例: mdadm)。
    ノート: このガイドで使用する方法です。
  • 論理ボリュームマネージャ (例: LVM)。
  • ファイルシステムのコンポーネント (例: ZFS, Btrfs)。
ハードウェア RAID
PC に取り付けた専用のハードウェアカードにディスクを直接接続してアレイをダイレクトに制御します。ホストプロセッサ (CPU) とは独立したオンボードのプロセッサ上で RAID が処理されます。この方法はオペレーティングシステムから独立していますが、ハードウェア RAID コントローラを正しく作動させるためにはドライバーが必要になります。RAID アレイの設定は、メーカーによって、オプション ROM インターフェイスを使ったり、OS をインストールする際に専用のアプリケーションを使って行います。この設定は Linux からは見ることができません、システムには単一のディスクとして認識されます。
FakeRAID
このタイプのRAIDは正しくは BIOS またはオンボード RAID と呼ぶべきですが、ハードウェア RAID として偽って喧伝されています。アレイの管理はオプション ROM やファームウェアと (UEFI の場合) ファームウェアで RAID ロジックが実装される擬似的な RAID コントローラが行いますが、全ての RAID 機能が実装された完全な RAID コントローラではありません。そのため、このタイプの RAID は FakeRAID と呼称されることがあります。FakeRAID のコントローラは公式リポジトリdmraid を使って扱います。FakeRAID コントローラの例: Intel Rapid Storage, JMicron JMB36x RAID ROM, AMD RAID, ASMedia 106x など。

使用している RAID はどのタイプか?

ソフトウェア RAID の実装はユーザーによるため、ソフトウェア RAID を使ってることは簡単にわかります。

反対に、FakeRAID と真のハードウェア RAID を見分けるのは難しいかもしれません。上記の通り、しばしばメーカーはこれら二つの RAID タイプを誤って区別していることがあり、不当表示も考えられます。この場合、一番良い方法は lspci コマンドを実行して出力を見て RAID コントローラを調べることです。それからその RAID コントローラに関する情報がないか検索してみてください。完全なハードウェア RAID コントローラは多くの場合やや高価 (~$400+) であり、システムをカスタマイズする際、ハードウェア RAID 構成を選択するとコンピュータの価格にそれと分かるくらいの変化があるはずです。

セットアップ

公式リポジトリから mdadm をインストールして下さい。mdadm は普通のブロックデバイスを使って純粋なソフトウェア RAID を組むのに使われます: 元となるハードウェアは RAID ロジックを全く搭載せず、ディスクだけ供給します。mdadm はどんな組み合わせのブロックデバイスでも使うことができます。あまり一般的でない組み合わせであってもです。例えば、サムドライブを集めて RAID アレイを作成することが可能です。

デバイスの準備

警告: このステップではデバイス上の全てのデータを消去します、消去を行うデバイスを間違えないように気をつけて入力して下さい。

問題が発生しないように RAID の各デバイスで中身を完全に消去したほうが良いでしょう。デバイスを既存のアレイから再利用する場合、古い RAID 設定情報を全て削除して下さい:

# mdadm --zero-superblock /dev/<drive>

もしくはドライブの特定パーティションを削除する場合は:

# mdadm --zero-superblock /dev/<partition>
ノート: パーティションのスーパーブロックを消去してもディスク上の他のパーティションに影響を与えることはありません。

パーティションテーブルの作成

アレイで使用する前にディスクをパーティションすることが強く推奨されます。ほとんどの RAID ユーザーは 2 TB 以上の HDD を選択するため、GPT パーティションテーブルが必須または推奨です。gptfdisk を使うことでディスクを簡単にパーティションすることができます。

  • 作成後、パーティションのタイプにはヘックスコード FD00 を指定してください。
  • 各デバイスに作成するパーティションのサイズは同じ大きさにすることを推奨します。
  • パーティションするときはデバイスの末端に 100 MB の空きスペースを残すと良いでしょう。根拠は下を見て下さい。
ノート: (パーティションを作らずに) 生のディスク上に直接 RAID を作成することも可能ですが、故障したディスクを交換するときに問題が起こることがあるのであまり推奨されません。

RAID の故障したディスクを置き換える時は、新しいディスクの容量は故障したディスクのサイズと全く同じまたはそれ以上でなくてはなりません - そうでないとアレイの再作成プロセスが作動しません。同じメーカーの同じモデルのハードドライブだとしても容量には多少の誤差があることがあります。ディスクの最後に未使用のスペースを残しておくことでドライブ間の容量の違いを埋め合わせることができ、また、ドライブの機種を置き換えることが楽になります。従って、ディスクの最後に未割り当て領域を 100 MB 残しておくことはグッドプラクティスと言えます

アレイの作成

mdadm を使ってアレイを作成します。以下では複数の例をあげています。

警告: 下のサンプルをコピーペーストするだけですませないでください。頭を使って適切なオプション・ドライブ文字に置き換えましょう。
ノート: RAID1 アレイを Syslinux から起動する場合 syslinux v4.07 の制限として metadata の値をデフォルトの 1.2 ではなく 1.0 にする必要があります。

以下の例では2つのデバイスによる RAID1 アレイを作成します:

# mdadm --create --verbose --level=1 --metadata=1.2 --chunk=64 --raid-devices=2 /dev/md0 /dev/sdb1 /dev/sdc1
ノート: 実際には RAID1 では chunk スイッチは必要ありません。

以下の例では4つのデバイスによる RAID5 アレイを作成します:

# mdadm --create --verbose --level=5 --metadata=1.2 --chunk=256 --raid-devices=4 /dev/md0 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 --spare-devices=1 /dev/sdf1

アレイは仮想デバイス /dev/mdX 下に作成され、編成されて (縮退モードで) 使用できるようになります。バックグラウンドで mdadm がアレイをリシンクしている間、仮想デバイスを使って直接起動することが可能です。パリティのリストアには長い時間かかるかもしれません。次のコマンドで進捗を確認できます:

$ cat /proc/mdstat

設定ファイルの更新

新しい RAID アレイを作成した後は、デフォルトの設定ファイルである mdadm.conf を以下のようにして更新する必要があります:

# mdadm --detail --scan >> /etc/mdadm.conf

このコマンドを実行したらテキストファイルで mdadm.conf 設定ファイルをチェックして中身が問題ないか確認してください。

アレイの構築

設定ファイルを更新できたら mdadm を使ってアレイを構築することができます:

# mdadm --assemble --scan

RAID ファイルシステムのフォーマット

アレイは他のディスクと同じようにフォーマットすることができます、覚えておくべきことは:

  • ボリュームサイズが巨大になるため適合しないファイルシステムが存在します (参照: ファイルシステムの制限)。
  • オンラインでのサイズの拡大や縮小に対応しているファイルシステムがふさわしいでしょう (参照: ファイルシステムの機能)。
  • パフォーマンスを最適化するために適切なストライドとストライプ幅を計算するべきです。

ストライドとストライプ幅の計算

ストライド = (チャンクサイズ / ブロックサイズ)。

ストライプ幅 = (物理データディスクの数 * ストライド)。

例 1. RAID0

適切なストライプ幅とストライドで ext4 にフォーマットする例:

  • 仮に2つの物理ディスクで構成される RAID0 アレイとします。
  • チャンクサイズは 64k。
  • ブロックサイズは 4k。

ストライド = (チャンクサイズ / ブロックサイズ)。 この例では、(64/4) となりストライド = 16です。

ストライプ幅 = (物理データディスクの数 * ストライド)。 この例では、(2*16) となりストライプ幅 = 32です。

# mkfs.ext4 -v -L myarray -m 0.5 -b 4096 -E stride=16,stripe-width=32 /dev/md0
例 2. RAID5

適切なストライプ幅とストライドで ext4 にフォーマットする例:

  • 仮に4つの物理ディスクで構成される RAID5 アレイとします。3つはデータディスクで1つはパリティディスクです。
  • チャンクサイズは 256k。
  • ブロックサイズは 4k。

ストライド = (チャンクサイズ / ブロックサイズ)。 この例では、(256/4) となりストライド = 64です。

ストライプ幅 = (物理データディスクの数 * ストライド)。 この例では、(3*64) となりストライプ幅 = 192です。

# mkfs.ext4 -v -L myarray -m 0.5 -b 4096 -E stride=64,stripe-width=192 /dev/md0

ストライドとストライプ幅に関する詳細は、次を参照: RAID Math

ライブ CD からマウント

ライブ CD から RAID パーティションをマウントしたい場合、次のコマンドを使います:

# mdadm --assemble /dev/<disk1> /dev/<disk2> /dev/<disk3> /dev/<disk4>

RAID に Arch Linux をインストール

ノート: 以下のセクションは root ファイルシステムがアレイ上にある場合にのみ当てはまります。データパーティションをアレイに収納する場合はこのセクションをスキップしてかまいません。

インストール手順のパーティショニングフォーマットの間に RAID アレイを作成してください。root ファイルシステムにするパーティションを直接フォーマットする代わりに、RAID アレイの上に作成します。 セットアップセクションの指示に従って RAID アレイを作成してください。その後はインストールの手順に従って pacstrap のステップが完了するところまで進みます。

設定ファイルの更新

ノート: 以下は chroot の外で実行します、そしてファイルパスには /mnt を前に付けます。

ベースシステムをインストールしたら、デフォルトの設定ファイル mdadm.conf を次のようにして更新する必要があります:

# mdadm --detail --scan >> /mnt/etc/mdadm.conf

上のコマンドを実行した後は、かならずテキストエディタを使って mdadm.conf 設定ファイルをチェックして中身が問題ないか確認してください。

インストールの手順に戻って “Initial ramdisk 環境の作成” のステップまで進んだら、次のセクションを見て下さい。

mdadm フックを mkinitcpio.conf に追加する

ノート: 以下は chroot 中に実行します。

init イメージに直接 mdadm のサポートを追加するために mkinitcpioHOOKS セクションに mdadm_udev を追加してください:

HOOKS="base udev autodetect block mdadm_udev filesystems usbinput fsck"

HOOKS に変更を加えた後は initramfs イメージを再生成します (イメージ作成とアクティベーションを参照):

# mkinitcpio -p linux

syslinux の設定

syslinux ブートローダーを使用する場合、/boot/syslinux/syslinux.cfg でカーネルコマンドラインを設定する必要があります。Change the APPEND 行を変更して RAID アレイを記載してください。以下の例では3つの RAID 1 アレイを記述しており適当な1つを root として設定しています:

APPEND root=/dev/md1 rw md=0,/dev/sda2,/dev/sdb2 md=1,/dev/sda3,/dev/sdb3 md=2,/dev/sda4,/dev/sdb4

上記のカーネルデバイスノードによる方法だとソフトウェア raid パーティションからの起動が失敗する場合、もうひとつの信頼性のある方法としてパーティションラベルを使う方法があります:

APPEND root=LABEL=THEROOTPARTITIONLABEL rw

RAID のメンテナンス

スクラビング

誤りをチェック・修正するために定期的にデータスクラビングを実行するのは良い習慣です。アレイのサイズや設定にもよりますが、スクラブは完了するまでかなり時間がかかります。

データスクラブを開始するには:

# echo check > /sys/block/md0/md/sync_action

check オペレーションは不良セクタがないかドライブをスキャンして自動的に不良セクタを修復します。不良データ (他のディスクが示すデータと一致しないセクタのデータ、例えば、パリティブロックと他のデータブロックによって該当するデータブロックが不正だと判断される場合など) を含んでいる良好セクタを見つけた場合、対処は何もされませんが、イベントが記録されます (下を参照)。"何もされない"ことで、管理者はセクタのデータと、重複するデータからセクタを再生成することで得られるデータを検査して正しいデータを選んで保持することができます。

mdadm に関連する様々なタスクやアイテムと同様に、スクラブの状態は /proc/mdstat を読み出すことで調べることができます。

例:

$ cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1] 
md0 : active raid1 sdb1[0] sdc1[1]
      3906778112 blocks super 1.2 [2/2] [UU]
      [>....................]  check =  4.0% (158288320/3906778112) finish=386.5min speed=161604K/sec
      bitmap: 0/30 pages [0KB], 65536KB chunk

実行中のデータスクラブを安全に停止するには:

# echo idle > /sys/block/md0/md/sync_action
ノート: スクラブを途中で中止した後にシステムを再起動してしまうと、スクラブはもういちど最初からやり直されます。

スクラブが完了したら、(不良セクタがあった場合) いくつのブロックが不良として判断されたか確認することができます:

# cat /sys/block/md0/md/mismatch_cnt

スクラビングの一般的な注意事項

ノート: ユーザーは /sys/block/md0/md/sync_action に repair を echo することもできますが、データにミスマッチが発生したとき、一貫性のために自動的に更新が行われるため、推奨されません。正しいパリティまたはデータブロックなのか (RAID1 の場合どちらのデータブロックなのか) 判断することができないのが危険です。この操作によって間違ったデータではなく正しいデータが選択されるかどうかは一か八かです。

定期的にスクラブを root で実行する cron ジョブを設定するのは良い考えです。ジョブの設定に役立つ raid-checkAUR を見て下さい。

スクラビングの RAID1 と RAID10 の注意事項

カーネルにおける RAID1 と RAID10 の書き込みはバッファがないため、アレイが問題ないときでもアレイにゼロ以外のミスマッチがカウントされることがあります。このようなゼロ以外のカウントは一時的なデータ領域にしか存在せず、問題は起こりません。しかしながら、一時的なデータのゼロ以外のカウントと実際に問題が起こっていることを示すゼロ以外のカウントを見分けることはできません。このために RAID1 や RAID10 アレイでは誤検知が発生することがあります。それでもデバイスにあるかもしれない不良セクタを見つけて直すために定期的にスクラブすることを推奨します。

アレイからデバイスを削除する

アレイからデバイスを削除する際は削除する前にそのデバイスが壊れているとマークを付けます:

# mdadm --fail /dev/md0 /dev/sdxx

そしてアレイからデバイスを削除します:

# mdadm -r /dev/md0 /dev/sdxx

ドライブを完全に削除するときは (例えば、今後別の方法で使用する) 上記の2つのコマンドを実行した後に:

# mdadm --zero-superblock /dev/sdxx
警告: Reusing the removed disk without zeroing the superblock WILL CAUSE LOSS OF ALL DATA on the next boot. (After mdadm will try to use it as the part of the raid array). DO NOT issue this command on linear or RAID0 arrays or data LOSS will occur!

アレイの使用を停止:

  1. 対象のアレイをアンマウント
  2. 次のコマンドでアレイを停止: mdadm --stop /dev/md0
  3. セクションの最初に書かれている3つのコマンドを各デバイスで繰り返し実行。
  4. /etc/mdadm.conf から対応する行を削除

アレイに新しいデバイスを追加する

デバイスがマウントされている動作中のシステム上で mdadm を使って新しいデバイスを追加することができます。上述しているように既存のアレイの一つとして同じレイアウトを使って新しいデバイスをパーティションしてください。

RAID アレイを構築していない場合は構築します:

# mdadm --assemble /dev/md0 /dev/sda1 /dev/sdb1

アレイに新しいデバイスを追加:

# mdadm --add /dev/md0 /dev/sdc1

mdadm がデバイスを追加するのにはあまり時間はかかりません。進捗を確認するには:

# cat /proc/mdstat

デバイスが追加されたかは次のコマンドで確認:

# mdadm --misc --detail /dev/md0

RAID0 アレイの場合

以下のようなエラーが表示された場合:

mdadm: add new device failed for /dev/sdc1 as 2: Invalid argument

これはおそらく RAID0 を使っていることが原因です。上のコマンドは新しいディスクを"スペア"として追加しますが、RAID0 にはスペアは存在しません。RAID0 アレイにデバイスを追加したいときは、一つのコマンドで "grow" して "add" する必要があります:

# mdadm --grow /dev/md0 --raid-devices=3 --add /dev/sdc1

監視

RAID デバイスの状態を出力するシンプルなワンライナー:

awk '/^md/ {printf "%s: ", $1}; /blocks/ {print $NF}' </proc/mdstat
md1: [UU]
md0: [UU]

Watch mdstat

watch -t 'cat /proc/mdstat'

または tmux を使う場合:

tmux split-window -l 12 "watch -t 'cat /proc/mdstat'"

iotop で IO を追跡

iotop パッケージはプロセスの入出力の統計を表示します。次のコマンドを使って raid スレッドの IO を表示することができます。

iotop -a -p $(sed 's, , -p ,g' <<<`pgrep "_raid|_resync|jbd2"`)

iostat で IO を追跡

sysstat パッケージに入っている iostat ユーティリティはデバイスやパーティションの入出力の統計を表示します。

 iostat -dmy 1 /dev/md0
 iostat -dmy 1 # all

イベントでメールを送信

smtp メールサーバー (sendmail) かメールフォワーダ (ssmtp/msmtp) が必要です。おそらく一番シンプルな方法は dmaAUR を使うことです。とても小さく (インストール容量 0.08 MiB) でセットアップがいりません。

/etc/mdadm.conf を編集して通知を受信するメールアドレスを指定します。

ノート: If using dma as mentioned above, users may simply mail directly to the username on the localhost rather than to an external email address.

設定をテストするには:

# mdadm --monitor --scan -1 --test

mdadm には監視作業を行う systemd サービス (mdmonitor.service) が含まれているため、ここで、やるべきことはもうありません。/etc/mdadm.conf でメールアドレスを設定していないと、サービスは失敗します。mdadm イベントでメールを受けとりたくない場合は、サービスの失敗は無視してかまいません。通知を表示したくなく、失敗メッセージが気になるならば、ユニットをマスクしてください。

その他の方法

smtp メールサーバーやメールフォワーダをインストールする代わりに、既存の S-nail ツールを使うこともできます (忘れずにセットアップしてください)。

以下の内容で /etc/mdadm_warning.sh という名前のファイルを作成:

#!/bin/bash
event=$1
device=$2

echo " " | /usr/bin/mailx -s "$event on $device" destination@email.com

実行権限を与えます: chmod +x /etc/mdadm_warning.sh

それから mdadm.conf にこのファイルを追加してください:

PROGRAM /etc/mdadm_warning.sh

前記の方法と同じ方法でテスト・有効化します。

トラブルシューティング

再起動した時に "invalid raid superblock magic" というエラーが表示される場合、ハードドライブを追加したときは、ハードドライブの順番が正しいか確認してください。インストール時の RAID デバイスは hdd, hde, hdf だったとしても起動時には hda, hdb, hdc になっているかもしれません。カーネルラインをそれにあわせて修正してください。

エラー: "kernel: ataX.00: revalidation failed"

突然 (再起動後または BIOS の設定を変更した後) 以下のようなエラーメッセージが表示された場合:

Feb  9 08:15:46 hostserver kernel: ata8.00: revalidation failed (errno=-5)

これは必ずしもドライブが壊れたことを意味しているわけはありません。要するに、まだあわてるような時間じゃありません。BIOS やカーネルパラメータで APIC または ACPI 設定を変更した場合、設定を戻せば問題ないはずです。大抵は、ACPI をオフにすれば直ります。

読み取り専用でアレイを起動

md アレイが起動すると、スーパーブロックが書き出され、resync が走ることがあります。読み取り専用で起動するにはカーネルモジュール md_mod のパラメータ start_ro を設定します。これが設定されている場合、新しいアレイは 'auto-ro' モードになり、内部 io (スーパーブロックの更新, resync, recovery) が全て無効化されて、書き込みリクエストが来た時に初めて 'rw' に自動的に切り替わります。

ノート: The array can be set to true 'ro' mode using mdadm -r before the first write request, or resync can be started without a write using mdadm -w.

起動時にパラメータを設定するには、カーネル行に md_mod.start_ro=1 を追加してください。

もしくはモジュールのロード時に /etc/modprobe.d/ ファイルや /sys/ から直接設定します。

echo 1 > /sys/module/md_mod/parameters/start_ro

raid の故障したまたは存在しないドライブからリカバリする

何らかの理由でドライブの一つが壊れた時も上述のエラーが表示されることがあります。その場合、ディスクが一つ足りない状態でも raid がオンになるようにしなくてはなりません。次のコマンドを入力 (必要に応じて変更してください):

# mdadm --manage /dev/md0 --run

これで次のようにしてまたマウントできるようになったはずです (fstab で記述している場合):

# mount /dev/md0

raid がまた動作するようになって使えるようにはなりましたが、ディスクが一つ不足しています。ディスクを追加するためにデバイスの準備で記述しているようにしてパーティションしてください。パーティションしたら次のコマンドで raid に新しいディスクを追加できます:

# mdadm --manage --add /dev/md0 /dev/sdd1

次を入力すれば:

# cat /proc/mdstat

raid が有効になって再構築されたことが確認できるでしょう。

設定を更新しても良いかもしれません (参照: 設定ファイルの更新)。

ベンチマーク

RAID をベンチマークするツールは複数存在します。同じ RAID ボリュームからマルチスレッドで読み取るときの速度向上が一番の改善点になります。

tiobenchAUR はフルスレッドによるディスク I/O を計測することでパフォーマンスがどれくらい向上したかベンチマークします。

bonnie++ はひとつまたは複数のファイルへのデータベースタイプのアクセスをテストしたり、小さなファイルを作成・読込・削除することで Squid や INN、または Maildir フォーマットのメールなどといったプログラムの使用をシミュレートします。同梱されている ZCAV プログラムはディスクに書き込みを行わずにハードドライブの領域のパフォーマンスをテストします。

hdparm を RAID のベンチマークに使ってはいけません、出てくる結果には全く一貫性がありません。

参照

mdadm

フォーラムスレッド

RAID と暗号化