「RAID」の版間の差分
(→RAID ファイルシステムのフォーマット: 誤訳を修正) |
(TranslationStatus) |
||
(同じ利用者による、間の14版が非表示) | |||
1行目: | 1行目: | ||
− | {{Translateme|翻訳が古くなっています。}} |
||
[[Category:ストレージ仮想化]] |
[[Category:ストレージ仮想化]] |
||
[[en:RAID]] |
[[en:RAID]] |
||
238行目: | 237行目: | ||
==== ストライドとストライプ幅の計算 ==== |
==== ストライドとストライプ幅の計算 ==== |
||
+ | ファイルシステムの構造を基底の RAID 構造に合うように最適化するには''ストライド''と''ストライプ幅''の2つを調整する必要があります。これらは RAID の''チャンクサイズ''、ファイルシステムの''ブロックサイズ''、''"データディスク"の数''から導かれます。 |
||
− | まずはストライドを計算してください: |
||
+ | チャンクサイズは RAID アレイのプロパティであり、RAID の作成時に決まります。{{ic|mdadm}} の現在のデフォルト値は 512 KiB です。{{ic|mdadm}} を使えば、チャンクサイズを調べられます: |
||
− | ストライド = (チャンクサイズ / ブロックサイズ) |
||
+ | # mdadm --detail /dev/mdX | grep 'Chunk Size' |
||
− | 最適なストライドを計算するために、以下に注意してください: |
||
− | * Arch では大抵のファイルシステムのデフォルトブロックサイズは 4096 (4 KiB) です。詳しくは {{ic|/etc/mke2fs.conf}} を見て下さい。 |
||
− | * ''チャンクサイズ''はユーザーが指定することができる 4K (1ブロック: [[Advanced Format]] ディスクでない場合は512バイト) から 64K まで、あるいはそれ以上の値です。{{ic|mdadm}} のデフォルトで選択されるチャンクサイズは 512 KiB です ({{ic|<nowiki># mdadm --detail /dev/mdX | grep 'Chunk Size'</nowiki>}} で確認できます)。巨大なファイルを日常的に使用する場合 (ビデオ編集やグラフィック処理など)、チャンクサイズを小さくすることで巨大なファイルのアクセス速度を向上させることができます。 |
||
+ | ブロックサイズはファイルシステムのプロパティであり、''ファイルシステムの作成時に''決まります。多くのファイルシステム (ext4 を含む) でデフォルトのブロックサイズは 4 KiB となっています。ext4 に関する詳細は {{ic|/etc/mke2fs.conf}} を参照してください。 |
||
− | {{Tip|最適なチャンクサイズについては [http://www.zdnet.com/article/chunks-the-hidden-key-to-raid-performance/ Chunks: the hidden key to RAID performance] を参照してください。}} |
||
+ | "データディスク"の数とは、データの損失を引き起こさずに完全にアレイを再構築するのに必要なデバイスの最小数です。例えば、N 個のデバイスからなるアレイでは RAID0 では N 個となり、RAID5 では N - 1 個となります。 |
||
− | 次に、ストライプ幅を計算してください: |
||
+ | これら3つの値がわかったら、以下の公式でストライドとストライプ幅を計算できます: |
||
− | ストライプ幅 = (物理'''データ'''ディスクの数 * ストライド) |
||
+ | |||
+ | ストライド = チャンクサイズ / ブロックサイズ |
||
+ | ストライプ幅 = データディスクの数 * ストライド |
||
===== 例 1. RAID0 ===== |
===== 例 1. RAID0 ===== |
||
− | 適切なストライプ幅とストライドで ext4 にフォーマットする例: |
||
− | * 仮に2つの物理ディスクで構成される RAID0 アレイとします。 |
||
− | * チャンクサイズは 64k。 |
||
− | * ブロックサイズは 4k。 |
||
− | ストライド |
+ | 適切なストライドとストライプ幅で ext4 でフォーマットする例: |
+ | * 仮に RAID0 アレイは2つの物理ディスクからなるとします。 |
||
− | ストライプ幅 = (物理'''データ'''ディスクの数 * ストライド)。この例では、(2*16) となりストライプ幅 = 32です。 |
||
+ | * チャンクサイズは 512 KiB とします。 |
||
+ | * ブロックサイズは 4 KiB です。 |
||
+ | ストライド = チャンクサイズ / ブロックサイズ。この例では、512 / 4 となり、ストライド = 128 です。 |
||
− | # mkfs.ext4 -v -L myarray -m 0.5 -b 4096 -E stride=16,stripe-width=32 /dev/md0 |
||
+ | |||
+ | ストライプ幅 = 物理'''データ'''ディスクの数 * ストライド。この例では、2 * 128 となり、ストライプ幅 = 256 です。 |
||
+ | |||
+ | # mkfs.ext4 -v -L myarray -b 4096 -E stride=128,stripe-width=256 /dev/md0 |
||
===== 例 2. RAID5 ===== |
===== 例 2. RAID5 ===== |
||
− | 適切なストライプ幅とストライドで ext4 にフォーマットする例: |
||
− | * 仮に4つの物理ディスクで構成される RAID5 アレイとします。3つはデータディスクで1つはパリティディスクです。 |
||
− | * チャンクサイズは 256k。 |
||
− | * ブロックサイズは 4k。 |
||
− | ストライド |
+ | 適切なストライドとストライプ幅で ext4 でフォーマットする例: |
+ | * 仮に RAID5 アレイは4つの物理ディスクからなり、3つはデータディスク、1つはパリティディスクとします。 |
||
− | ストライプ幅 = (物理'''データ'''ディスクの数 * ストライド)。この例では、(3*64) となりストライプ幅 = 192です。 |
||
+ | * チャンクサイズは 512 KiB とします。 |
||
+ | * ブロックサイズは 4 KiB です。 |
||
+ | ストライド = チャンクサイズ / ブロックサイズ。この例では、512 / 4 となり、ストライド = 128 です。 |
||
− | # mkfs.ext4 -v -L myarray -m 0.5 -b 4096 -E stride=64,stripe-width=192 /dev/md0 |
||
+ | ストライプ幅 = 物理'''データ'''ディスクの数 * ストライド。この例では、3 * 128 となり、ストライプ幅 = 384 です。 |
||
− | ===== 例 3. RAID10 (far2) ===== |
||
− | 適切なストライプ幅とストライドで ext4 にフォーマットする例: |
||
− | * 仮に2つの物理ディスクで構成される RAID10 アレイとします。far2 レイアウトの RAID10 なので当然、2つともデータディスクになります。 |
||
− | * チャンクサイズは 512k。 |
||
− | * ブロックサイズは 4k。 |
||
+ | # mkfs.ext4 -v -L myarray -b 4096 -E stride=128,stripe-width=384 /dev/md0 |
||
− | ストライド = (チャンクサイズ / ブロックサイズ)。この例では、(512/4) となりストライド = 128です。 |
||
+ | ストライドとストライプ幅に関する詳細は [https://wiki.centos.org/HowTos/Disk_Optimization RAID Math] を参照してください。 |
||
− | ストライプ幅 = (物理'''データ'''ディスクの数 * ストライド)。この例では、(2*128) となりストライプ幅 = 256です。 |
||
+ | ===== 例 3. RAID10,far2 ===== |
||
− | # mkfs.ext4 -v -L myarray -m 0.01 -b 4096 -E stride=128,stripe-width=256 /dev/md0 |
||
+ | |||
+ | 適切なストライドとストライプ幅で ext4 でフォーマットする例: |
||
+ | |||
+ | * 仮に RAID10 アレイは2つの物理ディスクからなるとします。far2 レイアウトでの RAID10 の性質上、これら2つともデータディスクとしてカウントします。 |
||
+ | * チャンクサイズは 512 KiB とします。 |
||
+ | * ブロックサイズは 4 KiB です。 |
||
+ | |||
+ | ストライド = チャンクサイズ / ブロックサイズ。この例では、512 / 4 となり、ストライド = 128 です。 |
||
+ | |||
+ | ストライプ幅 = 物理'''データ'''ディスクの数 * ストライド。この例では、2 * 128 となり、ストライプ幅 = 256 です。 |
||
+ | |||
+ | # mkfs.ext4 -v -L myarray -b 4096 -E stride=128,stripe-width=256 /dev/md0 |
||
== ライブ CD からマウント == |
== ライブ CD からマウント == |
||
+ | |||
ライブ CD から RAID パーティションをマウントしたい場合、次のコマンドを使います: |
ライブ CD から RAID パーティションをマウントしたい場合、次のコマンドを使います: |
||
− | # mdadm --assemble /dev/<disk1> /dev/<disk2> /dev/<disk3> /dev/<disk4> |
||
+ | # mdadm --assemble /dev/md''number'' /dev/''disk1'' /dev/''disk2'' /dev/''disk3'' /dev/''disk4'' |
||
− | ディスクアレイが存在しないのに誤って RAID 1 と認識されて ({{ic|mdadm --detail /dev/md<number>}})、inactive と報告される場合 ({{ic|cat /proc/mdstat}})、先にアレイを停止してください: |
||
+ | |||
− | # mdadm --stop /dev/md<number> |
||
+ | ディスクアレイの無い RAID 1 が RAID 1 と自動で誤検出され ({{ic|mdadm --detail /dev/md''number''}} の出力でわかります)、非アクティブであると報告される場合 ({{ic|cat /proc/mdstat}} でわかります)、先にアレイを停止してください: |
||
+ | |||
+ | # mdadm --stop /dev/md''number'' |
||
== RAID に Arch Linux をインストール == |
== RAID に Arch Linux をインストール == |
||
+ | |||
− | {{Note|以下のセクションは root ファイルシステムがアレイ上にある場合にのみ当てはまります。データパーティションをアレイに収納する場合はこのセクションをスキップしてかまいません。}} |
||
+ | {{Note|以下のセクションは root ファイルシステムがアレイ上にある場合のみを対象としています。単なるデータ保管用のパーティションをアレイに格納する場合はこのセクションをスキップして構いません。}} |
||
− | インストール手順の[[パーティショニング]]と[[ファイルシステム#デバイスのフォーマット|フォーマット]]の間に RAID アレイを作成してください。root ファイルシステムにするパーティションを直接フォーマットする代わりに、RAID アレイの上に作成します。[[#セットアップ|セットアップ]]セクションの指示に従って RAID アレイを作成してください。その後はインストールの手順に従って pacstrap のステップが完了するところまで進みます。[[Unified Extensible Firmware Interface|UEFI]] で起動する場合、[[EFI システムパーティション#RAID 上に ESP を配置]]も読んでください。 |
||
+ | |||
+ | [[インストールガイド|インストール手順]]の[[パーティショニング]]ステップと[[ファイルシステム#ファイルシステムを作成する|フォーマット]]ステップの間で RAID アレイを作成する必要があります。Root ファイルシステムにするパーティションを直接フォーマットせずに、RAID アレイ上に作成します。[[#インストール]] セクションの指示に従って RAID アレイを作成してください。その後は、pacstrap の手順が終わる所までインストール手順に従ってください。[[Unified Extensible Firmware Interface|UEFI]] で起動する場合、[[EFI システムパーティション#ソフトウェア RAID1 上に ESP を配置する]] も読んでください。 |
||
=== 設定ファイルの更新 === |
=== 設定ファイルの更新 === |
||
+ | |||
− | {{Note|以下は chroot の外で実行します、そしてファイルパスには /mnt を前に付けます。}} |
||
+ | {{Note|以下は chroot 環境の外で行う必要があります。なので、ファイルパスには {{ic|/mnt}} を前に付けます。}} |
||
+ | |||
ベースシステムをインストールしたら、デフォルトの設定ファイル {{ic|mdadm.conf}} を次のようにして更新する必要があります: |
ベースシステムをインストールしたら、デフォルトの設定ファイル {{ic|mdadm.conf}} を次のようにして更新する必要があります: |
||
+ | |||
# mdadm --detail --scan >> /mnt/etc/mdadm.conf |
# mdadm --detail --scan >> /mnt/etc/mdadm.conf |
||
− | 上のコマンドを実行した後は、 |
+ | 上のコマンドを実行した後は、必ずテキストエディタ等を使って {{ic|mdadm.conf}} 設定ファイルをチェックして、中身が問題ないか確認してください。 |
− | {{Note|起動時に ( |
+ | {{Note|起動時に {{ic|mdmonitor.service}} (udev によってアクティブ化されます) が失敗しないようにするには、{{ic|mdadm.conf}} の下部にある {{ic|MAILADDR}} をアンコメントし、アレイの問題を通知するためのメールアドレスやアプリケーションを指定する必要があります。[[#メールで通知する]] を参照してください。}} |
− | インストール |
+ | 再びインストール手順を続けて、[[インストールガイド#Initramfs]] の前まで進めてください。そこまで行ったら、この次のセクションを見てください。 |
− | === |
+ | === mkinitcpio の設定 === |
− | {{Note|以下は chroot 中に実行します。}} |
||
− | init イメージに直接 mdadm のサポートを追加するために [[mkinitcpio]] の [[Mkinitcpio#HOOKS|HOOKS]] セクションに {{ic|mdadm_udev}} を追加してください: |
||
− | HOOKS="base udev autodetect block '''mdadm_udev''' filesystems usbinput fsck" |
||
+ | {{Note|以下は chroot 環境内で行う必要があります。}} |
||
− | HOOKS に変更を加えた後は initramfs イメージを再生成します ([[Mkinitcpio#イメージ作成とアクティベーション|イメージ作成とアクティベーション]]を参照): |
||
+ | |||
− | # mkinitcpio -p linux |
||
+ | {{Pkg|mdadm}} を[[インストール]]し、initramfs イメージに mdadm のサポートを追加する {{ic|mdadm_udev}} を {{ic|mkinitcpio.conf}} の [[mkinitcpio#HOOKS|HOOKS]] 配列に追加してください: |
||
+ | |||
+ | {{hc|/etc/mkinitcpio.conf|2= |
||
+ | ... |
||
+ | HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block '''mdadm_udev''' filesystems fsck) |
||
+ | ... |
||
+ | }} |
||
+ | |||
+ | そして、[[initramfs を再生成する|initramfs を再生成]]してください。 |
||
+ | |||
+ | {{Note|{{ic|/etc/mdadm.conf}} に変更を加えたら必ず initramfs を再生成しなければなりません。}} |
||
=== ブートローダーの設定 === |
=== ブートローダーの設定 === |
||
+ | ==== root デバイス ==== |
||
− | RAID アレイごとに {{ic|md}} [[カーネルパラメータ]]を追加してください。また、{{ic|root}} パラメータでマッピングするデバイスを正しく指定します。以下の例では三つの RAID 1 アレイを記述しており適当な一つを root として設定しています: |
||
+ | |||
− | root=/dev/md1 md=0,/dev/sda2,/dev/sdb2 md=1,/dev/sda3,/dev/sdb3 md=2,/dev/sda4,/dev/sdb4 |
||
+ | マッピングされた RAID のデバイスを {{ic|root}} [[カーネルパラメータ]]で指定してください。例えば: |
||
+ | |||
+ | root=/dev/md/''MyRAIDArray'' |
||
+ | |||
+ | このカーネルデバイスノードを使ってソフトウェア RAID パーティションからのブートに失敗する場合、もう一つの方法は[[永続的なブロックデバイスの命名]]にある方法を使うことです。例えば: |
||
− | 上記のカーネルデバイスノードによる方法だとソフトウェア raid パーティションからの起動が失敗する場合、もうひとつの信頼性のある方法としてパーティションラベルを使う方法があります: |
||
root=LABEL=Root_Label |
root=LABEL=Root_Label |
||
[[GRUB#RAID]] も参照してください。 |
[[GRUB#RAID]] も参照してください。 |
||
+ | |||
+ | ==== RAID0 レイアウト ==== |
||
+ | |||
+ | {{Note|この章の内容は、古いバージョン Linux カーネルからバージョン 5.3.4 以上にアップグレードする mdraid RAID0 のユーザーにも関係します。}} |
||
+ | |||
+ | Linux カーネル 5.3.4 から、カーネルにどの RAID0 レイアウト (RAID0_ORIG_LAYOUT ({{ic|1}}) か RAID0_ALT_MULTIZONE_LAYOUT ({{ic|2}})) を使うべきかをカーネルに明示的に伝える必要があります。[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c84a1372df929033cb1a0441fb57bd3932f39ac9] 以下のように[[カーネルパラメータ]]を指定することで、カーネルに伝えることができます: |
||
+ | |||
+ | raid0.default_layout=2 |
||
+ | |||
+ | 指定するべき正しい値は、RAID アレイを作成した時に使っていたカーネルのバージョンに依ります。カーネル 3.14 及びそれ以前を使って作成した場合は {{ic|1}} を、それより新しいバージョンを使って作成した場合は {{ic|2}} を指定してください。どちらを使うべきか確認する一つの方法は、RAID アレイの作成日時を見ることです: |
||
+ | |||
+ | {{hc|mdadm --detail /dev/md1| |
||
+ | /dev/md1: |
||
+ | Version : 1.2 |
||
+ | Creation Time : Thu Sep 24 10:17:41 2015 |
||
+ | Raid Level : raid0 |
||
+ | Array Size : 975859712 (930.65 GiB 999.28 GB) |
||
+ | Raid Devices : 3 |
||
+ | Total Devices : 3 |
||
+ | Persistence : Superblock is persistent |
||
+ | |||
+ | Update Time : Thu Sep 24 10:17:41 2015 |
||
+ | State : clean |
||
+ | Active Devices : 3 |
||
+ | Working Devices : 3 |
||
+ | Failed Devices : 0 |
||
+ | Spare Devices : 0 |
||
+ | |||
+ | Chunk Size : 512K |
||
+ | |||
+ | Consistency Policy : none |
||
+ | |||
+ | Name : archiso:root |
||
+ | UUID : 028de718:20a81234:4db79a2c:e94fd560 |
||
+ | Events : 0 |
||
+ | |||
+ | Number Major Minor RaidDevice State |
||
+ | 0 259 2 0 active sync /dev/nvme0n1p1 |
||
+ | 1 259 6 1 active sync /dev/nvme2n1p1 |
||
+ | 2 259 5 2 active sync /dev/nvme1n1p2 |
||
+ | }} |
||
+ | |||
+ | ここでは、RAID アレイが2015年9月24日に作成されました。Linux カーネル 3.14 のリリース日は2014年3月30日ですので、この RAID アレイは multizone layout ({{ic|2}}) を使って作成された可能性が最も高いです。 |
||
== RAID のメンテナンス == |
== RAID のメンテナンス == |
||
+ | |||
+ | {{Translateme|翻訳が古くなっています。}} |
||
+ | |||
=== スクラビング === |
=== スクラビング === |
||
− | 誤りをチェック・修正するために定期的にデータ[[wikipedia:Data_scrubbing|スクラビング]]を実行するのは良い習慣です。アレイのサイズや設定にもよりますが、スクラブは完了するまでかなり時間がかかります。 |
||
+ | 誤りをチェック・修正するために定期的にデータ[[Wikipedia:Data scrubbing|スクラビング]]を実行するのは良い習慣です。アレイのサイズや設定にもよりますが、スクラビングは完了するまでに数時間かかる場合があります。 |
||
− | データスクラブを開始するには: |
||
+ | |||
+ | データスクラビングを開始するには: |
||
+ | |||
+ | To initiate a data scrub: |
||
+ | |||
# echo check > /sys/block/md0/md/sync_action |
# echo check > /sys/block/md0/md/sync_action |
||
− | + | Check オペレーションは不良セクタがないかドライブをスキャンして自動的に不良セクタを修復します。不良データ (他のディスクが示すデータと一致しないセクタのデータ、例えば、パリティブロックと他のデータブロックによって該当するデータブロックが不正だと判断される場合など) を含んでいる良好セクタを見つけた場合、対処は何もされませんが、イベントが記録されます (下を参照)。"何もされない"ことで、管理者はセクタのデータと、重複するデータからセクタを再生成することで得られるデータを検査して正しいデータを選んで保持することができます。 |
|
− | mdadm に関連する様々なタスクやアイテムと同様に、スクラ |
+ | mdadm に関連する様々なタスクやアイテムと同様に、スクラビングの状況は {{ic|/proc/mdstat}} を読み出すことで調べることができます。 |
例: |
例: |
||
+ | |||
− | {{hc|$ cat /proc/mdstat|<nowiki> |
||
+ | {{hc|$ cat /proc/mdstat|2= |
||
− | Personalities : [raid6] [raid5] [raid4] [raid1] |
||
+ | Personalities : [raid6] [raid5] [raid4] [raid1] |
||
md0 : active raid1 sdb1[0] sdc1[1] |
md0 : active raid1 sdb1[0] sdc1[1] |
||
3906778112 blocks super 1.2 [2/2] [UU] |
3906778112 blocks super 1.2 [2/2] [UU] |
||
[>....................] check = 4.0% (158288320/3906778112) finish=386.5min speed=161604K/sec |
[>....................] check = 4.0% (158288320/3906778112) finish=386.5min speed=161604K/sec |
||
bitmap: 0/30 pages [0KB], 65536KB chunk |
bitmap: 0/30 pages [0KB], 65536KB chunk |
||
+ | }} |
||
− | </nowiki>}} |
||
+ | |||
+ | 実行中のデータスクラビングを安全に停止するには: |
||
− | 実行中のデータスクラブを安全に停止するには: |
||
# echo idle > /sys/block/md0/md/sync_action |
# echo idle > /sys/block/md0/md/sync_action |
||
− | {{Note|スクラ |
+ | {{Note|スクラビングを途中で中止した後にシステムを再起動してしまうと、スクラビングはもういちど最初からやり直されます。}} |
+ | |||
+ | スクラビングが完了したら、(不良セクタがあった場合) いくつのブロックが不良として判断されたか確認することができます: |
||
− | スクラブが完了したら、(不良セクタがあった場合) いくつのブロックが不良として判断されたか確認することができます: |
||
# cat /sys/block/md0/md/mismatch_cnt |
# cat /sys/block/md0/md/mismatch_cnt |
||
==== スクラビングの一般的な注意事項 ==== |
==== スクラビングの一般的な注意事項 ==== |
||
− | {{Note|ユーザーは /sys/block/md0/md/sync_action に '''repair''' を echo することもできますが、データにミスマッチが発生したとき、一貫性のために自動的に更新が行われるため、推奨されません。正しいパリティまたはデータブロックなのか (RAID1 の場合どちらのデータブロックなのか) 判断することができないのが危険です。この操作によって間違ったデータではなく正しいデータが選択されるかどうかは一か八かです。}} |
||
+ | {{Note|ユーザーは {{ic|/sys/block/md0/md/sync_action}} に '''repair''' を echo することもできますが、データにミスマッチが発生したとき、一貫性のために自動的に更新が行われるため、推奨されません。正しいパリティまたはデータブロックなのか (RAID1 の場合どちらのデータブロックなのか) 判断することができないのが危険です。この操作によって間違ったデータではなく正しいデータが選択されるかどうかは一か八かです。}} |
||
− | 定期的にスクラブを root で実行する cron ジョブを設定するのは良い考えです。ジョブの設定に役立つ {{AUR|raid-check}} を見て下さい。cron の代わりに systemd タイマーを使ってスクラブを実行したい場合は {{AUR|raid-check-systemd}} をインストールしてください。systemd タイマーのユニットファイルとスクリプトが含まれています。 |
||
+ | 定期的にスクラビングを root で実行する cron ジョブを設定するのは良い考えです。ジョブの設定に役立つ {{AUR|raid-check}} を見て下さい。cron の代わりに systemd タイマーを使ってスクラビングを実行したい場合は {{AUR|raid-check-systemd}} をインストールしてください。このパッケージには systemd タイマーのユニットファイルとスクリプトが含まれています。 |
||
− | ==== スクラビングの RAID1 と RAID10 の注意事項 ==== |
||
− | カーネルにおける RAID1 と RAID10 の書き込みはバッファがないため、アレイが問題ないときでもアレイにゼロ以外のミスマッチがカウントされることがあります。このようなゼロ以外のカウントは一時的なデータ領域にしか存在せず、問題は起こりません。しかしながら、一時的なデータのゼロ以外のカウントと実際に問題が起こっていることを示すゼロ以外のカウントを見分けることはできません。このために RAID1 や RAID10 アレイでは誤検知が発生することがあります。それでもデバイスにあるかもしれない不良セクタを見つけて直すために定期的にスクラブすることを推奨します。 |
||
+ | {{Note|典型的な磁気ディスクにおいては、スクラビングは '''1ギガバイトあたり約6秒''' かかります (つまり、1テラバイトあたり1時間45分です)。cron ジョブやタイマーを開始する計画は適切に行ってください。}} |
||
− | ===アレイからデバイスを削除する=== |
||
+ | |||
− | アレイからデバイスを削除する際は削除する前にそのデバイスが壊れているとマークを付けます: |
||
+ | ==== RAID1 と RAID10 のスクラビングの注意事項 ==== |
||
− | # mdadm --fail /dev/md0 /dev/sdxx |
||
+ | |||
+ | カーネルにおける RAID1 と RAID10 の書き込みはバッファリングされないため、アレイが問題ないときでもアレイのミスマッチ数がゼロ以外になる可能性があります。このようなケースは一時的なデータ領域にしか発生しないため、問題は起こりません。しかしながら、一時的なデータ領域に発生しているミスマッチと、実際に問題が起こっていることによるミスマッチを見分けることはできません。このために RAID1 や RAID10 アレイでは誤検知が発生することがあります。それでもデバイスにあるかもしれない不良セクタを見つけて直すために定期的にスクラビングすることを推奨します。 |
||
+ | |||
+ | === アレイからデバイスを削除する === |
||
+ | |||
+ | アレイからデバイスを削除する際は削除する前にその[[ブロックデバイス]]が壊れているとマークを付けます: |
||
+ | |||
+ | # mdadm --fail /dev/md0 /dev/''failing_array_member'' |
||
そしてアレイからデバイスを削除します: |
そしてアレイからデバイスを削除します: |
||
− | # mdadm -r /dev/md0 /dev/sdxx |
||
+ | # mdadm --remove /dev/md0 /dev/''failing_array_member'' |
||
− | ドライブを完全に削除するときは (例えば、今後別の方法で使用する) 上記の2つのコマンドを実行した後に: |
||
+ | デバイスが完全には壊れていないが、交換したい場合 (壊れつつあるように思える場合など)、まず新しいドライブを追加しておいて、その後で交換したいドライブを置き換えることで、より簡単にドライブを交換することができます。 |
||
− | # mdadm --zero-superblock /dev/sdxx |
||
+ | |||
+ | 例えば、{{ic|/dev/sdc1}} を新しいドライブ、{{ic|/dev/sdb1}} を壊れているドライブとすると: |
||
+ | |||
+ | # mdadm /dev/md0 --add /dev/sdc1 |
||
+ | # mdadm /dev/md0 --replace /dev/sdb1 --with /dev/sdc1 |
||
+ | |||
+ | {{ic|--with /dev/sdc1}} の部分は必須ではありませんが、こうすることで交換後のデバイスを明示的に指定できます。詳細は [https://unix.stackexchange.com/questions/74924/how-to-safely-replace-a-not-yet-failed-disk-in-a-linux-raid5-array/104052#104052] を参照してください。 |
||
+ | |||
+ | デバイスを永続的に除去するには (例えば、そのデバイスを個別のデバイスとして使いたい場合など)、先の手順 (--fail/--remove または --add/--replace) の後に以下を実行してください: |
||
+ | |||
+ | # mdadm --zero-superblock /dev/''failing_array_member'' |
||
{{Warning| |
{{Warning| |
||
− | * 上記のコマンドを RAID0 アレイで実行してはいけません。データが消失してしまいます。 |
+ | * 上記のコマンドを linear や RAID0 のアレイで実行してはいけません。データが消失してしまいます。 |
− | * |
+ | * 除去したディスクを再利用する際は、そのディスクのスーパーブロックをゼロ消去しないと、次回起動時に全てのデータが消失します。(mdadm がそのディスクを RAID アレイの一部として使おうとするからです。) |
+ | }} |
||
+ | |||
+ | Stop using an array: |
||
+ | アレイの使用を停止するには: |
||
− | アレイの使用を停止: |
||
# 対象のアレイをアンマウント |
# 対象のアレイをアンマウント |
||
# 次のコマンドでアレイを停止: {{ic|mdadm --stop /dev/md0}} |
# 次のコマンドでアレイを停止: {{ic|mdadm --stop /dev/md0}} |
||
− | # |
+ | # この章の最初に書かれている3つのコマンドを各デバイスに対して実行する (訳注: --fail、--remove、そして --zero-superblock です)。 |
− | # {{ic|/etc/mdadm.conf}} から対応する行を削除 |
+ | # {{ic|/etc/mdadm.conf}} からこのアレイに対応する行を削除。 |
=== アレイに新しいデバイスを追加する === |
=== アレイに新しいデバイスを追加する === |
||
− | デバイスがマウントされている動作中のシステム上で mdadm を使って新しいデバイスを追加することができます。上述しているように既存のアレイの一つとして同じレイアウトを使って新しいデバイスをパーティションしてください。 |
||
+ | デバイスがマウントされている動作中のシステム上でも mdadm で新しいデバイスを追加することができます。上述のようにして、すでにアレイに存在しているものと同じレイアウトで新しいデバイスをパーティショニングしてください。 |
||
− | RAID アレイを構築していない場合は構築します: |
||
+ | |||
+ | まだされていない場合は RAID アレイをアセンブルしてください: |
||
+ | |||
# mdadm --assemble /dev/md0 /dev/sda1 /dev/sdb1 |
# mdadm --assemble /dev/md0 /dev/sda1 /dev/sdb1 |
||
− | + | 新しいデバイスをアレイに追加してください: |
|
+ | |||
# mdadm --add /dev/md0 /dev/sdc1 |
# mdadm --add /dev/md0 /dev/sdc1 |
||
− | mdadm がデバイスを追加するのに |
+ | mdadm がデバイスをアレイに追加するのに対して時間はかからないはずです。 |
+ | |||
+ | RAID のタイプによっては (例えば RAID1)、デバイスとデータを同期せずに、デバイスをスペアとして追加することもできます。RAID が使用するディスクの数は {{ic|--grow}} と {{ic|--raid-devices}} オプションで増やすことができます。例えば、アレイを4つのディスクに増やすには: |
||
+ | |||
+ | # mdadm --grow /dev/md0 --raid-devices=4 |
||
+ | |||
+ | 以下のコマンドで進捗を確認できます: |
||
+ | |||
# cat /proc/mdstat |
# cat /proc/mdstat |
||
− | デバイスが追加された |
+ | 以下のコマンドでデバイスが追加されたことを確認できます: |
+ | |||
# mdadm --misc --detail /dev/md0 |
# mdadm --misc --detail /dev/md0 |
||
− | + | {{Note|RAID0 アレイの場合は、以下のエラーメッセージが発生することがあります: |
|
− | 以下のようなエラーが表示された場合: |
||
mdadm: add new device failed for /dev/sdc1 as 2: Invalid argument |
mdadm: add new device failed for /dev/sdc1 as 2: Invalid argument |
||
− | これは |
+ | これは上記のコマンドが新しいディスクを「スペア」として追加しますが、RAID0 にはスペアは存在しないからです。RAID0 アレイにデバイスを追加したい場合は、以下のようにして同じコマンドで "grow" し、かつ "add" する必要があります: |
+ | |||
− | # mdadm --grow /dev/md0 --raid-devices=3 --add /dev/sdc1 |
||
+ | {{bc|1=# mdadm --grow /dev/md0 --raid-devices=3 --add /dev/sdc1}} |
||
+ | |||
+ | }} |
||
=== RAID ボリュームのサイズを増やす === |
=== RAID ボリュームのサイズを増やす === |
||
− | RAID アレイに巨大なディスクを追加した場合やパーティションサイズを増やした場合、RAID ボリュームのサイズを増加させて空き領域を埋めると良いでしょう。まずは上のセクションに従って |
+ | RAID アレイに巨大なディスクを追加した場合やパーティションサイズを増やした場合、RAID ボリュームのサイズを増加させて空き領域を埋めると良いでしょう。まずは、ディスクの交換に関する上記のセクションに従ってください。RAID ボリュームをより大きなディスク上に再構築したら、その領域を埋めるようにボリュームを拡張する必要があります。 |
+ | |||
# mdadm --grow /dev/md0 --size=max |
# mdadm --grow /dev/md0 --size=max |
||
+ | |||
− | そして RAID ボリューム {{ic|/dev/md0}} に存在するパーティションのサイズを変更してください。詳しくは[[パーティショニング]]を参照。最後に、パーティション内のファイルシステムをリサイズしてください。{{ic|gparted}} でパーティショニングした場合、自動的にリサイズされます。他のツールを使った場合、パーティションをアンマウントして手動でファイルシステムをリサイズしてください: |
||
+ | そして RAID ボリューム {{ic|/dev/md0}} に存在するパーティションのサイズを変更してください。詳しくは[[パーティショニング]]を参照。最後に、パーティション内のファイルシステムをリサイズしてください。{{ic|gparted}} でパーティショニングした場合、自動的にリサイズされます。他のツールを使った場合、ファイルシステムをアンマウントして手動でファイルシステムをリサイズしてください: |
||
− | {{bc| |
||
+ | |||
− | # umount /storage |
||
+ | # umount /storage |
||
− | # fsck.ext4 -f /dev/md0p1 |
||
− | # |
+ | # fsck.ext4 -f /dev/md0p1 |
+ | # resize2fs /dev/md0p1 |
||
− | }} |
||
=== 同期速度の制限を変更 === |
=== 同期速度の制限を変更 === |
||
423行目: | 537行目: | ||
同期には時間がかかります。マシンで他の作業をしていない場合、速度制限を上げることが可能です。 |
同期には時間がかかります。マシンで他の作業をしていない場合、速度制限を上げることが可能です。 |
||
− | {{hc|# cat /proc/mdstat|<nowiki> |
+ | {{hc|# cat /proc/mdstat|2=<nowiki/> |
− | Personalities : [ |
+ | Personalities : [raid10] |
− | + | md127 : active raid10 sdd1[3] sdc1[2] sdb1[1] sda1[0] |
|
− | + | 31251490816 blocks super 1.2 512K chunks 2 far-copies [4/4] [UUUU] |
|
− | + | [=>...................] resync = 5.2% (1629533760/31251490816) finish=2071.7min speed=238293K/sec |
|
+ | bitmap: 221/233 pages [884KB], 65536KB chunk |
||
− | |||
+ | }} |
||
− | unused devices: <none> |
||
− | </nowiki>}} |
||
+ | 上記の例では、最大速度が約 238 M 毎秒に制限されているように見えます。 |
||
− | 現在の制限速度を確認: |
||
+ | 現在の速度制限を確認すると: |
||
− | {{hc|# cat /proc/sys/dev/raid/speed_limit_min| |
||
+ | |||
− | 1000 |
||
+ | {{hc|# sysctl dev.raid.speed_limit_min|2= |
||
+ | dev.raid.speed_limit_min = 1000 |
||
}} |
}} |
||
+ | |||
− | {{hc|# cat /proc/sys/dev/raid/speed_limit_max| |
||
+ | {{hc|# sysctl dev.raid.speed_limit_max|2= |
||
− | 200000 |
||
+ | dev.raid.speed_limit_max = 200000 |
||
}} |
}} |
||
+ | [[sysctl]] を使って RAID 再同期操作の最大速度を変更します: |
||
− | 制限を上げる: |
||
− | # |
+ | # sysctl -w dev.raid.speed_limit_min=600000 |
− | # |
+ | # sysctl -w dev.raid.speed_limit_max=600000 |
上記の設定後、同期速度と予想完了時間を確認してみてください: |
上記の設定後、同期速度と予想完了時間を確認してみてください: |
||
− | {{hc|# cat /proc/mdstat|<nowiki> |
+ | {{hc|# cat /proc/mdstat|2=<nowiki/> |
− | Personalities : [ |
+ | Personalities : [raid10] |
− | + | md127 : active raid10 sdd1[3] sdc1[2] sdb1[1] sda1[0] |
|
− | + | 31251490816 blocks super 1.2 512K chunks 2 far-copies [4/4] [UUUU] |
|
− | + | [=>...................] resync = 5.3% (1657016448/31251490816) finish=1234.9min speed=399407K/sec |
|
+ | bitmap: 221/233 pages [884KB], 65536KB chunk |
||
− | |||
+ | }} |
||
− | unused devices: <none> |
||
− | </nowiki>}} |
||
+ | === RAID5 のパフォーマンス === |
||
− | [[sysctl#MDADM]] も参照してください。 |
||
+ | |||
+ | 高速なストレージ ([[NVMe]] など) において RAID5 のパフォーマンスを向上させるには、スレッド数 {{ic|/sys/block/mdx/md/group_thread_cnt}} を増やしてください。例えば、RAID5 デバイス上で 8 スレッド使うには: |
||
+ | |||
+ | # echo 8 > /sys/block/md0/md/group_thread_cnt |
||
+ | |||
+ | [https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=851c30c9badfc6b294c98e887624bff53644ad21 カーネル の git コミット 851c30c9badf] を参照してください。 |
||
+ | |||
+ | === RAID スーパーブロックを更新する === |
||
+ | |||
+ | RAID スーパーブロックを更新するには、まずアレイをアンマウントして、その後に以下のコマンドでアレイを停止する必要があります: |
||
+ | |||
+ | # mdadm --stop /dev/md0 |
||
+ | |||
+ | そして、アレイを再アセンブルすることで特定のパラメータを更新します。例えば、{{ic|homehost}} を更新するには: |
||
+ | |||
+ | # mdadm --assemble --update=homehost --homehost=NAS /dev/md0 /dev/sda1 /dev/sdb1 |
||
+ | |||
+ | 詳細は {{ic|--update}} の引数を見てください。 |
||
== 監視 == |
== 監視 == |
||
+ | |||
− | RAID デバイスの状態を出力するシンプルなワンライナー: |
||
+ | 以下は RAID デバイスの状態を出力するシンプルなワンライナーです: |
||
− | {{hc|awk '/^md/ {printf "%s: ", $1}; /blocks/ {print $NF}' </proc/mdstat |
||
+ | |||
+ | {{hc|# awk '/^md/ {printf "%s: ", $1}; /blocks/ {print $NF}' </proc/mdstat |
||
|md1: [UU] |
|md1: [UU] |
||
md0: [UU] |
md0: [UU] |
||
}} |
}} |
||
− | === |
+ | === mdstat を watch する === |
− | {{bc|watch -t 'cat /proc/mdstat'}} |
||
− | または {{pkg|tmux}} を使う場合: |
||
− | {{bc|tmux split-window -l 12 "watch -t 'cat /proc/mdstat'"}} |
||
+ | # watch -t 'cat /proc/mdstat' |
||
− | ===iotop で IO を追跡=== |
||
− | {{pkg|iotop}} パッケージはプロセスの入出力の統計を表示します。次のコマンドを使って raid スレッドの IO を表示することができます。 |
||
+ | または {{pkg|tmux}} を使うことがより望ましいです: |
||
− | {{bc|<nowiki>iotop -a -p $(sed 's, , -p ,g' <<<`pgrep "_raid|_resync|jbd2"`)</nowiki>}} |
||
+ | # tmux split-window -l 12 "watch -t 'cat /proc/mdstat'" |
||
− | ===iostat で IO を追跡 === |
||
+ | === iotop で IO を追跡する === |
||
− | {{Pkg|sysstat}} パッケージに入っている ''iostat'' ユーティリティはデバイスやパーティションの入出力の統計を表示します。 |
||
+ | {{pkg|iotop}} パッケージはプロセスの入出力の統計を表示します。次のコマンドを使って raid スレッドの IO を表示することができます: |
||
− | iostat -dmy 1 /dev/md0 |
||
− | iostat -dmy 1 # all |
||
+ | # iotop -a $(sed 's/^/-p /g' <<<`pgrep "_raid|_resync|jbd2"`) |
||
− | ===イベントでメールを送信=== |
||
− | smtp メールサーバー (sendmail) かメールフォワーダ (ssmtp/msmtp) が必要です。おそらく一番シンプルな方法は {{AUR|dma}} を使うことです。とても小さく (インストール容量 0.08 MiB) でセットアップがいりません。 |
||
+ | === iostat で IO を追跡する === |
||
− | {{ic|/etc/mdadm.conf}} を編集して通知を受信するメールアドレスを指定します。 |
||
− | {{Note|上記のとおり dma を使用する場合、外部のメールアドレスではなくローカルホストのユーザー名に直接メールを送ることができます。}} |
||
+ | {{Pkg|sysstat}} パッケージに入っている ''iostat'' ユーティリティはデバイスやパーティションの入出力の統計を表示します: |
||
− | 設定をテストするには: |
||
− | # mdadm --monitor --scan --oneshot --test |
||
+ | # iostat -dmy 1 /dev/md0 |
||
− | [[mdadm]] には監視作業を行う systemd サービス (mdmonitor.service) が含まれているため、ここで、やるべきことはもうありません。{{ic|/etc/mdadm.conf}} でメールアドレスを設定していないと、サービスは失敗します。mdadm イベントでメールを受けとりたくない場合は、サービスの失敗は無視してかまいません。通知を表示したくなく、失敗メッセージが気になるならば、ユニットをマスクしてください。 |
||
+ | # iostat -dmy 1 # all |
||
+ | === systemd から mdadm を使う === |
||
− | ==== その他の方法 ==== |
||
+ | ''mdadm'' は、{{ic|mdmonitor.service}} という [[systemd]] サービスを提供しています。これは、raid アレイの健康状態を監視したり、何かが起こったときに通知したりすることに使えます。 |
||
− | smtp メールサーバーやメールフォワーダをインストールする代わりに、既存の [[S-nail]] ツールを使うこともできます (忘れずにセットアップしてください)。 |
||
+ | このサービスは通常のサービスのように手動でアクティブ化できないという点で特殊です。システムのスタートアップ時にアレイをアセンブルする時に udev 経由で ''mdadm'' によってアクティブ化されます。しかし、このサービスが有効化されるのは、通知を送信するためのメールアドレスやプログラムが設定されている場合'''のみ'''です (以下を参照)。 |
||
− | 以下の内容で {{ic|/etc/mdadm_warning.sh}} という名前のファイルを作成: |
||
+ | ==== メールで通知する ==== |
||
− | #!/bin/bash |
||
− | event=$1 |
||
− | device=$2 |
||
− | |||
− | echo " " | /usr/bin/mailx -s "$event on $device" '''destination@email.com''' |
||
+ | {{Warning|メールアドレスの設定を間違えると、監視サービスは何も言わずに起動に失敗します。}} |
||
− | 実行権限を与えます: {{ic|chmod +x /etc/mdadm_warning.sh}} |
||
+ | {{Note|メールを送るには、[[メール転送エージェント]]を適切に設定しておく必要があります。}} |
||
− | それから {{ic|mdadm.conf}} にこのファイルを追加してください: |
||
+ | この機能を利用するには、{{ic|/etc/mdadm.conf}} でメールアドレスを定義してください: |
||
− | PROGRAM /etc/mdadm_warning.sh |
||
+ | MAILADDR ''user@domain'' |
||
− | 前記の方法と同じ方法でテスト・有効化します。 |
||
+ | 次に、以下のコマンドを使って、正しく動作することを確認してください: |
||
− | ==トラブルシューティング== |
||
− | 再起動した時に "invalid raid superblock magic" というエラーが表示される場合、ハードドライブを追加したときは、ハードドライブの順番が正しいか確認してください。インストール時の RAID デバイスは hdd, hde, hdf だったとしても起動時には hda, hdb, hdc になっているかもしれません。カーネルラインをそれにあわせて修正してください。 |
||
+ | # mdadm --monitor --scan --oneshot --test |
||
− | ===エラー: "kernel: ataX.00: revalidation failed"=== |
||
+ | |||
− | 突然 (再起動後または BIOS の設定を変更した後) 以下のようなエラーメッセージが表示された場合: |
||
+ | テストが成功してメールが届いたら、作業は完了です。次回アレイがアセンブルされる時、{{ic|mdmonitor.service}} はアレイを監視して、エラーが発生した時に通知します。 |
||
+ | |||
+ | ==== 通知をプログラムする ==== |
||
+ | |||
+ | 上記のメール通知のように、{{ic|/etc/mdadm.conf}} の以下の行を編集してください: |
||
+ | |||
+ | PROGRAM /usr/sbin/handle-mdadm-events |
||
+ | |||
+ | PROGRAM の引数は、イベント発生時に実行したいスクリプトです。使用例としては、適切なネットワーク監視エージェントと対話したり、ホームユーザーの場合は IM クライアントや ntfy.sh のようなプッシュ通知サービスを使用したりするといったものがあるでしょう。 |
||
+ | |||
+ | 上記のメール通知と同じようにテストしてください。 |
||
+ | |||
+ | == トラブルシューティング == |
||
+ | |||
+ | 起動時に "invalid raid superblock magic" というエラーが発生する場合、RAID を構成しているハードドライブ以外にもドライブが存在しているのであれば、ハードドライブの順番が正しいか確認してください。インストール時に 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) |
Feb 9 08:15:46 hostserver kernel: ata8.00: revalidation failed (errno=-5) |
||
− | これは必ずしもドライブが壊れ |
+ | これは必ずしもドライブが壊れていることを意味しているわけではありません。ウェブ上には不安を煽るような記事が多くありますが、焦ってはいけません。おろらく原因は、BIOS かカーネルパラメータで APIC や ACPI の設定をなにかの拍子で変更してしまっただけです。設定を元に戻せば大丈夫なはずです。通常、APIC か ACPI、またはこれら両方をオフにすると直るはずです。 |
+ | |||
+ | === 読み取り専用でアレイを起動 === |
||
+ | md アレイが起動する際にスーパーブロックに書き込みが起こり、この時 resync が始まることがあります。読み取り専用でアレイを起動するには、{{ic|md_mod}} カーネルモジュールに {{ic|start_ro}} パラメータを設定してください。このパラメータが設定されていると、新しく起動するアレイは 'auto-ro' モードになり、全ての内部 IO (スーパーブロックの更新、resync、リカバリ) が無効化されます。これは、書き込みリクエストが発行されると自動的に 'rw' に切り替わります。 |
||
− | ===読み取り専用でアレイを起動=== |
||
− | md アレイが起動すると、スーパーブロックが書き出され、resync が走ることがあります。読み取り専用で起動するにはカーネルモジュール {{ic|md_mod}} のパラメータ {{ic|start_ro}} を設定します。これが設定されている場合、新しいアレイは 'auto-ro' モードになり、内部 io (スーパーブロックの更新, resync, recovery) が全て無効化されて、書き込みリクエストが来た時に初めて 'rw' に自動的に切り替わります。 |
||
{{Note|最初の書き込みリクエストがある前に {{ic|mdadm --readonly}} を使うことでアレイを完全な 'ro' モードに設定できます。また、{{ic|mdadm --readwrite}} で書き込みを行わないで再同期を開始できます。}} |
{{Note|最初の書き込みリクエストがある前に {{ic|mdadm --readonly}} を使うことでアレイを完全な 'ro' モードに設定できます。また、{{ic|mdadm --readwrite}} で書き込みを行わないで再同期を開始できます。}} |
||
− | 起動時にパラメータを設定するには、カーネル |
+ | 起動時にモジュールのパラメータを設定するには、[[カーネルパラメータ]]に {{ic|1=md_mod.start_ro=1}} を追加してください。 |
− | もしくはモジュール |
+ | もしくは、[[カーネルモジュール#/etc/modprobe.d/ 内のファイルを使用する|/etc/modprobe.d/ 内のファイルを使用する]]か {{ic|/sys/}} 内のファイルに直接書き込むことでモジュールのロード時に設定することもできます: |
+ | |||
− | {{bc|echo 1 > /sys/module/md_mod/parameters/start_ro}} |
||
+ | # echo 1 > /sys/module/md_mod/parameters/start_ro |
||
+ | |||
+ | === raid のドライブが故障しているまたは存在しない状態から回復する === |
||
+ | |||
+ | 何らかの理由でドライブの一つが壊れた時も上述のエラーが表示されることがあります。その場合、ディスクが一つ足りない状態でもオンになるように raid を強制する必要があります。以下のコマンドを実行してください (必要に応じてパラメータは変えてください): |
||
− | ===raid の故障したまたは存在しないドライブからリカバリする=== |
||
− | 何らかの理由でドライブの一つが壊れた時も上述のエラーが表示されることがあります。その場合、ディスクが一つ足りない状態でも raid がオンになるようにしなくてはなりません。次のコマンドを入力 (必要に応じて変更してください): |
||
# mdadm --manage /dev/md0 --run |
# mdadm --manage /dev/md0 --run |
||
− | これ |
+ | これを実行すると、以下のようにしてマウントできるようになっているはずです (以下は fstab に raid のファイルシステムを記述している場合です。そうでない場合は、マウント元とマウントポイントを明示的に指定する必要があります。): |
+ | |||
# mount /dev/md0 |
# mount /dev/md0 |
||
− | raid がまた動作するようになって使えるようにはなりましたが、ディスクが一つ不足してい |
+ | raid がまた動作するようになって使えるようにはなりましたが、ディスクが一つ不足している状態です。なので、[[#デバイスの準備]] 章で説明されているようにして、新しいディスクをパーティショニングしてください。そうしたら、その新しいディスクを以下のようにして raid に追加できます: |
+ | |||
# mdadm --manage --add /dev/md0 /dev/sdd1 |
# mdadm --manage --add /dev/md0 /dev/sdd1 |
||
+ | 以下のコマンドを実行すると、raid がアクティブになっていて、再構築中であることが確認できるでしょう: |
||
− | 次を入力すれば: |
||
+ | |||
# cat /proc/mdstat |
# cat /proc/mdstat |
||
− | raid が有効になって再構築されたことが確認できるでしょう。 |
||
− | 設定を更新し |
+ | また、これに合わせて設定ファイルを更新したほうが良いかもしれません ([[#設定ファイルの更新]] を参照)。 |
== ベンチマーク == |
== ベンチマーク == |
||
586行目: | 734行目: | ||
* [https://bbs.archlinux.org/viewtopic.php?id=123698 Can't install grub2 on software RAID] |
* [https://bbs.archlinux.org/viewtopic.php?id=123698 Can't install grub2 on software RAID] |
||
* [https://forums.gentoo.org/viewtopic-t-888624-start-0.html Use RAID metadata 1.2 in boot and root partition] |
* [https://forums.gentoo.org/viewtopic-t-888624-start-0.html Use RAID metadata 1.2 in boot and root partition] |
||
+ | |||
+ | {{TranslationStatus|RAID|2024-10-12|814238}} |
2024年10月12日 (土) 17:29時点における最新版
関連記事
Redundant Array of Independent Disks (個別のディスクによる冗長化集合、RAID) とは、複数のディスクドライブ (典型的にはディスクドライブかパーティシヨン) を組み合わせて1つの論理ユニットとして扱うストレージ技術です。RAID の実装に応じて、この論理ユニットは1つのファイルシステムや、いくつかのパーティションを保持する更なる透過型レイヤとすることができます。(必要な冗長性とパフォーマンスのレベルに応じて) #RAID レベル と呼ばれるいくつかの方法の内いずれかを使用して、データをドライブの集合にまたがって分散させます。選択する RAID レベルによって、ハードディスク障害時にデータ損失を防いだり、パフォーマンスを向上させたり、あるいは両方を実現できます。
この記事では mdadm によるソフトウェア RAID アレイの作成および管理方法を説明します。
目次
RAID レベル
ほとんどの RAID レベルで冗長性が確保されていますが、RAID はデータが安全であることを保証するものではありません。火事があったときや、コンピュータが盗まれたとき、または複数のドライブが同時に壊れた場合など RAID はデータを保護しません。さらに、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 6
- 四台以上の物理ドライブを必要とし、RAID 5 の利点を活かしながらドライブが二台故障しても安全です。RAID 6 も RAID 5 と同じようにストライピングを使用しますが、二つの異なるパリティブロックをそれぞれのメンバーディスクに分散して保存します。ディスクが故障したときは、パリティブロックを利用して交換したディスクにデータを再構築します。RAID 6 は二台のディスクの喪失まで耐えることが可能です。ドライブを再構築するときでもアレイにパリティブロックが存在するため、読み取りエラーに対する堅牢性は高くなっています。ただし、オーバーヘッドを考えると RAID 6 はコストがかかります。大抵の場合は far2 レイアウトの RAID 10 のほうが高い性能と堅牢性を確保できます (下を参照)。
ネスト RAID レベル
- RAID 1+0
- RAID 1+0 は2つの標準 RAID レベルを組み合わせてパフォーマンスと冗長性を獲得する入れ子の RAID です。よく RAID 10 と呼ばれますが、Linux MD RAID 10 は単純な RAID レイヤーとは多少異なっています。下記を見てください。
- RAID 10
- Linux における RAID 10 は RAID 1+0 の概念に基づいていますが、シングルレイヤーとして実装することで複数のレイアウトが可能になっています。
- Y 台のディスクによる near X レイアウトは Y/2 個のストライプで X 個のチャンクが作成されますが、Y を均等に X で割る必要はありません。near という名前のとおり、チャンクは複製されるディスクに近い場所に配置されます。2台以上の任意の台数のディスクを使うことができます。2台のディスクによる Near 2 は RAID 1 と同じであり、4台のディスクによる Near 2 は RAID 1+0 と同じです。
- Y 台のディスクによる far X レイアウトはストライプによる読み取り性能を複製されたアレイで発揮します。ディスクをフロントとバックに分けて、ディスク1のフロントはディスク2のバックに複製され、ディスク2のフロントはディスク1のバックに複製されます。RAID 0 や RAID 5 と同じように、シーケンシャルリードを高速化することが可能です。欠点としては複製を保存するのにディスクがシークする距離が長くなるためシーケンシャルライトが遅くなります。それでも、読み込み速度が重要で可用性・冗長性が必要な場合はレイヤー化された RAID 1+0 と RAID 5 よりも far 2 レイアウトの RAID 10 を使うことを推奨します。ただしバックアップを置き換えることはできません。詳細は該当する wikipedia ページを参照してください。
RAID 比較
RAID レベル | データの冗長性 | 物理ドライブの利用効率 | 読込パフォーマンス | 書込パフォーマンス | 最小ドライブ数 |
---|---|---|---|---|---|
0 | No | 100% | nX
最速 |
nX
最速 |
2 |
1 | Yes | 50% | 複数プロセスが読み込む場合 nX まで、それ以外では 1X | 1X | 2 |
5 | Yes | 67% - 94% | (n−1)X
高速 |
(n−1)X
高速 |
3 |
6 | Yes | 50% - 88% | (n−2)X | (n−2)X | 4 |
10,far2 | Yes | 50% | nX
最速; RAID0 と同等だが冗長 |
(n/2)X | 2 |
10,near2 | Yes | 50% | 複数プロセスが読み込む場合 nX まで、それ以外では 1X | (n/2)X | 2 |
* n は利用するディスクの数。
非推奨の RAID レベル
- LINEAR
- LINEAR は2つ以上のデバイスを単一のデバイスにマッピングできます。RAID0 のような並列アクセスはありませんが、異なるサイズを持つ複数のディスクを完全に使用できます。しかし、2021年にこのレベルは非推奨となり、2023年に Linux カーネル (
linear.ko
モジュール) から削除されました (コミット 849d18e を参照)。mdadm を使わずにこのモードで疑似 RAID を作成するには、低レベルな dmsetup(8) ユーティリティか、高レベルな LVM フレームワークまたは Btrfs ファイルシステムを使用できます。
実装
RAID デバイスの制御方法は様々です:
- ソフトウェア RAID
- 内部のよくわからないプロプライエタリなファームウェアやソフトウェアの使用に依存しないため、これが最も簡単な実装です。アレイはオペレーティングシステムによって以下のいずれかで管理されます:
- ハードウェア RAID
- PC に取り付けた専用のハードウェアカードにディスクを直接接続してアレイを直接制御します。ホストプロセッサ (CPU) とは独立したオンボードのプロセッサ上で RAID が処理されます。この方法はオペレーティングシステムから独立していますが、ハードウェア RAID コントローラを正しく作動させるためにはドライバーが必要になります。RAID アレイの設定は、メーカーによって、オプション ROM インターフェイスを使ったり、OS をインストールしたあとで専用のアプリケーションを使って行います。この構成は Linux カーネルから見て透過的であり、システムには単一のディスクとして認識されます。
- FakeRAID
- このタイプの RAID は正しくは BIOS RAID またはオンボード RAID と呼ぶべきですが、ハードウェア RAID として偽って喧伝されています。アレイは疑似 RAID コントローラで管理され、RAID の管理システムはオプション ROM かファームウェア自体に EFI SataDriver で実装されています (UEFI の場合)。しかし、RAID の機能すべてが実装された完全なハードウェア RAID コントローラーではありません。そのため、このタイプの RAID は FakeRAID と呼称されることがあります。FakeRAID のコントローラは dmraid を使って扱います。FakeRAID コントローラの例: Intel Rapid Storage、JMicron JMB36x RAID ROM、AMD RAID、ASMedia 106x、NVIDIA MediaShield など。
使用している RAID はどのタイプか?
ソフトウェア RAID の実装はユーザーが行うため、ソフトウェア RAID を使っていることは簡単にわかります。
反対に、FakeRAID と真のハードウェア RAID を見分けるのは難しいかもしれません。上記の通り、しばしばメーカーはこれら二つの RAID タイプを誤って区別していることがあり、不当表示も考えられます。この場合、最も良い方法は lspci
コマンドを実行して、出力から RAID コントローラーを探すことです。そして、その RAID コントローラーに関する情報を検索することです。Hardware RAID コントローラーは先のコマンドのリストに現れますが、FakeRAID の実装は現れません。また、真のハードウェア RAID コントローラーは高価であることが多いので、システムをカスタマイズする際、ハードウェア RAID の構成を選択するとコンピューターの価格にそれとわかるくらいの差があるはずです。
インストール
mdadm をインストールして下さい。mdadm はプレーンなブロックデバイスを使って純粋なソフトウェア RAID を管理するために使用されます:基底のハードウェアは RAID ロジックを提供せず、ディスクだけ供給します。mdadm はどんなブロックデバイスの組み合わせでも使うことができます。あまり一般的でない組み合わせであってもです。例えば、USB ドライブを集めて RAID アレイを作成することも可能です。
デバイスの準備
デバイスを再利用する場合や、既存のアレイを作り直す場合、古い RAID 構成情報を全て消去してください:
# mdadm --misc --zero-superblock /dev/drive
もしくは、ドライブ上の特定のパーティションを削除する場合は:
# mdadm --misc --zero-superblock /dev/partition
デバイスをパーティショニングする
アレイに使用するディスクをパーティショニングすることが強く推奨されます。ほとんどの RAID ユーザーは 2 TiB 以上のディスクドライブを選択するため、GPT が必須ですし推奨されます。パーティショニングやパーティショニングツールに関する詳細は パーティショニング の記事を見てください。
GUID Partition Table
- (GPT の) パーティションを作成したあと、パーティションのパーティションタイプの GUID は
A19D880F-05FC-4D3B-A006-743F0F84911E
になっている必要があります (このタイプは、fdisk ではパーティションタイプLinux RAID
を、gdisk ではFD00
を選択することで割り当てることができます)。 - 大きなディスクアレイを使用する場合は、後で個々のディスクを簡単に判別できるようにするためにファイルシステムラベルかパーティションラベルを割り当てることを検討してください。
- 各デバイスのサイズと同じサイズのパーティションを作成することが推奨されます。
Master Boot Record
HDD 上に MBR パーティションテーブルでパーティションを作成する場合、利用できるパーティションタイプの ID は以下の通りです:
- ファイルシステムデータ以外には
0xDA
(fdisk ではNon-FS data
)。これは Arch Linux で RAID アレイを作成する際の推奨される mdadm パーティションタイプです。 - RAID 自動検出アレイには
0xFD
(fdisk ではLinux RAID autodetect
)。このパーティションタイプは、RAID 自動検出が望ましい場合に限り (initramfs を用いないシステムや、古い mdadm メタデータフォーマットの場合)、使用するべきです。
詳細は Linux Raid Wiki:Partition Types を見てください。
アレイの構築
mdadm
を使ってアレイを構築します。サポートされているオプションは mdadm(8) を見てください。例をいくつか以下に挙げます。
以下の例では、2つのデバイスを使用する RAID1 アレイを構築しています:
# mdadm --create --verbose --level=1 --metadata=1.2 --raid-devices=2 /dev/md/MyRAID1Array /dev/sdb1 /dev/sdc1
以下の例では、4つのアクティブデバイスと1つのスペアデバイスを使用して RAID5 アレイを構築しています:
# mdadm --create --verbose --level=5 --metadata=1.2 --chunk=256 --raid-devices=4 /dev/md/MyRAID5Array /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 --spare-devices=1 /dev/sdf1
以下の例では、2つのデバイスを使って RAID10,far2 アレイを構築しています:
# mdadm --create --verbose --level=10 --metadata=1.2 --chunk=512 --raid-devices=2 --layout=f2 /dev/md/MyRAID10Array /dev/sdb1 /dev/sdc1
アレイは仮想デバイス /dev/mdX
に作成され、アセンブルされて (縮退モードで) 使用できます。このデバイスファイルは直接使うことができ、mdadm がバックグラウンドでアレイを同期してくれます。パリティのレストアには長い時間がかかる可能性があります。進捗は次のコマンドで確認できます:
$ cat /proc/mdstat
設定ファイルの更新
デフォルトでは、mdadm.conf
内の殆どの行がコメントアウトされており、以下だけが含まれています:
/etc/mdadm.conf
... DEVICE partitions ...
このディレクティブは、/proc/partitions
から参照されているデバイスを検査し、可能な限り多くのアレイをアセンブルします。あなたが利用可能なアレイを全て起動するつもりで、想定外のスーパーブロックが検出されないことが確実である場合には、これで良いでしょう。より正確な方法は、アレイを明示的に /etc/mdadm.conf
に追加することです:
# mdadm --detail --scan >> /etc/mdadm.conf
結果は以下のようになります:
/etc/mdadm.conf
... DEVICE partitions ... ARRAY /dev/md/MyRAID1Array metadata=1.2 name=pine:MyRAID1Array UUID=27664f0d:111e493d:4d810213:9f291abe
この場合でも mdadm は /proc/partitions
から参照されているデバイスを検査します。しかし、27664…
の UUID を持つスーパーブロックのみがアクティブなアレイにアセンブルされます。
詳細は mdadm.conf(5) を参照してください。
アレイのアセンブル
設定ファイルを更新できたら、mdadm を使ってアレイをアセンブルできます:
# mdadm --assemble --scan
RAID ファイルシステムのフォーマット
これまでの手順を終えた今、他のファイルシステムと同じようにアレイをファイルシステムでフォーマットすることができます。覚えておくべきことは:
- ボリュームサイズが巨大であるため、一部のファイルシステムは適しません (Wikipedia:Comparison of file systems#Limits を参照)。
- 使用するファイルシステムはオンラインでの拡張と縮小に対応している必要があります (Wikipedia:Comparison of file systems#Features を参照)。
- 最適なパフォーマンスを得るには適切なストライドとストライプ幅を計算する必要があります。
ストライドとストライプ幅の計算
ファイルシステムの構造を基底の RAID 構造に合うように最適化するにはストライドとストライプ幅の2つを調整する必要があります。これらは RAID のチャンクサイズ、ファイルシステムのブロックサイズ、"データディスク"の数から導かれます。
チャンクサイズは RAID アレイのプロパティであり、RAID の作成時に決まります。mdadm
の現在のデフォルト値は 512 KiB です。mdadm
を使えば、チャンクサイズを調べられます:
# mdadm --detail /dev/mdX | grep 'Chunk Size'
ブロックサイズはファイルシステムのプロパティであり、ファイルシステムの作成時に決まります。多くのファイルシステム (ext4 を含む) でデフォルトのブロックサイズは 4 KiB となっています。ext4 に関する詳細は /etc/mke2fs.conf
を参照してください。
"データディスク"の数とは、データの損失を引き起こさずに完全にアレイを再構築するのに必要なデバイスの最小数です。例えば、N 個のデバイスからなるアレイでは RAID0 では N 個となり、RAID5 では N - 1 個となります。
これら3つの値がわかったら、以下の公式でストライドとストライプ幅を計算できます:
ストライド = チャンクサイズ / ブロックサイズ ストライプ幅 = データディスクの数 * ストライド
例 1. RAID0
適切なストライドとストライプ幅で ext4 でフォーマットする例:
- 仮に RAID0 アレイは2つの物理ディスクからなるとします。
- チャンクサイズは 512 KiB とします。
- ブロックサイズは 4 KiB です。
ストライド = チャンクサイズ / ブロックサイズ。この例では、512 / 4 となり、ストライド = 128 です。
ストライプ幅 = 物理データディスクの数 * ストライド。この例では、2 * 128 となり、ストライプ幅 = 256 です。
# mkfs.ext4 -v -L myarray -b 4096 -E stride=128,stripe-width=256 /dev/md0
例 2. RAID5
適切なストライドとストライプ幅で ext4 でフォーマットする例:
- 仮に RAID5 アレイは4つの物理ディスクからなり、3つはデータディスク、1つはパリティディスクとします。
- チャンクサイズは 512 KiB とします。
- ブロックサイズは 4 KiB です。
ストライド = チャンクサイズ / ブロックサイズ。この例では、512 / 4 となり、ストライド = 128 です。
ストライプ幅 = 物理データディスクの数 * ストライド。この例では、3 * 128 となり、ストライプ幅 = 384 です。
# mkfs.ext4 -v -L myarray -b 4096 -E stride=128,stripe-width=384 /dev/md0
ストライドとストライプ幅に関する詳細は RAID Math を参照してください。
例 3. RAID10,far2
適切なストライドとストライプ幅で ext4 でフォーマットする例:
- 仮に RAID10 アレイは2つの物理ディスクからなるとします。far2 レイアウトでの RAID10 の性質上、これら2つともデータディスクとしてカウントします。
- チャンクサイズは 512 KiB とします。
- ブロックサイズは 4 KiB です。
ストライド = チャンクサイズ / ブロックサイズ。この例では、512 / 4 となり、ストライド = 128 です。
ストライプ幅 = 物理データディスクの数 * ストライド。この例では、2 * 128 となり、ストライプ幅 = 256 です。
# mkfs.ext4 -v -L myarray -b 4096 -E stride=128,stripe-width=256 /dev/md0
ライブ CD からマウント
ライブ CD から RAID パーティションをマウントしたい場合、次のコマンドを使います:
# mdadm --assemble /dev/mdnumber /dev/disk1 /dev/disk2 /dev/disk3 /dev/disk4
ディスクアレイの無い RAID 1 が RAID 1 と自動で誤検出され (mdadm --detail /dev/mdnumber
の出力でわかります)、非アクティブであると報告される場合 (cat /proc/mdstat
でわかります)、先にアレイを停止してください:
# mdadm --stop /dev/mdnumber
RAID に Arch Linux をインストール
インストール手順のパーティショニングステップとフォーマットステップの間で RAID アレイを作成する必要があります。Root ファイルシステムにするパーティションを直接フォーマットせずに、RAID アレイ上に作成します。#インストール セクションの指示に従って RAID アレイを作成してください。その後は、pacstrap の手順が終わる所までインストール手順に従ってください。UEFI で起動する場合、EFI システムパーティション#ソフトウェア RAID1 上に ESP を配置する も読んでください。
設定ファイルの更新
ベースシステムをインストールしたら、デフォルトの設定ファイル mdadm.conf
を次のようにして更新する必要があります:
# mdadm --detail --scan >> /mnt/etc/mdadm.conf
上のコマンドを実行した後は、必ずテキストエディタ等を使って mdadm.conf
設定ファイルをチェックして、中身が問題ないか確認してください。
再びインストール手順を続けて、インストールガイド#Initramfs の前まで進めてください。そこまで行ったら、この次のセクションを見てください。
mkinitcpio の設定
mdadm をインストールし、initramfs イメージに mdadm のサポートを追加する mdadm_udev
を mkinitcpio.conf
の HOOKS 配列に追加してください:
/etc/mkinitcpio.conf
... HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block mdadm_udev filesystems fsck) ...
そして、initramfs を再生成してください。
ブートローダーの設定
root デバイス
マッピングされた RAID のデバイスを root
カーネルパラメータで指定してください。例えば:
root=/dev/md/MyRAIDArray
このカーネルデバイスノードを使ってソフトウェア RAID パーティションからのブートに失敗する場合、もう一つの方法は永続的なブロックデバイスの命名にある方法を使うことです。例えば:
root=LABEL=Root_Label
GRUB#RAID も参照してください。
RAID0 レイアウト
Linux カーネル 5.3.4 から、カーネルにどの RAID0 レイアウト (RAID0_ORIG_LAYOUT (1
) か RAID0_ALT_MULTIZONE_LAYOUT (2
)) を使うべきかをカーネルに明示的に伝える必要があります。[1] 以下のようにカーネルパラメータを指定することで、カーネルに伝えることができます:
raid0.default_layout=2
指定するべき正しい値は、RAID アレイを作成した時に使っていたカーネルのバージョンに依ります。カーネル 3.14 及びそれ以前を使って作成した場合は 1
を、それより新しいバージョンを使って作成した場合は 2
を指定してください。どちらを使うべきか確認する一つの方法は、RAID アレイの作成日時を見ることです:
mdadm --detail /dev/md1
/dev/md1: Version : 1.2 Creation Time : Thu Sep 24 10:17:41 2015 Raid Level : raid0 Array Size : 975859712 (930.65 GiB 999.28 GB) Raid Devices : 3 Total Devices : 3 Persistence : Superblock is persistent Update Time : Thu Sep 24 10:17:41 2015 State : clean Active Devices : 3 Working Devices : 3 Failed Devices : 0 Spare Devices : 0 Chunk Size : 512K Consistency Policy : none Name : archiso:root UUID : 028de718:20a81234:4db79a2c:e94fd560 Events : 0 Number Major Minor RaidDevice State 0 259 2 0 active sync /dev/nvme0n1p1 1 259 6 1 active sync /dev/nvme2n1p1 2 259 5 2 active sync /dev/nvme1n1p2
ここでは、RAID アレイが2015年9月24日に作成されました。Linux カーネル 3.14 のリリース日は2014年3月30日ですので、この RAID アレイは multizone layout (2
) を使って作成された可能性が最も高いです。
RAID のメンテナンス
スクラビング
誤りをチェック・修正するために定期的にデータスクラビングを実行するのは良い習慣です。アレイのサイズや設定にもよりますが、スクラビングは完了するまでに数時間かかる場合があります。
データスクラビングを開始するには:
To initiate a data scrub:
# 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
スクラビングの一般的な注意事項
定期的にスクラビングを root で実行する cron ジョブを設定するのは良い考えです。ジョブの設定に役立つ raid-checkAUR を見て下さい。cron の代わりに systemd タイマーを使ってスクラビングを実行したい場合は raid-check-systemdAUR をインストールしてください。このパッケージには systemd タイマーのユニットファイルとスクリプトが含まれています。
RAID1 と RAID10 のスクラビングの注意事項
カーネルにおける RAID1 と RAID10 の書き込みはバッファリングされないため、アレイが問題ないときでもアレイのミスマッチ数がゼロ以外になる可能性があります。このようなケースは一時的なデータ領域にしか発生しないため、問題は起こりません。しかしながら、一時的なデータ領域に発生しているミスマッチと、実際に問題が起こっていることによるミスマッチを見分けることはできません。このために RAID1 や RAID10 アレイでは誤検知が発生することがあります。それでもデバイスにあるかもしれない不良セクタを見つけて直すために定期的にスクラビングすることを推奨します。
アレイからデバイスを削除する
アレイからデバイスを削除する際は削除する前にそのブロックデバイスが壊れているとマークを付けます:
# mdadm --fail /dev/md0 /dev/failing_array_member
そしてアレイからデバイスを削除します:
# mdadm --remove /dev/md0 /dev/failing_array_member
デバイスが完全には壊れていないが、交換したい場合 (壊れつつあるように思える場合など)、まず新しいドライブを追加しておいて、その後で交換したいドライブを置き換えることで、より簡単にドライブを交換することができます。
例えば、/dev/sdc1
を新しいドライブ、/dev/sdb1
を壊れているドライブとすると:
# mdadm /dev/md0 --add /dev/sdc1 # mdadm /dev/md0 --replace /dev/sdb1 --with /dev/sdc1
--with /dev/sdc1
の部分は必須ではありませんが、こうすることで交換後のデバイスを明示的に指定できます。詳細は [2] を参照してください。
デバイスを永続的に除去するには (例えば、そのデバイスを個別のデバイスとして使いたい場合など)、先の手順 (--fail/--remove または --add/--replace) の後に以下を実行してください:
# mdadm --zero-superblock /dev/failing_array_member
Stop using an array: アレイの使用を停止するには:
- 対象のアレイをアンマウント
- 次のコマンドでアレイを停止:
mdadm --stop /dev/md0
- この章の最初に書かれている3つのコマンドを各デバイスに対して実行する (訳注: --fail、--remove、そして --zero-superblock です)。
/etc/mdadm.conf
からこのアレイに対応する行を削除。
アレイに新しいデバイスを追加する
デバイスがマウントされている動作中のシステム上でも mdadm で新しいデバイスを追加することができます。上述のようにして、すでにアレイに存在しているものと同じレイアウトで新しいデバイスをパーティショニングしてください。
まだされていない場合は RAID アレイをアセンブルしてください:
# mdadm --assemble /dev/md0 /dev/sda1 /dev/sdb1
新しいデバイスをアレイに追加してください:
# mdadm --add /dev/md0 /dev/sdc1
mdadm がデバイスをアレイに追加するのに対して時間はかからないはずです。
RAID のタイプによっては (例えば RAID1)、デバイスとデータを同期せずに、デバイスをスペアとして追加することもできます。RAID が使用するディスクの数は --grow
と --raid-devices
オプションで増やすことができます。例えば、アレイを4つのディスクに増やすには:
# mdadm --grow /dev/md0 --raid-devices=4
以下のコマンドで進捗を確認できます:
# cat /proc/mdstat
以下のコマンドでデバイスが追加されたことを確認できます:
# mdadm --misc --detail /dev/md0
RAID ボリュームのサイズを増やす
RAID アレイに巨大なディスクを追加した場合やパーティションサイズを増やした場合、RAID ボリュームのサイズを増加させて空き領域を埋めると良いでしょう。まずは、ディスクの交換に関する上記のセクションに従ってください。RAID ボリュームをより大きなディスク上に再構築したら、その領域を埋めるようにボリュームを拡張する必要があります。
# mdadm --grow /dev/md0 --size=max
そして RAID ボリューム /dev/md0
に存在するパーティションのサイズを変更してください。詳しくはパーティショニングを参照。最後に、パーティション内のファイルシステムをリサイズしてください。gparted
でパーティショニングした場合、自動的にリサイズされます。他のツールを使った場合、ファイルシステムをアンマウントして手動でファイルシステムをリサイズしてください:
# umount /storage # fsck.ext4 -f /dev/md0p1 # resize2fs /dev/md0p1
同期速度の制限を変更
同期には時間がかかります。マシンで他の作業をしていない場合、速度制限を上げることが可能です。
# cat /proc/mdstat
Personalities : [raid10] md127 : active raid10 sdd1[3] sdc1[2] sdb1[1] sda1[0] 31251490816 blocks super 1.2 512K chunks 2 far-copies [4/4] [UUUU] [=>...................] resync = 5.2% (1629533760/31251490816) finish=2071.7min speed=238293K/sec bitmap: 221/233 pages [884KB], 65536KB chunk
上記の例では、最大速度が約 238 M 毎秒に制限されているように見えます。
現在の速度制限を確認すると:
# sysctl dev.raid.speed_limit_min
dev.raid.speed_limit_min = 1000
# sysctl dev.raid.speed_limit_max
dev.raid.speed_limit_max = 200000
sysctl を使って RAID 再同期操作の最大速度を変更します:
# sysctl -w dev.raid.speed_limit_min=600000 # sysctl -w dev.raid.speed_limit_max=600000
上記の設定後、同期速度と予想完了時間を確認してみてください:
# cat /proc/mdstat
Personalities : [raid10] md127 : active raid10 sdd1[3] sdc1[2] sdb1[1] sda1[0] 31251490816 blocks super 1.2 512K chunks 2 far-copies [4/4] [UUUU] [=>...................] resync = 5.3% (1657016448/31251490816) finish=1234.9min speed=399407K/sec bitmap: 221/233 pages [884KB], 65536KB chunk
RAID5 のパフォーマンス
高速なストレージ (NVMe など) において RAID5 のパフォーマンスを向上させるには、スレッド数 /sys/block/mdx/md/group_thread_cnt
を増やしてください。例えば、RAID5 デバイス上で 8 スレッド使うには:
# echo 8 > /sys/block/md0/md/group_thread_cnt
カーネル の git コミット 851c30c9badf を参照してください。
RAID スーパーブロックを更新する
RAID スーパーブロックを更新するには、まずアレイをアンマウントして、その後に以下のコマンドでアレイを停止する必要があります:
# mdadm --stop /dev/md0
そして、アレイを再アセンブルすることで特定のパラメータを更新します。例えば、homehost
を更新するには:
# mdadm --assemble --update=homehost --homehost=NAS /dev/md0 /dev/sda1 /dev/sdb1
詳細は --update
の引数を見てください。
監視
以下は RAID デバイスの状態を出力するシンプルなワンライナーです:
# awk '/^md/ {printf "%s: ", $1}; /blocks/ {print $NF}' </proc/mdstat
md1: [UU] md0: [UU]
mdstat を watch する
# watch -t 'cat /proc/mdstat'
または tmux を使うことがより望ましいです:
# tmux split-window -l 12 "watch -t 'cat /proc/mdstat'"
iotop で IO を追跡する
iotop パッケージはプロセスの入出力の統計を表示します。次のコマンドを使って raid スレッドの IO を表示することができます:
# iotop -a $(sed 's/^/-p /g' <<<`pgrep "_raid|_resync|jbd2"`)
iostat で IO を追跡する
sysstat パッケージに入っている iostat ユーティリティはデバイスやパーティションの入出力の統計を表示します:
# iostat -dmy 1 /dev/md0 # iostat -dmy 1 # all
systemd から mdadm を使う
mdadm は、mdmonitor.service
という systemd サービスを提供しています。これは、raid アレイの健康状態を監視したり、何かが起こったときに通知したりすることに使えます。
このサービスは通常のサービスのように手動でアクティブ化できないという点で特殊です。システムのスタートアップ時にアレイをアセンブルする時に udev 経由で mdadm によってアクティブ化されます。しかし、このサービスが有効化されるのは、通知を送信するためのメールアドレスやプログラムが設定されている場合のみです (以下を参照)。
メールで通知する
この機能を利用するには、/etc/mdadm.conf
でメールアドレスを定義してください:
MAILADDR user@domain
次に、以下のコマンドを使って、正しく動作することを確認してください:
# mdadm --monitor --scan --oneshot --test
テストが成功してメールが届いたら、作業は完了です。次回アレイがアセンブルされる時、mdmonitor.service
はアレイを監視して、エラーが発生した時に通知します。
通知をプログラムする
上記のメール通知のように、/etc/mdadm.conf
の以下の行を編集してください:
PROGRAM /usr/sbin/handle-mdadm-events
PROGRAM の引数は、イベント発生時に実行したいスクリプトです。使用例としては、適切なネットワーク監視エージェントと対話したり、ホームユーザーの場合は IM クライアントや ntfy.sh のようなプッシュ通知サービスを使用したりするといったものがあるでしょう。
上記のメール通知と同じようにテストしてください。
トラブルシューティング
起動時に "invalid raid superblock magic" というエラーが発生する場合、RAID を構成しているハードドライブ以外にもドライブが存在しているのであれば、ハードドライブの順番が正しいか確認してください。インストール時に 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 の設定をなにかの拍子で変更してしまっただけです。設定を元に戻せば大丈夫なはずです。通常、APIC か ACPI、またはこれら両方をオフにすると直るはずです。
読み取り専用でアレイを起動
md アレイが起動する際にスーパーブロックに書き込みが起こり、この時 resync が始まることがあります。読み取り専用でアレイを起動するには、md_mod
カーネルモジュールに start_ro
パラメータを設定してください。このパラメータが設定されていると、新しく起動するアレイは 'auto-ro' モードになり、全ての内部 IO (スーパーブロックの更新、resync、リカバリ) が無効化されます。これは、書き込みリクエストが発行されると自動的に 'rw' に切り替わります。
起動時にモジュールのパラメータを設定するには、カーネルパラメータに 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 に raid のファイルシステムを記述している場合です。そうでない場合は、マウント元とマウントポイントを明示的に指定する必要があります。):
# mount /dev/md0
raid がまた動作するようになって使えるようにはなりましたが、ディスクが一つ不足している状態です。なので、#デバイスの準備 章で説明されているようにして、新しいディスクをパーティショニングしてください。そうしたら、その新しいディスクを以下のようにして raid に追加できます:
# mdadm --manage --add /dev/md0 /dev/sdd1
以下のコマンドを実行すると、raid がアクティブになっていて、再構築中であることが確認できるでしょう:
# cat /proc/mdstat
また、これに合わせて設定ファイルを更新したほうが良いかもしれません (#設定ファイルの更新 を参照)。
ベンチマーク
RAID をベンチマークするツールは複数存在します。複数のスレッドが同じ RAID ボリュームから読み込む際の速度の向上が最もわかりやすい改善点です。
bonnie++ はひとつまたは複数のファイルへのデータベースタイプのアクセスをテストしたり、小さなファイルを作成・読込・削除することで Squid や INN、または Maildir フォーマットのメールなどといったプログラムの使用をシミュレートします。同梱されている ZCAV プログラムはディスクに書き込みを行わずにハードドライブの異なる領域のパフォーマンスをテストします。
hdparm
を RAID のベンチマークに使ってはいけません。出てくる結果には全く一貫性が無いからです。
参照
- Linux Software RAID (thomas-krenn.com)
- Linux カーネルアーカイブの Linux RAID wiki エントリ
- How Bitmaps Work
- Red Hat Enterprise Linux 6 ドキュメントの 第15章: Redundant Array of Independent Disks (RAID)[リンク切れ 2024-07-30]
- Linux Documentation Project の Linux-RAID FAQ
- Art S. Kagel による BAARF (Archive.org) と Why should I not use RAID 5? (Archive.org)
- Linux Magazine の Introduction to RAID、Nested-RAID: RAID-5 and RAID-6 Based Configurations、Intro to Nested-RAID: RAID-01 and RAID-10、Nested-RAID: The Triple Lindy
- HowTo: Speed Up Linux Software Raid Building And Re-syncing
- Wikipedia:Non-RAID drive architectures
メーリングリスト
mdadm
- mdadm のソースコード
- Linux Magazine の Software RAID on Linux with mdadm
- Wikipedia - mdadm
フォーラムのスレッド