daemonfreaks.com

mdadmのソフトウェアRAID復旧

posted by jun-g at Tue, 25 Sep 2012 17:56 JST

先日、自宅でブレーカーが落ちて停電してしまう事件?が発生しました。よくある過電流による停電の場合、回路ブレーカーが落ちて一部屋だけ停電したりするのですが、今回は主幹ブレーカーが落ちてしまい、全部屋が停電になりました。

とりあえずスマホでネット検索して原因と対策を調べました。原因としては漏電の可能性があること、対策としては問題のある箇所の回路ブレーカーのみを落としておけばとりあえず大丈夫であることがわかりました。

ということで問題となる箇所の回路ブレーカーを探してその日はとりあえず事なきを得ました。後日、電気工事業者に来てもらい、漏電箇所は修理してもらいました。(実際は修理不可能な箇所だったので、壁口コンセントを一箇所殺して終わり。)

で、漏電はこれで良かったのですが、停電した日に何度も家のブレーカーがバチバチ落ちたせいで、UPSを使ってない自宅サーバー(OSはXenServer)がもろに被害を受けてしまいました。

サーバーを起動し、XenCenterからつないでみると、ストレージが見つからないという警告。sshでログインしてRAIDの様子を確認してみると、HDDは4本使っているのに3本しか認識していない状態でした。

で、筐体を開けて確認してみると、何故かこのタイミングでHDDの電源ケーブルが1本抜けかかっていました…。そのケーブルを接続し直して改めてサーバーを起動し直すと、無事に4本認識しました。

しかし、RAIDの様子を確認すると、4本認識しているものの、様子は変わらず。

[root@xenserver ~]# cat /proc/mdstat
Personalities :
md0 : inactive sdb1[0](S) sde1[3](S) sdd1[2](S) sdc1[1](S)
      3907039744 blocks

unused devices: <none>

とりあえずネットでmdadmのraid復旧方法を調べて、そのとおりの手順で復旧を試みてみたところ、無事に復旧しました。手順は以下の通り。

まずはAssembleモードでmdadmを実行。

[root@xenserver ~]# mdadm -A /dev/md0 /dev/sd[bcde]1
mdadm: /dev/md0 assembled from 3 drives - not enough to start the array while not clean - consider --force.

怒られます。なので強制的に行う「--force」オプションを追加して実行。(ついでに詳細を出力する「-v」オプションも追加。)

[root@xenserver ~]# mdadm -v -A --force /dev/md0 /dev/sd[bcde]1
mdadm: looking for devices for /dev/md0
mdadm: /dev/sdb1 is identified as a member of /dev/md0, slot 0.
mdadm: /dev/sdc1 is identified as a member of /dev/md0, slot 1.
mdadm: /dev/sdd1 is identified as a member of /dev/md0, slot 2.
mdadm: /dev/sde1 is identified as a member of /dev/md0, slot 3.
mdadm: added /dev/sdc1 to /dev/md0 as 1
mdadm: added /dev/sdd1 to /dev/md0 as 2
mdadm: added /dev/sde1 to /dev/md0 as 3
mdadm: added /dev/sdb1 to /dev/md0 as 0
mdadm: /dev/md0 has been started with 3 drives (out of 4).

今度は上手くいったようなので、状態を確認。

