雲の上はいつも青空 -6ページ目

雲の上はいつも青空

不思議な経歴をもつエンジニア!?の徒然なブログです。
お仕事関係の話が多いと思いますが、コメントとかもらえると中の人はとても喜びます(^O^)/

『ソフトウェアRAID1(ミラーリング)を作成し運用中にsdaに障害が発生し、なんとsdbにgrubが入っていなかったので起動しなくなってしまった~』という、ありがちなシーンを想定してgrubインストール実践編を書いてみます。
※もっと簡単でスマートなやり方があると思いますが、私は以下のような方法しか思いつかなかったです(苦笑)。

◎やり方のサマリー
1.インストールCDのレスキューモードでsdbにgrub単体をインストール
2.sdbより起動し、grubコマンドを使いマニュアルで起動!
3.起動したらsdbにgrubを再インストール
4.sdaに接続してある新品のHDDにパーティション作成&RAIDを再構築
5.sdaのMBRにgrubをインストール


○テスト環境
・Debian GNU 6.0 linux squeeze
・sdaとsdbでRAID1を構築する
・MBRにgrubがインストールされているのはsdaのみ!
・パーティションの状況は以下の通り。

/md0    sda1, sdb1    /boot
/md1 sda2, sdb2 swap
/md2 sda5, sdb5 /

Device Boot Start End Blocks Id System
/dev/sda1 * 1 34 273073+ fd Linux raid autodetect
/dev/sda2 35 296 2104515 fd Linux raid autodetect
/dev/sda3 297 950 5253255 5 Extended
/dev/sda5 297 950 5253223+ fd Linux raid autodetect

Device Boot Start End Blocks Id System
/dev/sdb1 * 1 34 273073+ fd Linux raid autodetect
/dev/sdb2 35 296 2104515 fd Linux raid autodetect
/dev/sdb3 297 950 5253255 5 Extended
/dev/sdb5 297 950 5253223+ fd Linux raid autodetect


○それではテストというか検証をスタートします。

1.一度電源を落とし、sdaにまっさらなHDDを接続します。
2.この状況ではどちらのHDDのMBRも空っぽなので当然ブートしません。
3.squeezeのインストールCDからブートして、Advanced optionを選びます。
4.次にRescue modeを選択します。
5.まるでインストールのような画面が続きますが、しばらくするとrootパーテションを選択する画面になります。
6.ここではAssemble RAID arrayを選択します。
7.一番上のAutomaticをスペースキーで選択し、次に進みます。
8.すると先ほどのrootパーティションを選ぶ画面に戻りますので/dev/md/2を選択します。
9.Excute a shell in /dev/md/2を選択します。
※もし、rootパーティションがext4でフォーマットされているとここでエラーになります。
※ext3はマウント出来るのは確認しましたが、他のファイルシステムは試していません。
10.# が表示されシェルが起動します。
ここでsdbにgrubをインストールするのですが、この状態では/bootは空っぽ(別のパーテションにある)なので、grubをインストールしても正常には起動しません。つまり、ここではgrub単体だけをインストールするということになります。
grub-install /dev/sdb

11.rebootで、再起動しすぐにBIOS設定画面に入りsdbを起動HDDとし、squeezeのインストールCDは抜きます。

12.BIOSの設定をsaveし再起動すると、sdbからブートしますが画面にgrub> と表示され止まります。
13.grub > ls でパーテションが見えます。
(md/0) (md/1) (md/2) (hd0) (hd0,msdos5) …等と表示されます。
14.ここから手動でブートします。
grub> set prefix=(md/0)/grub
grub> insmod (md/0)/grub/normal.mod
grub> norma
l

15.これで無事sdbから起動しますので、rootでログインしてgrubを再インストールします。
grub-install /dev/sdb
update-grub


16.sdaになっている新品HDDのパーティションを作成し、raidデバイスへ追加します。
mdadm -a /dev/md0 /dev/sda1
mdadm -a /dev/md1 /dev/sda2
mdadm -a /dev/md2 /dev/sda5


17.raidの再構成が完了したら、grub-install /dev/sda ; update-grub でsdbのMBRにgrubをインストールします。

18.BIOSの起動順を元に戻して、再起動します。
19.これで正常な状態となります。

photo:01


いい天気だね~ 汗ばむ陽気!



iPhoneからの投稿
debian squeezeのクリーンインストールとソフトウェアRAIDの作り方Tipsを書いてみます。

debianの場合、一度インストールするとよほどの事が無い限りクリーンインストールをやり直す事はありません。それはそれでとても便利なのですが、新規でインストールをしてみると色々気がつくことが多いので、今回は最近メジャーバージョンアップされたsqueezuを新規にインストールしてみました。

インストールする物理マシンですが、今回は検証用なのでASUSのminiITX規格のマザーボードITX-220を用意しました。インストール用のCDはここを参照してjigdoを使ってCDイメージを作成します。

