忍者ブログ
PCメモ
PC関係のメモ、気付いたこと。 simhとChromium OSをいじって遊んでいます。 Chromium OSのカスタムビルドを配布しています。(http://chromiumosde.gozaru.jp) twitter: @zui22904336 PGP fingerprint: 45FC 0E47 A68A FA06 02FE 2BEF B72C C6E6 F9FF 1C19
Admin / Write
8/10(木)〜8/20(日)の間はChromium OS カスタムビルドに関する活動をおやすみいたします。期間中にお問い合わせをいただいても対応はできません。
2014/04/01 (Tue) 22:34
うちではCentOS6で2TBのディスク7台をRAID6で運用しているのですが、今日そのうちの1台が壊れたらしく、RAIDがデグレード状態になっていました。

ということで予備のディスクを使って復旧を行いました。

まず本当なら壊れたディスクを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置換はたまにしかやらないので手順を忘れてしまって一度だとうまくいかないことが多いです。今回はうまくリカバリできたけど、これから失敗しないようにしないと。。。



ランキングに参加してみました。クリックしていただければ嬉しいです。

にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

パソコン ブログランキングへ

拍手[0回]

PR


Comment
Name
Title
Mail
URL
Comment
Pass   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
  HOME   26  25  24  23  22  21  20  19  18  17  15 
プロフィール
HN:
zui
性別:
非公開
PR
忍者カウンター
忍者ブログ [PR]