SSDの追加でデバイス名が変わってしまった。mdadm.confの設定を変更

えーと本日は、LinuxのソフトウェアRAIDのお話である。
うちの環境のサーバーマシン。とりあえず、HDDは壊れるものと考えているので、RAID1でミラーリングしている。といってもハードウェアのRAIDではなく、SATAのHDDをふたつ繋げてLinuxの機能でRAIDを構成している。mdadmで管理するやつね。
ここ数年はHDDドライブが死ぬことなく、動作している。
しかしである。サーバーマシンでOracleを稼働させていると、どうも重たい。普通にLinux上でやればよかったのだが、VirtualPCでやっているものだから、なおさら遅い。Virtual PC上で動かしているのは諸事情があって...
SSD入れたら、速くなるかも?ということで、PCI Expressスロットに入れるSATAⅢとSSDを買ってきた。Mac miniでやったときは、かなりの効果があったので、期待できる。
しかしである。蓋開けて、PCIに突っ込んで、再起動で一発認識、とは行かなかった...
まず、なんか、md1が認識できずに、マウント失敗。md1は、RAID0のストライピングをしているディスク。md0がRAID1のミラーリング。md1に、VirtualPCの仮想HDDが作成されている。
なんで?と思ったが、原因はすぐにわかった。認識されるデバイス番号が変わってしまったからであった。今までは、/dev/sdaがmd0の最初のドライブであったものが、追加したSSDが/dev/sdaになってしまい、その後のドライブがひとつずれてしまった形になってしまったのである。
やばー。
ということで、すかさず、PCI Expressからカードを引っこ抜いて、再起動。
起動ドライブは、IDE(PATA)で接続しているSSDなので、md0やらRAIDとは関係なし。この点は安心できる。
再起動したら、無事に上がってきた。
/proc/mdadm.statを見てみると、おや、ミラーリングしているmd0でデバイスがひとつ死んでいる。あー、やってしまったか。
たぶん、デバイス名が変わってしまった状態でRAIDが構成されたので、ふたつのドライブ(sdaとsdb)に差異ができてしまったのであろう。ドライブ自体は、死んでないと思われる。
でも、しばらく見てなかったから、しらないうちに壊れたのかもと不安に思いつつも、mdadmで使われていないsdbを追加し直す。コマンドの引数はどうやったか忘れた。mdadmの--add /dev/sdb1とかっぽいものを実行したと思う。
リビルドが始まった。sda1からsdb1へコピーが行われているようである。コピーには数時間はかかりそう。500GのHDDだからね。
リビルドは、無事終わった!
なんとか、切り抜けたか。ひと安心である。
しかし、同じことをやると、同じようにRAIDが崩れてしまうしなぁ...どうすればよいのじゃ...
mdadm.confを書き換えて再起動かければよいのかなぁ... なんか自信ないなぁ...
とりあえず、今日のところはバックアップだけしてみよう。
/homeと/home2でかなり使っている。500GのHDDをUSB接続できたので、これに入る分にだけダイエットするか。バックアップ的なものは、DVDに焼いて... なんとか500Gに収まる程度にできた。VirtualBOXのvhdファイルってそのまま、コピーしてOKなんだっけか?
あー、いろいろ不安要素はあるが、一応はバックアップできたので、後日、mdadm.confを書き換えて再起動をかけてみよう。
その後日
/etc/mdadm.confは以下のようになっていた
変更前の/etc/mdadm.conf

# ARRAY1 md0 RAID1 mirroring
DEVICE /dev/sd[ab]1
ARRAY /dev/md0 devices=/dev/sda1,/dev/sdb1
# ARRAY2 md1 RAID0 striping
DEVICE /dev/sd[de]1
ARRAY /dev/md1 devices=/dev/sdd1,/dev/sde1

これをSSDを追加した後に認識されるデバイス名に変更していけば、よいのだが、今後HDDやSSDが追加されることも考え、よい設定方法はないものかと調べることに。
デバイス名
そもそも、/dev/sdaやsdbといったデバイス名は、カーネルがブートしてくる際に決定するもの。ドライブを認識すると順番にa、b、cと名前を付けていく感じになる。
このHDDはsdaで、こっちはsdbといった名前付けのルールを書いておけば、udevがなんかうまいことやってくれそう。
しかし、名前付けのルールを書くのなんかめんどう。HDDのシリアル番号を指定しなければならなかったりする。もっとよい方法はないものかと調べると、/dev/disk/by-path以下のデバイス名で書いてしまえばOKらしい。
変更後の/etc/mdadm.conf

# ARRAY1 md0 RAID1 mirroring
#DEVICE /dev/sd[ab]1
#ARRAY /dev/md0 devices=/dev/sda1,/dev/sdb1
DEVICE /dev/disk/by-path/pci-0000:00:1f.2-scsi-0:0:0:0-part1 /dev/disk/by-path/pci-0000:00:1f.2-scsi-0:0:1:0-part1
ARRAY /dev/md0 devices=/dev/disk/by-path/pci-0000:00:1f.2-scsi-0:0:0:0-part1,/dev/disk/by-path/pci-0000:00:1f.2-scsi-0:0:1:0-part1
# ARRAY2 md1 RAID0 striping
#DEVICE /dev/sd[de]1
#ARRAY /dev/md1 devices=/dev/sdd1,/dev/sde1
DEVICE /dev/disk/by-path/pci-0000:03:01.0-scsi-0:0:0:0-part1 /dev/disk/by-path/pci-0000:03:01.0-scsi-1:0:0:0-part1
ARRAY /dev/md1 devices=/dev/disk/by-path/pci-0000:03:01.0-scsi-0:0:0:0-part1,/dev/disk/by-path/pci-0000:03:01.0-scsi-1:0:0:0-part1

/dev/disk/by-pathの中には、認識されたドライブが、パス形式の名前で作成されている。でこれらのファイルは実際はシンボリックリンクで、実際は、sdb1やらsddといったデバイス名にリンクされている。
HDDが接続されているポートを変更しない限り、/dev/disk/by-path以下のデバイス名を使って指定しておけば、mdadm.confの変更はしなくてよくなるはず。
さぁ、再起動してみるか... ちょっと不安だが...
md0 ... [OK]
md1 ... [OK]
おお、認識した。
/proc/mdstatでも確認しておこう。

# more /proc/mdstat
Personalities : [raid1] [raid0]
md1 : active raid0 sde1[0] sdf1[1]
1113513152 blocks 64k chunks
md0 : active raid1 sdb1[0] sdc1[1]
488383936 blocks [2/2] [UU]
unused devices: 

OK。動いている。
余談ではあるが、サーバーマシンのマザーをASRockの「C2750D4I」または「C2550D4I」に変更しようかと画策中である。

ASRock マザーボード  Avoton オクタコアC2750オンボードServer MiniITX            C2750D4I

ASRock マザーボード Avoton オクタコアC2750オンボードServer MiniITX C2750D4I

  • 出版社/メーカー: ASROCK
  • メディア: Personal Computers

C2550D4Iは、在庫なしで注文できないなぁ。人気なのかぁ。

投稿者プロフィール

asai
asai
システムエンジニア
喋れる言語:日本語、C言語、SQL、JavaScript