2014/04/01 (Tue) 22:34
うちではCentOS6で2TBのディスク7台をRAID6で運用しているのですが、今日そのうちの1台が壊れたらしく、RAIDがデグレード状態になっていました。
ということで予備のディスクを使って復旧を行いました。
まず本当なら壊れたディスクをRAIDから除去するのですが、すっかり忘れてました。
ここからもうすでにいろいろまずかったのですが。
で、マシンをシャットダウンしてディスク交換を行い、再起動しました。
fdiskで交換したディスクにパーティションを作って、パーティションタイプをLinux raid 自動検出に変えます。手順はこんな感じ。
で、このディスクをRAIDに組み込みます。
で、自動的にRAIDのリカバリが始まり、後は待つだけ。。。。
ん?!
なんか変だぞ?
よく見たら/dev/sdfになってるwww
ここは/dev/sdf1でないとダメじゃないですか!
ありゃま、どうしよう、ということでやり直しです。
まず、リカバリ中ですが無視していったんRAIDを止めました。
で、ミスって組み込んだ/dev/sdfをのぞいた6台でRAIDを組みなおします。
間違えて/dev/sdfで組み込んじゃったHDDはパーティションテーブルがおかしくなっているはずなのでいったんクリアしておきます。
で、もう一度fdiskでパーティションを切り直し。手順は上に書いた通りです。
そして、今度こそは/dev/sdf1をRAIDに組み込みます。
これで今度こそちゃんとリカバリが始まりました。
まったく、、我ながらなにやってるんでしょうかねwww
リカバリには丸一日かかるので放置しました。
で、終わったのでいったんリブートしました。するとまたデグレード。
みるとまた/dev/sdfがRAIDに取り込まれている。。。
これを忘れていたのが原因でした。
一度RAIDに取り込んだディスクは、ディスクの末尾にスーパーブロックというRAID専用の情報が書き込まれているので、これを消さないといけませんでした。
あと、よく考えたらAFTのことも忘れていました。AFTというのは物理セクタのサイズを従来の512バイトから4096バイトに拡張したものです。ただしLinux上だと論理セクタは512バイトのままのようです。
普通にfdiskでパーティションを切ると開始位置はシリンダにそろえられますが、これは論理セクタ単位だと63セクタになります。これだとAFTディスクの物理セクタサイズと一致しないので、fdiskを実行したとに以下のようなメッセージが出ます。
<非AFTディスクの場合>
<AFTディスクの場合>
fdiskを-uオプション付きで実行すると表示をセクタ単位にすることができます。それで実行すると以下のようになっています。
開始位置が63になっていて、これが8の倍数(4096/512)になっていないと性能が出ないという話があります。 性能が出ないだけで一応使えますが、とりあえずやり直すならfdiskを-u付きで起動して、ちゃんと物理セクタに合わせてパーティションを切りなおします。
とりあえずこれで再度RAIDに組み込んでリカバリしたらうまくいきました。
RAIDのHDD置換はたまにしかやらないので手順を忘れてしまって一度だとうまくいかないことが多いです。今回はうまくリカバリできたけど、これから失敗しないようにしないと。。。
ということで予備のディスクを使って復旧を行いました。
まず本当なら壊れたディスクをRAIDから除去するのですが、すっかり忘れてました。
ここからもうすでにいろいろまずかったのですが。
で、マシンをシャットダウンしてディスク交換を行い、再起動しました。
fdiskで交換したディスクにパーティションを作って、パーティションタイプをLinux raid 自動検出に変えます。手順はこんな感じ。
# fdisk /dev/sdf (略) コマンド (m でヘルプ): n ←新規パーティション コマンドアクション e 拡張 p 基本領域 (1-4) p ←基本領域 領域番号 (1-4): 1 最初 シリンダ (1-243201, default 1): 1 終点 シリンダ または +サイズ または +サイズM または +サイズK (1-243201, default 243201): +243153 コマンド (m でヘルプ): p Disk /dev/sdf: 2000.3 GB, 2000398934016 bytes 255 heads, 63 sectors/track, 243201 cylinders Units = シリンダ数 of 16065 * 512 = 8225280 bytes デバイス Boot Start End Blocks Id System /dev/sdf1 1 243154 1953134473+ 83 Linux ←普通のLinuxパーティションなのでRAIDに変える コマンド (m でヘルプ): t ←パーティションタイプ変更 Selected partition 1 16進数コード (L コマンドでコードリスト表示): fd ←Linux RAIDを指定 領域のシステムタイプを 1 から fd (Linux raid 自動検出) に変更しました コマンド (m でヘルプ): p ←状態確認 Disk /dev/sdf: 2000.3 GB, 2000398934016 bytes 255 heads, 63 sectors/track, 243201 cylinders Units = シリンダ数 of 16065 * 512 = 8225280 bytes デバイス Boot Start End Blocks Id System /dev/sdf1 1 243154 1953134473+ fd Linux raid 自動検出 ←Linux RAIDになった コマンド (m でヘルプ): w ←結果保存 領域テーブルは交換されました! ioctl() を呼び出して領域テーブルを再読込みします。 ディスクを同期させます。 #
で、このディスクをRAIDに組み込みます。
# mdadm --manage /dev/md2 --add /dev/sdf mdadm: added /dev/sdf
で、自動的にRAIDのリカバリが始まり、後は待つだけ。。。。
# cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] md2 : active raid6 sdc1[0] sdf[7] sdi1[6] sdh1[5] sdg1[4] sde1[2] sdd1[1] 9765672000 blocks level 6, 64k chunk, algorithm 2 [7/6] [UUU_UUU] [>....................] recovery = 0.0% (126080/1953134400) finish=1806.9min speed=18011K/sec
ん?!
なんか変だぞ?
よく見たら/dev/sdfになってるwww
ここは/dev/sdf1でないとダメじゃないですか!
ありゃま、どうしよう、ということでやり直しです。
まず、リカバリ中ですが無視していったんRAIDを止めました。
# mdadm --stop /dev/md2 mdadm: stopped /dev/md2
で、ミスって組み込んだ/dev/sdfをのぞいた6台でRAIDを組みなおします。
# mdadm --assemble /dev/md2 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdg1 /dev/sdh1 /dev/sdi1 mdadm: /dev/md2 has been started with 6 drives (out of 7).
間違えて/dev/sdfで組み込んじゃったHDDはパーティションテーブルがおかしくなっているはずなのでいったんクリアしておきます。
# dd if=/dev/zero of=/dev/sdf bs=512 count=64 64+0 records in 64+0 records out 32768 bytes (33 kB) copied, 0.260877 s, 126 kB/s
で、もう一度fdiskでパーティションを切り直し。手順は上に書いた通りです。
そして、今度こそは/dev/sdf1をRAIDに組み込みます。
# mdadm --manage /dev/md2 --add /dev/sdf1 mdadm: added /dev/sdf1
これで今度こそちゃんとリカバリが始まりました。
# cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] md2 : active raid6 sdf1[7] sdc1[0] sdi1[6] sdh1[5] sdg1[4] sde1[2] sdd1[1] 9765672000 blocks level 6, 64k chunk, algorithm 2 [7/6] [UUU_UUU] [>....................] recovery = 0.3% (6041092/1953134400) finish=1535.5min speed=21132K/sec
まったく、、我ながらなにやってるんでしょうかねwww
リカバリには丸一日かかるので放置しました。
で、終わったのでいったんリブートしました。するとまたデグレード。
みるとまた/dev/sdfがRAIDに取り込まれている。。。
これを忘れていたのが原因でした。
# mdadm --zero-superblock /dev/sdf
一度RAIDに取り込んだディスクは、ディスクの末尾にスーパーブロックというRAID専用の情報が書き込まれているので、これを消さないといけませんでした。
あと、よく考えたらAFTのことも忘れていました。AFTというのは物理セクタのサイズを従来の512バイトから4096バイトに拡張したものです。ただしLinux上だと論理セクタは512バイトのままのようです。
普通にfdiskでパーティションを切ると開始位置はシリンダにそろえられますが、これは論理セクタ単位だと63セクタになります。これだとAFTディスクの物理セクタサイズと一致しないので、fdiskを実行したとに以下のようなメッセージが出ます。
<非AFTディスクの場合>
ディスク /dev/sdg: 2000.4 GB, 2000398934016 バイト ヘッド 255, セクタ 63, シリンダ 243201 Units = シリンダ数 of 16065 * 512 = 8225280 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト ← 物理セクタ=論理セクタ I/O size (minimum/optimal): 512 bytes / 512 bytes ディスク識別子: 0x0811122f デバイス ブート 始点 終点 ブロック Id システム /dev/sdg1 1 243154 1953134473+ fd Linux raid 自動検出 (ここに何も出ない)
<AFTディスクの場合>
# fdisk -l /dev/sdf ディスク /dev/sdf: 2000.4 GB, 2000398934016 バイト ヘッド 255, セクタ 63, シリンダ 243201 Units = シリンダ数 of 16065 * 512 = 8225280 バイト セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト ←ここの物理が4096バイト I/O size (minimum/optimal): 4096 bytes / 4096 bytes ディスク識別子: 0x00000000 デバイス ブート 始点 終点 ブロック Id システム /dev/sdf1 1 243154 1953134473+ fd Linux raid 自動検出 Partition 1 does not start on physical sector boundary. ←こんなエラーが出る
fdiskを-uオプション付きで実行すると表示をセクタ単位にすることができます。それで実行すると以下のようになっています。
# fdisk -lu /dev/sdf ディスク /dev/sdf: 2000.4 GB, 2000398934016 バイト ヘッド 255, セクタ 63, シリンダ 243201 Units = シリンダ数 of 16065 * 512 = 8225280 バイト セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト I/O size (minimum/optimal): 4096 bytes / 4096 bytes ディスク識別子: 0x00000000 デバイス ブート 始点 終点 ブロック Id システム /dev/sdf1 63 3906269009 1953134473+ fd Linux raid 自動検出 Partition 1 does not start on physical sector boundary.
開始位置が63になっていて、これが8の倍数(4096/512)になっていないと性能が出ないという話があります。 性能が出ないだけで一応使えますが、とりあえずやり直すならfdiskを-u付きで起動して、ちゃんと物理セクタに合わせてパーティションを切りなおします。
[root@developper ~]# fdisk -u /dev/sdf 警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを 強く推奨します。. コマンド (m でヘルプ): p ディスク /dev/sdf: 2000.4 GB, 2000398934016 バイト ヘッド 255, セクタ 63, シリンダ 243201, 合計 3907029168 セクタ Units = シリンダ数 of 16065 * 512 = 8225280 バイト セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト I/O size (minimum/optimal): 4096 bytes / 4096 bytes ディスク識別子: 0x00000000 デバイス ブート 始点 終点 ブロック Id システム /dev/sdf1 63 3906269009 1953134473+ fd Linux raid 自動検出 コマンド (m でヘルプ): d 選択した領域 1 コマンド (m でヘルプ): n コマンドアクション e 拡張 p 基本パーティション (1-4) p パーティション番号 (1-4): 1 最初 セクタ (63-3907029167, 初期値 63): 64 ← ここで64を指定 Last セクタ, +セクタ数 or +size{K,M,G} (64-3907029167, 初期値 3907029167): 初期値 3907029167 を使います ← Lastセクタは1足して8の倍数ならOK コマンド (m でヘルプ): p ディスク /dev/sdf: 2000.4 GB, 2000398934016 バイト ヘッド 255, セクタ 63, シリンダ 243201, 合計 3907029168 セクタ Units = シリンダ数 of 16065 * 512 = 8225280 バイト セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト I/O size (minimum/optimal): 4096 bytes / 4096 bytes ディスク識別子: 0x00000000 デバイス ブート 始点 終点 ブロック Id システム /dev/sdf1 64 3907029167 1953514552 83 Linux コマンド (m でヘルプ): t 選択した領域 1 16進数コード (L コマンドでコードリスト表示): fd 領域のシステムタイプを 1 から fd (Linux raid 自動検出) に変更しました コマンド (m でヘルプ): p ディスク /dev/sdf: 2000.4 GB, 2000398934016 バイト ヘッド 255, セクタ 63, シリンダ 243201, 合計 3907029168 セクタ Units = シリンダ数 of 16065 * 512 = 8225280 バイト セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト I/O size (minimum/optimal): 4096 bytes / 4096 bytes ディスク識別子: 0x00000000 デバイス ブート 始点 終点 ブロック Id システム /dev/sdf1 64 3907029167 1953514552 fd Linux raid 自動検出 (ここにエラーメッセージが出なければOK) コマンド (m でヘルプ): w パーティションテーブルは変更されました! ioctl() を呼び出してパーティションテーブルを再読込みします。 ディスクを同期しています。
とりあえずこれで再度RAIDに組み込んでリカバリしたらうまくいきました。
RAIDのHDD置換はたまにしかやらないので手順を忘れてしまって一度だとうまくいかないことが多いです。今回はうまくリカバリできたけど、これから失敗しないようにしないと。。。
ランキングに参加してみました。クリックしていただければ嬉しいです。
にほんブログ村 |
パソコン ブログランキングへ |
PR
Comment
プロフィール
HN:
zui
性別:
非公開
カテゴリー
最新記事
(09/28)
(09/03)
(08/26)
(07/23)
(05/24)
PR
忍者カウンター