さて、インストール開始です。今回はHDDを2台接続しソフトウェアRAID1(ミラーリング)を構成します。

○インストール時のTips:
squeezuの場合、VGAはフレームバッファを使いますので、もし古いMB(マザーボード)とかでフレームバッファが使えないとなにやら画面の上の方に小さな字が表示されインストールが止まってしまいます。
この場合は、一度リスタートしてメニュー画面よりhelpを選びF8を押してください。この画面で例として表示されるコマンドを入力するとフレームバッファを使わないモードでインストーラーが立ち上がります。
install vga=normal fb=false
※但し、このモードでインストールを始めると最初に選択する『言語』に日本語がありませんので、English等でインストールを進めることになりますが、キーボードやLocationは日本語や日本を選べるので心配はありません


インストラーが起動してインストールが始まってしまえば、あとはlennyとほとんど同じ手順で進みます。パーテションを決める場面でext4が使えるようになっているので、それを選んでみても良いかもしれません。

私が最小限のインストールで作成するパーテションは、/bootに256MB、swapに2GB程度、残りはロジカルボリューム(今回はテスト用なので10G)にして、そこにルートパーテションを作成します。

今回はソフトウェアRAIDを作成するので、fdisk -l した時の状況はこんな感じになります。
※テスト用なので250Gと500Gという変則的なHDD構成ですが、本番機なら同じ容量で違うメーカーのHDDを使うと良いですね。

Disk /dev/sda: 250.1 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c9877

Device Boot Start End Blocks Id System
/dev/sda1 * 1 34 273073+ fd Linux raid autodetect
/dev/sda2 35 557 4200997+ fd Linux raid autodetect
/dev/sda3 558 1863 10490445 5 Extended
/dev/sda5 558 1863 10490413+ fd Linux raid autodetect

Disk /dev/sdb: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x85e25474

Device Boot Start End Blocks Id System
/dev/sdb1 * 1 34 273073+ fd Linux raid autodetect
/dev/sdb2 35 557 4200997+ fd Linux raid autodetect
/dev/sdb3 558 1863 10490445 5 Extended
/dev/sdb5 558 1863 10490413+ fd Linux raid autodetect

※ポイントはパーテション1(/bootに割り付ける)のブートフラグをONにすることと、使用するパーテションのIDをfd(ソフトウェアRAID用)にすることです。

※インストール時に決定するtaskselは、デスクトップは外してsshサーバ(+メニューの一番下のbasic system)を指定しておきます。

---------------------
はい、インストールが正常に終了し新しくインストールされたHDDで無事ブートしたとします。

まずは cat /proc/mdstat を見て、RAIDの構築が正常に終わっているか確認します。

Personalities : [raid1]
md2 : active raid1 sdb5[3] sda5[2]
9763768 blocks super 1.2 [2/2] [UU]

md1 : active (auto-read-only) raid1 sdb2[3] sda2[2]
3905524 blocks super 1.2 [2/2] [UU]

md0 : active raid1 sdb1[3] sda1[2]
248820 blocks super 1.2 [2/2] [UU]

※こんな感じに表示されていれば、正常にRAIDは稼働しています。

■インストール時にsdaのMBR(マスターブートレコード)にはgrubが書かれていますが、sdbのMBRには書かれていません。このままですと、仮にsdaのHDDが故障したときにsdbからはブート出来なくなるので、必ず下記コマンドを実行します。
grub-install /dev/sdb
update-grub


■ついでにUSBメモリーに新規にsqueezeをインストールしておくと、これからの検証が楽になりますので、作成しましょう。
※HDDを全て外し(SATAケーブルを抜くだけ)、USBメモリーを差して同じようにインストールします。
※USBメモリーは2Gもあれば十分です。


---------------------
さて、これでソフトウェアRAIDのテストを行う準備が出来ました。

テスト1 HDD のスワップ

1-1.マシンの電源が落として、sdaとsdbを入れ替えます(SATAケーブルを差し替える)。
1-2.電源をON
1-3.立ち上がったらdmesgを確認する。

