Ubuntu12.04によるHDDチェック、RAIDの解除

自宅のメイン機に発生した障害の原因がHDDの故障であることが判明し、RAID0アレイを解除することになりました。
その際の記録です。


故障したHDDのSMART情報

Ubuntu環境におけるHDDチェック

LinuxでHDDのチェックを検索すると、出てくるのはfsckの使い方ばかりです。
しかしfsckはあくまでパーティション管理ツールであり、HDDそのものをセクタチェックしたい場合には役に立ちません。

UbuntuにはHDDのチェック機能を持った「ディスクユーティリティ」が標準でインストールされています。

「ディスクユーティリティ」にてHDD情報を表示したところ


情報を見たいHDDの「SMARTデータ(A)」をクリックすると、別ウィンドウが立ち上がり、HDDのSMART情報を閲覧することができます。
このウィンドウからディスク状態を知ることができ、チェックディスク(実態はよくわかりませんが)を実行することもできます。
(「SMARTデータ(A)」から「セルフテストを実行(S)」の「詳細(およそ数十分)(E)」を実行する。)

サーバを使用している場合や、Ubuntu以外のディストリビューションを使っていて同アプリケーションが使えない場合は、CUIでSMART情報を取得したり、SMART命令を発行できる smartctl コマンドを駆使することになるかと思います。

メイン機に発生した障害は、コンパイル中にマシンがパニックするというもので、最初はCPUを疑っていました。
ところが、ディスクユーティリティを見るとHDDのうちの一台が大きなエラー値を示しており、チェックディスクをかけたところ、席を立った短い間にUbuntuが再起動していました。
ほぼ犯人決定で良いと思います。


RAID0アレイを解除する

RAIDアレイの特定

RAIDシステムには、LinuxのmdadmによるソフトウェアRAIDを使用しています。これからそのRAID0アレイを解除していきます。

まず、対象のRAIDアレイを特定します。
私のマシンにはRAID0アレイとRAID1アレイが存在しているため、消すアレイを間違えると大変なことになります。

とりあえずお約束的なコマンドで、RAIDアレイの存在を確認。
$ sudo mdadm --detail --scan
ARRAY /dev/md/0 metadata=1.2 name=my-machine:0 UUID=xxxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxxx
ARRAY /dev/md/1 metadata=1.2 name=my-machine:1 UUID=yyyyyyyy:yyyyyyyy:yyyyyyyy:yyyyyyyy

こちらのコマンドにてアレイのRAIDレベルを確認します。
$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid0 sdd2[2] sdf2[1] sda2[0]
      1855976448 blocks super 1.2 512k chunks
     
md0 : active raid1 sdc1[2] sdb1[3]
      2929739776 blocks super 1.2 [2/2] [UU]

詳細を確認します。
$ sudo mdadm -D /dev/md/1
/dev/md/1:
        Version : 1.2
  Creation Time : Mon Jun  4 23:17:06 2012
     Raid Level : raid0
     Array Size : 1855976448 (1770.00 GiB 1900.52 GB)
   Raid Devices : 3
(途中略)
    Number   Major   Minor   RaidDevice State
       0       8        2        0      active sync   /dev/sda2
       1       8       82        1      active sync   /dev/sdf2
       2       8       50        2      active sync   /dev/sdd2


以上の出力を勘案すると、目的のRAID0アレイは/dev/md/1のようです。

RAIDアレイの使用法を確認するため /etc/fstab を見ます。
$ less /etc/fstab
上記コマンドにて確認してみたところ、(抜粋)
/dev/vg_raid0/lv_raid0 /raid0_array ext4 noatime 0 2

となっておりました。
つまりLVMがRAIDアレイの上に存在するようです。
今回は論理ボリュームの母体であるRAID0を解体することが決定しているので、LVMはRAIDアレイごと消滅させてしまうことにしました。


マウントの解除

まずはRAIDアレイ上のファイルシステムのマウントを解除します。
$ sudo umount /dev/vg_raid0/lv_raid0

RAIDアレイを停止させようとすると、以下のメッセージが表示されます。
$ sudo mdadm --misc --stop /dev/md1
mdadm: Cannot get exclusive access to /dev/md1:Perhaps a running process, mounted filesystem or active volume group?

どうやらLVMを停止させる必要があるようです。
LVMの論理ボリューム(LV)を停止
$ sudo lvscan
  ACTIVE            '/dev/vg_raid0/lv_raid0' [1.73 TiB] inherit
$ sudo lvchange -an /dev/vg_raid0/lv_raid0

今度こそRAIDアレイを停止させます。
$ sudo mdadm --misc --stop /dev/md1
mdadm: stopped /dev/md1

RAIDメタデータの削除
$ sudo mdadm --zero-superblock /dev/sd[afd]2

mdadmソフトウェアRAIDのメタデータを削除します。
RAIDメンバのHDDには、特定の箇所にそのHDDが所属する RAIDアレイに関する情報が記述されています。これをメタデータと呼びます。
LinuxのディスクユーティリティはRAIDアレイを不用意に削除しないよう、RAIDメタデータを検出したディスクの初期化を受け付けません。

起動時に自動マウントしている場合は、忘れずRAIDアレイのマウント設定を /etc/sftab から削除しておきます。
$ sudo vim /etc/fstab
vimが使えないならvimの箇所をgeditに置き換えます。