[root@xenserver ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdb1[0] sde1[3] sdd1[2]
      2930279808 blocks level 5, 64k chunk, algorithm 2 [4/3] [U_UU]

unused devices: <none>
[root@xenserver ~]# mdadm -D /dev/md0
/dev/md0:
        Version : 0.90
  Creation Time : Mon Jul  4 17:39:51 2011
     Raid Level : raid5
     Array Size : 2930279808 (2794.53 GiB 3000.61 GB)
  Used Dev Size : 976759936 (931.51 GiB 1000.20 GB)
   Raid Devices : 4
  Total Devices : 3
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Fri Sep 21 21:13:32 2012
          State : clean, degraded
 Active Devices : 3
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 64K

           UUID : 11c0d6c2:2c1cae2a:99080105:010c0b1b
         Events : 0.11416776

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       0        0        1      removed
       2       8       49        2      active sync   /dev/sdd1
       3       8       65        3      active sync   /dev/sde1

sdc1が無い3本構成の状態でRAID自体は復旧したみたいです。まずは一安心。

で、次にsdc1をRAIDに再追加。

[root@xenserver ~]# mdadm /dev/md0 -a /dev/sdc1
mdadm: re-added /dev/sdc1

追加されたようなので、確認。

[root@xenserver ~]# mdadm -D /dev/md0
/dev/md0:
        Version : 0.90
  Creation Time : Mon Jul  4 17:39:51 2011
     Raid Level : raid5
     Array Size : 2930279808 (2794.53 GiB 3000.61 GB)
  Used Dev Size : 976759936 (931.51 GiB 1000.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Sun Sep 23 10:10:28 2012
          State : clean, degraded, recovering
 Active Devices : 3
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 1

         Layout : left-symmetric
     Chunk Size : 64K

 Rebuild Status : 0% complete

           UUID : 11c0d6c2:2c1cae2a:99080105:010c0b1b
         Events : 0.11416781

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       4       8       33        1      spare rebuilding   /dev/sdc1
       2       8       49        2      active sync   /dev/sdd1
       3       8       65        3      active sync   /dev/sde1

sdc1がRAIDに追加され、リビルドが始まりました。この数時間後に、無事にRAIDが復旧したことを確認しました。

思ったことなど

  • mdadmどころかLinux自体に不慣れなので、こういう障害が発生すると軽くパニックになります。 仮想ホストOSにも慣れているFreeBSDが使いたいので、 BHyVe の実用化が待ち遠しいです。
  • こういう障害復旧方法はいつかの自分の為にブログに書いてますが、自宅サーバーが死ぬとこのブログも閲覧できなくなるので、障害が発生する度にいつも途方に暮れます…。
  • やはりUPSは必要ですね。買いましょう。

ハイパーバイザ型仮想化ソフト事始め その4 NetBSDでXen/Dom0とRAID構築編

posted by jun-g at Sun, 08 May 2011 14:42 JST

前回の続き

NetBSDのインストール

まずはNetBSD 5.1/amd64をインストール。普通にインストールCDから起動してインストール先をUSBメモリにしてインストールするだけで完了。

…とはいかず。ML110 G6のオンボードLANがNetBSDで認識されなかった。VM用にPlanexのLANアダプタを増設してあってそちらは認識されたので無事インストールできた。

PLANEX PCI-EX 1000BASE-T LANアダプタ  GPE-1000T

PLANEX PCI-EX 1000BASE-T LANアダプタ GPE-1000T

インストール後、USBから問題なくブートする事を確認。NetBSDを初めて触ったのでFreeBSDとの違いにやや戸惑う。cvsupすら無いのか。でもって最新のpkgsrcをcvsからcheckoutして下準備。USBメモリの書込速度が遅いことも手伝ってめちゃくちゃ時間がかかった。

Dom0の構築

4月上旬に最新のXen4.1がpkgsrcに登録されたことを知り早速インストールしようとしたが、pkgsrcのMakefileを見るとNetBSD-currentでしか使えないみたいだった。残念。

というわけで、pkgsrcに登録されている一つ前のバージョンであるXen3.3を使う事にした。インストールおよびセットアップは以下のページを参考にした。

NetBSD/xen環境の構築 64bit編

Xenのインストール及び設定が完了し、無事Dom0が起動していることが確認できた。

# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0   512     1     r-----     10.3

RAID10の構築

続いてRAID10の構築。 NetBSDでは標準で RAIDframe という機能が搭載されていて、これを使ってRAIDを構築する。

FreeBSDでRAID10を構築した際はgmirrorでRAID1アレイを複数作成し、それらをgstripeでRAID0に束ねるという方法を使ったが、NetBSDでも同様の方法で構築する、とraidctl(8)のマニュアルに書いてあったのでその通りにする。RAID構築にあたっては下記のページを参考にした。

Raidframe: ソフトウエア RAID 1 の設定例

まずはRAID1でraid0とraid1(ややこしいがそれぞれデバイス名)の設定ファイルを作成。

# cat /etc/raid0.conf
START array
1 2 0

START disks
/dev/wd0e
/dev/wd1e

START layout
128 1 1 1

START queue
fifo 100

# cat /etc/raid1.conf
START array
1 2 0

START disks
/dev/wd2e
/dev/wd3e

START layout
128 1 1 1

START queue
fifo 100

次に実際にRAID1アレイを構築して初期化。

# raidctl -C /etc/raid0.conf raid0
# raidctl -I 0 raid0
# raidctl -iv raid0
# raidctl -C /etc/raid1.conf raid1
# raidctl -I 1 raid1
# raidctl -iv raid1

でもってdisklabelを設定してnewfsして使えるようにする。disklabelはこんな感じ。

# disklabel raid0
# /dev/rraid0d:
type: RAID
disk: raid
label: fictitious
flags:
bytes/sector: 512
sectors/track: 128
tracks/cylinder: 8
sectors/cylinder: 1024
cylinders: 1907739
total sectors: 1953524992
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0           # microseconds
track-to-track seek: 0  # microseconds
drivedata: 0

4 partitions:
#        size    offset     fstype [fsize bsize cpg/sgs]
 a: 1953524992         0     4.2BSD      0     0     0  # (Cyl.      0 - 1907739*)
 d: 1953524992         0     unused      0     0        # (Cyl.      0 - 1907739*)

raid1のdisklabelも同じ内容。続いてRAID0の構築。raid0とraid1を束ねる。

# cat /etc/raid2.conf
START array
1 2 0

START disks
/dev/raid0a
/dev/raid1a

START layout
128 1 1 0

START queue
fifo 100

# raidctl -C /etc/raid2.conf raid2
# raidctl -I 2 raid2
# raidctl -iv raid2

あとは同じようにdisklabelを書きこんでnewfsして完了。マウントしてファイルの読み書きが出来ることを確認。

しかし再起動してみるとraid2が認識されない。どうもautoconfigというモードを有効にしないといけないらしいのでautoconfigを有効にする。

# raidctl -A raid0
# raidctl -A raid1
# raidctl -A raid2

raid0とraid1はしなくても良かったのかもしれないが念の為。これで再起動しても自動的にraid2が認識されるようになったので、/etc/fstabにマウントの設定を追加して作業完了。

# echo '/dev/raid2a /pub ffs rw 1 2' >> /etc/fstab

続く。

ハイパーバイザ型仮想化ソフト事始め その3

posted by jun-g at Sat, 07 May 2011 14:23 JST

前回の続き

USBメモリへのインストール

まずはXenServerをUSBメモリにインストール。HDDへのインストールと同様にインストールCDからブートして、インストール先にUSBメモリを指定するだけ。VM用のストレージは後でRAID化するので4つのHDDのうち一つだけを選択。

順調にインストールが進む…はずだったが、USBメモリの書込速度が遅いせいかインストール中にエラーになってしまった。何度か試してみたものの必ずエラーになってしまうので、諦めてHDDをUSB接続してそちらにインストールし、インストール後にUSBメモリにコピーすることにした。

HDDへのインストール完了後、再度インストールCDから起動し、インストーラの起動メニューでshellモードに落ちてからddコマンドを使ってHDDの内容をUSBメモリにコピー。

コピーが終わったら、下記ページを参考にしてUSB bootできる状態にする。

XenServer on USB その2 | ni kvel

これで、無事USBメモリにインストールしたXenServerを動作させることができた。

RAID10化

続いてストレージ部分のRAID10化。この作業は下記のページを参考にした。

XenServer を RAID10 化しました

ほぼ書かれている通りに作業して、これにて構築完了。とはいかず、RAID構築中に勝手にリブートしてしまう事象が発生。何度やってもダメ。ここで心が折れて諦めてしまった。

よく考えるとML110 G6にはオンボードRAIDが付いてるのでさっさとそれを使ってRAIDを構築すれば良かったのに、この時はRAIDが付いてる事にまったく気がついてなかった。

という訳で、やっぱり オープンソース版のXen を使って構築しようという思いにいたり、Dom0(XenのホストOS)には NetBSD 5.1 を使う事にした。

続く。