[ 1.584485] ata3.00: ATA-8: Hitachi HDT721025SLA380, STBOA3AA, max UDMA/133
[ 1.584491] ata3.00: 488397168 sectors, multi 16: LBA48 NCQ (depth 0/32)
[ 1.584722] ata3.01: ATA-8: WDC WD5000AAKX-001CA0, 15.01H15, max UDMA/133
[ 1.584727] ata3.01: 976773168 sectors, multi 16: LBA48 NCQ (depth 0/32)
[ 1.600479] ata3.00: configured for UDMA/133
[ 1.617241] ata3.01: configured for UDMA/133
[ 1.617397] scsi 2:0:0:0: Direct-Access ATA Hitachi HDT72102 STBO PQ: 0 ANSI: 5
[ 1.617887] scsi 2:0:1:0: Direct-Access ATA WDC WD5000AAKX-0 15.0 PQ: 0 ANSI: 5
[ 1.637083] sd 2:0:0:0: [sda] 488397168 512-byte logical blocks: (250 GB/232 GiB)
[ 1.637163] sd 2:0:0:0: [sda] Write Protect is off
[ 1.637168] sd 2:0:0:0: [sda] Mode Sense: 00 3a 00 00
[ 1.637202] sd 2:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 1.637412] sda:
[ 1.652494] sd 2:0:1:0: [sdb] 976773168 512-byte logical blocks: (500 GB/465 GiB)
[ 1.652571] sd 2:0:1:0: [sdb] Write Protect is off
[ 1.652576] sd 2:0:1:0: [sdb] Mode Sense: 00 3a 00 00
[ 1.652610] sd 2:0:1:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA

1-4.cat /proc/mdstat を見てRAIDが稼働していることを確認する。

1-5.シャットダウンして電源が落ちたらSATAケーブルを元に戻す。


テスト2 sdbがフェイルしたとして再度RAIDを組み直す←これは簡単なので割愛ww


テスト3 sdaがフェイルしたとして再度RAIDを組み直す。

3-1.一度電源を落とし、sdbのHDDからSATAケーブルを抜く(MBのSATA2に接続されている)。
3-2.USBメモリーを接続し本体の電源を入れ、BIOS設定画面を出す。
3-3.起動ドライブをUSBメモリーのストレージにする。
3-4.保存して再起動する。
3-5.起動したらUSBメモリーから起動しているか確認する。

#df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sdb5 4.9G 824M 3.8G 18% /
tmpfs 1009M 0 1009M 0% /lib/init/rw
udev 1005M 168K 1005M 1% /dev
tmpfs 1009M 0 1009M 0% /dev/shm
/dev/sdb1 236M 20M 204M 9% /boot

【注意】この状態では、USBメモリーはsdbとして認識され、HDDは一台だけ接続されているので常にsdaになる。
※つまり、仮に3-1でsdaのケーブルを抜いて、sdbだけを残したとしてもUSBメモリーから立ち上がった時にはsdaとして認識される。


3-6.sdaが故障して新品に取り替えるという状況を作るので、sdaをまっさらにする。
3-7.fdisk /dev/sda で全てのパーテションを削除する。
3-8.dd if=/dev/zero of=/dev/sda bs=512 count=1 でMBRをクリアする←これ重要!!
3-9.シャットダウンして電源を切る。

ここからはRAIDの復旧操作となります。

3-10.USBメモリーを外し、3-1で接続を外していたSATAケーブルを再接続する。
3-11.sdaは空っぽなのでsdbよりブートするが、万一ブートしない場合はBIOSのbootメニューよりsdbに設定してあるHDDをブートディスクとして指定する。
3-12.ブートしたら cat /proc/mdstat で片肺で立ち上がっていることを確認する。
Personalities : [raid1]
md2 : active raid1 sdb5[3]
9763768 blocks super 1.2 [2/1] [U_]

md1 : active (auto-read-only) raid1 sdb2[3]
3905524 blocks super 1.2 [2/1] [U_]

md0 : active raid1 sdb1[3]
248820 blocks super 1.2 [2/1] [U_]

3-13.fdisk /dev/sda で、必要なパーテションを作成する(ブートフラグを忘れずに!)
3-14.作成したパーテションをRAIDへ参加させる。
mdadam -a /dev/md0 /dev/sda1
mdadam -a /dev/md1 /dev/sda2
mdadam -a /dev/md2 /dev/sda5

3-15.RAIDの構築が終わったら、MBRを更新する。
grub-install /dev/sda
update-grub

3-16.システムを再起動する(もし、3-11で起動順を変えている場合は、必ずSATA1に接続されているHDDを起動ディスクとして指定する)。
3-17.システムが起動したら、HDDの起動順とかRAIDの状況などを確認する。


以上でRAIDの検証は終了です。
まとめとしては…

■SATAケーブルにはどれが1でどれが2か解るようにマーク(マジックで書く)しておく。
■全てSATAケーブルにHDDが接続されていればSATA1に接続されているHDDはsda、SATA2はsdbとなるが、1台しか接続されていない場合その接続されているHDDは常にsdaとなるので注意が必要。
■BIOSで起動順を変えた場合は、その後正常な状態に戻すのを忘れないように!
■新規インストールや、新品のHDDを接続してRAID1を構築した場合、MBRの作成を忘れずに!
■使用済みのHDDを使ってRAIDを再構築するときには、事前にパーテションとMBRをクリアしておく。
■USBメモリーに最小限のシステムをインストールしておくと、後で色々便利