感想:
心臓に悪いので、次からはRAID1アレイを物理的に外してから作業しようと思います。


確認

念のためUbuntuを再起動して、RAIDアレイの消滅を確認しておきます。
( /etc/fstab の編集が間違っていない確認も兼ねています。)
$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdc1[2] sdb1[3]
      2929739776 blocks super 1.2 [2/2] [UU]
     
unused devices: <none>


問題なく消えているようです。
スーパーブロックのメタデータが削除されたことを確認したければ、partedコマンドなどでパーティションテーブルを書きこんでみればよいかと思います。


RAID0アレイの構築

ここから先はおまけです。






"Read Error Rate"の値
(「0でなければ異常値」と説明に書いてある)


ところでこの値のどこが"Good"なのか、誰か教えてください。
(注:SMART値の取得は各HDDメーカおよび製品によって異なります。型番レベルで命令が異なる場合すらあるそうです。そういった事情もあり、SMARTの値は必ずしも信用できるものではありません。詳しい事情はCrystal Dew Blog 様のところでたまに記事になっています。)

まず、ディスクユティリティにて、対象のHDDのブロックデバイスをパスで把握します。

$ sudo blkid
接続されているブロックデバイス上のパーティションの一覧を表示する。
パーティションの作られていないHDDを表示できないなど、これひとつでは情報が足りないが、雑かつ大まかに全体を捉えるのにちょうど良い。

$ sudo parted
printにて、ハードディスク情報の概要とパーティション構成を把握することができる。

$ ls -l /dev/disk/by-id
HDDのシリアルナンバーを取得する。
物理的なHDDの挿抜作業をするにあたってHDDを識別するために必須のコマンドです。
RAID環境では物理的なHDDの識別ミスがありがちです。同種HDDの一括購入により、故障時に取り外すべきHDDを識別する必要がありますが、ブロックデバイス名が印字されているわけではないので、困難を極めます。
(ちなみに私は、HDDの先頭領域に小さなパーティションを作って、そのUUIDをHDDに印字しておく、という方法を取っていました。)

ディスクユーティリティにてブロックデバイスのパスを把握する
今回は、解除した際と同じ /dev/sda/dev/sdf のようです。

念のため、事前に「SMARTデータ(A)」から「セルフテスト(C)」の「詳細なチェック」をかけておきましょう。

RAIDメンバになる予定のHDDをディスクチェック

チェックの終わった /dev/sda/dev/sdf をまとめてRAID0アレイを構築します。

新しいRAIDアレイのためにデバイスノードを作成し、そこへmdadmコマンドで2つのブロックデバイスを集約します。
なお、私はHDD上にパーティションを切って、パーティションをRAIDアレイのメンバにするようにしていますが、HDD上のすべての領域をRAIDアレイにしてしまうのならば、パーティションを切らずに直接ブロックデバイスを指定しても構いません。
$ sudo mknod /dev/md1 b 9 1
$ sudo mdadm --create /dev/md1 --level=0 --raid-device=2 /dev/sd[af]2
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.


RAID0アレイが構築できていることを確認します。
$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid0 sdf2[1] sda2[0]
      1237318656 blocks super 1.2 512k chunks
     
md0 : active raid1 sdc1[2] sdb1[3]
      2929739776 blocks super 1.2 [2/2] [UU]
     
unused devices: <none>


確かにRAID0アレイが出来ているようです。

RAID0アレイを利用するために、ext4ファイルシステムを作成してマウントします。
$ sudo mkfs -t ext4 /dev/md1
$ sudo mount /dev/md1 /raid0_array

無事にマウントされていれば、ディレクトリ "lost+found" が存在しているはずです。
$ ls /raid0_array
lost+found

ファイルを書きこんでみます。
まず、chownでRAIDアレイ上のディレクトリの所有者を自分に変更します。
その後、touchコマンドで空のファイルを作成します。
$ sudo chown $LOGNAME:$LOGNAME -R /raid0_array
$ touch /raid0_array/test

ファイルシステム上に"test" ができていることを確認できれば成功です。
$ ls /raid0_array

lost+found  test

起動時に自動マウントするように、RAID0アレイ上のファイルシステムを/etc/fstabに登録します。
後で確認するために、まずは手動でマウントしたファイルシステムをアンマウントします。
$ sudo umount ~/raid0_array
次に、blkidにてRAID0アレイに作成したファイルシステムのUUIDを調べます。
$ sudo blkid
/dev/md1: UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="ext4" 

わかったUUIDを下に、自動マウントの設定を以下のように記述します。
$ sudo vim /etc/fstab
UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"  /home/hibi/raid1 ext4 noatime 0 2

以下のコマンドにて、/etc/fstabに設定されたマウント処理を行います。
$ sudo mount -a

マウント先のディレクトリ上に、アンマウント前と同じファイルが存在していれば、自動マウントの設定は成功です。
$ ls /raid0_array

lost+found  test


念のためOSを再起動して確認しましょう。

以上で、mdadmによるRAID0アレイを構築して使用することができるようになります。

このブログの人気の投稿

Ubuntu13.04で使える動画編集ソフト一覧

squid3プロキシサーバの設定(Ubuntu13.10)

ubuntu13.04で無線LANが繋がらない場合の対処