トップ   編集 編集(GUI) 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

非RAIDのSoftRAIDへの移行

Last-modified: 2015-01-25 (日) 02:57:03 (1389d)
Top / 非RAIDのSoftRAIDへの移行

非RAIDのSoftRAIDへの移行

家の中枢となるサーバだが、実はRAID構成ではなくHDD1台構成という
トンデモ状態で初期設定をしてしまった。

そこで、なんとかデータはそのままにRAID構成が出来ないかと調べた所、
ある程度やり方がわかって、自分なりにアレンジしたのは↓の書き込み。

無論、下の情報は自己責任という事で。(CentOS5+OpenVZ)

Phase1-1.移行先領域の確保

RAID1として動かすので、同容量のHDDを準備し、同様のパーティションを区切る。

ただし、パーティションタイプは「fd」(Linux raid 自動検出)で行う。

  • マスターディスク
Disk /dev/hda: 250.0 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes
デバイス Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14         209     1574370   82  Linux swap / Solaris
/dev/hda3             210       30401   242517240   83  Linux
  • スレーブディスク
Disk /dev/hdc: 250.0 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes
デバイス Boot      Start         End      Blocks   Id  System
/dev/hdc1   *           1          13      104391   fd  Linux raid 自動検出
/dev/hdc2              14         209     1574370   82  Linux swap / Solaris
/dev/hdc3             210       30401   242517240   fd  Linux raid 自動検出
  • 後に使用するRAIDテスト起動時用のgrub設定を作成

自分の場合は下記の通り カーネルの名称が少し違うのはOpenVZのカーネルの為

title CentOS (2.6.18-92.1.1.el5.028stab057.2)
   root (hd0,0)
   kernel /vmlinuz-2.6.18-92.1.1.el5.028stab057.2 ro root=LABEL=/ vga=773
   initrd /initrd-2.6.18-92.1.1.el5.028stab057.2.img
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
title CentOS (2.6.18-92.1.1.el5.028stab057.2)
   root (hd0,0)
   kernel /vmlinuz-2.6.18-92.1.1.el5.028stab057.2 ro root=/dev/hda3 vga=773
   initrd /initrd-2.6.18-92.1.1.el5.028stab057.2.img
title CentOS (2.6.18-92.1.1.el5.028stab057.2) (hd1,0)md2
   root (hd1,0)
   kernel /vmlinuz-2.6.18-92.1.1.el5.028stab057.2 ro root=/dev/md2 vga=773
   initrd /initrd-2.6.18-92.1.1.el5.028stab057.2.img

Phase2.移行先領域の作成

  • RAID構成を作成する 自分の場合、md0「/boot」とmd2「/」とした
mdadm --create /dev/md0 --auto=yes --level=raid1 --raid-devices=2 missing /dev/hdc1
mdadm --create /dev/md2 --auto=yes --level=raid1 --raid-devices=2 missing /dev/hdc3
  • RAID構成の設定ファイルを作る
echo 'DEVICE /dev/hda0 /dev/hda2 /dev/hdc0 /dev/hdc2' > /etc/mdadm.conf
mdadm --detail --scan >> /etc/mdadm.conf
echo 'MAILADDR (メールアドレス)' >> /etc/mdadm.conf
cat /etc/mdadm.conf
  • hdcデバイスをフォーマットして設定

フォーマットはext3。tune2fsは起動時にfsckされるのがウザイのでキャンセルする為。

mkfs -t ext3 /dev/md0
mkswap /dev/hdc2 -L SWAP-hdc2
mkfs -t ext3 /dev/md2
tune2fs -c -1 /dev/md0
tune2fs -c -1 /dev/md2
tune2fs -i -1 /dev/md0
tune2fs -i -1 /dev/md2
  • パーティションをマウントして、rsyncでミラーリング

avzオプションはお約束。Hオプションは、ハードリンク使ってるのでそれを確保する為。

boot mnt は普通空。 sys proc dev は自動生成に任せるので移行しない。

mkdir /mnt/md0
mkdir /mnt/md2
mount /dev/md0 /mnt/md0
mount /dev/md2 /mnt/md2
rsync -avz -H --delete /boot/ /mnt/md0
mkdir /mnt/md2/boot
mkdir /mnt/md2/sys
mkdir /mnt/md2/proc
mkdir /mnt/md2/dev
mkdir /mnt/md2/mnt
rsync -avz -H --delete / /mnt/md2 --exclude=/boot --exclude=/sys --exclude=/proc --exclude=/dev --exclude=/mnt

ちなみに、mdデバイス作成後のmdstatの結果はこんな感じになるはず

cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 hdc3[1]
242517120 blocks [2/1] [_U]
md0 : active raid1 hdc1[1]
104320 blocks [2/1] [_U]
unused devices: <none>

Phase3.mdデバイスの起動の準備とテスト再起動

  • mdデバイスから起動するように、mdデバイス側にあるfstabを編集

vi /mnt/md2/etc/fstab

「/」・「/boot」パーティション

LABEL=/                 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
↓
/dev/md2                /                       ext3    defaults        1 1
/dev/md0                /boot                   ext3    defaults        1 2

「swap」パーティション(念の為、完了するまでswapは未使用にする)

LABEL=SWAP-hda2         swap                    swap    defaults        0 0
↓
#LABEL=SWAP-hda2         swap                    swap    defaults        0 0
  • initrdの作り直し

バックアップした後、fstab オプションでmdデバイス側のfstabを選択する。

cp -a /mnt/md0/initrd-`uname -r`.img /mnt/md0/initrd-`uname -r`.img.org
mkinitrd --fstab=/mnt/md2/etc/fstab /mnt/md0/initrd-`uname -r`.img `uname -r`
  • 再起動

Phase1で作成した(hd1,0)の方から起動させる

md: raid1 personality registered for level 1
md: Autodetecting RAID arrays.
md: autorun ...
md: considering hdc3 ...
md:  adding hdc3 ...
md: hdc1 has different UUID to hdc3
md: created md2
md: bind<hdc3>
md: running: <hdc3>
raid1: raid set md2 active with 1 out of 2 mirrors
md: considering hdc1 ...
md:  adding hdc1 ...
md: created md0
md: bind<hdc1>
md: running: <hdc1>
raid1: raid set md0 active with 1 out of 2 mirrors
md: ... autorun DONE.

こんなメッセージが見えてれば、mdデバイスからの起動に成功していると思われる。

(再起動時にkernel panicが出る場合)
おそらく↑のmdデバイスの起動メッセージが無い。
mkinitrdコマンドをやり忘れてるか、mkinitrdコマンド実行時に「/mnt/md2/etc/fstab」ではなく
編集前の「/etc/fstab」を読んでる可能性が高い。
ここで起動に失敗しても、(hd0,0)側で起動出来るので大丈夫。
(hd1,0)側で起動出来るようにしておかないと、後でとんでもない事が起こるので確実に済ませる事。

起動出来たら認識状態を確認

df -Th
Filesystem    Type  サイズ  使用  残り 使用% マウント位置
/dev/md2      ext3    228G   15G  202G   7% /
/dev/md0      ext3     99M   24M   71M  25% /boot
tmpfs        tmpfs    981M     0  981M   0% /dev/shm

Phase4.旧ディスクのmdデバイスへのadd

  • 旧DISKをmdに追加する為、fdiskでパーティションタイプを「fd」(Linux raid 自動検出)に変更
Disk /dev/hda: 250.0 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes
デバイス Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   fd  Linux raid 自動検出
/dev/hda2              14         209     1574370   82  Linux swap / Solaris
/dev/hda3             210       30401   242517240   fd  Linux raid 自動検出
コマンド (m でヘルプ): w
領域テーブルは交換されました!
ioctl() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。
警告: 領域テーブルの再読込みがエラー 16 で失敗しました: デバイスもしくはリソースがビジー状態です。
カーネルはまだ古いテーブルを使っています。
新しいテーブルは次回リブート時に使えるようになるでしょう。
ディスクを同期させます。
もしfdisk実行時に上の表示が出たなら、mdデバイスからの起動に起動に失敗した可能性が高い。
覚悟してLiveCDなどで状態を修復しよう(mdデバイス側にデータがあるのでそれを使って復旧)。
上のメッセージが出た後のmdadmのaddコマンドは、たぶん↓のようになる。
mdadm /dev/md2 --add /dev/hda3
mdadm: Cannot open /dev/hda3: Device or resource busy
  • RAIDにaddする
mdadm /dev/md0 --add /dev/hda1
mdadm: added /dev/hda1
mdadm /dev/md2 --add /dev/hda3
mdadm: added /dev/hda3

こうなってればOK

# mdadm -D /dev/md0
/dev/md0:
Version : 00.90.03
Creation Time : Sun Mar  8 02:02:40 2009
Raid Level : raid1
Array Size : 104320 (101.89 MiB 106.82 MB)
Used Dev Size : 104320 (101.89 MiB 106.82 MB)
Raid Devices : 2
Total Devices : 2
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Sun Mar  8 05:04:54 2009
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
UUID : fe0a7b42:dbaf7e0f:f59804df:8da018c6
Events : 0.64
Number   Major   Minor   RaidDevice State
0       3        1        0      active sync   /dev/hda1
1      22        1        1      active sync   /dev/hdc1
# mdadm -D /dev/md2
/dev/md2:
Version : 00.90.03
Creation Time : Sun Mar  8 02:02:42 2009
Raid Level : raid1
Array Size : 242517120 (231.28 GiB 248.34 GB)
Used Dev Size : 242517120 (231.28 GiB 248.34 GB)
Raid Devices : 2
Total Devices : 2
Preferred Minor : 2
Persistence : Superblock is persistent
Update Time : Sun Mar  8 05:27:08 2009
State : clean, degraded, recovering
Active Devices : 1
Working Devices : 2
Failed Devices : 0
Spare Devices : 1
Rebuild Status : 24% complete
UUID : b92c8265:249f4299:9b4c01cc:47a95f2f
Events : 0.2680
Number   Major   Minor   RaidDevice State
2       3        3        0      spare rebuilding   /dev/hda3
1      22        3        1      active sync   /dev/hdc3

spare rebuilding なのは、ビルド中だから。終わったら通常表示になってるのでOK。

Phase5.mdデバイスからの起動(実運営起動用)

後は、grub.confとfstabをちょこっといじるだけ。

title CentOS (2.6.18-92.1.1.el5.028stab057.2)
root (hd0,0)
   kernel /vmlinuz-2.6.18-92.1.1.el5.028stab057.2 ro root=/dev/hda3 vga=773
   initrd /initrd-2.6.18-92.1.1.el5.028stab057.2.img
title CentOS (2.6.18-92.1.1.el5.028stab057.2) (hd1,0)md2
   root (hd1,0)
   kernel /vmlinuz-2.6.18-92.1.1.el5.028stab057.2 ro root=/dev/md2 vga=773
   initrd /initrd-2.6.18-92.1.1.el5.028stab057.2.img
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

root=/dev/hda3 を root=/dev/md2 にした。

title CentOS (2.6.18-92.1.1.el5.028stab057.2)
   root (hd0,0)
   kernel /vmlinuz-2.6.18-92.1.1.el5.028stab057.2 ro root=/dev/md2 vga=773
   initrd /initrd-2.6.18-92.1.1.el5.028stab057.2.img
title CentOS (2.6.18-92.1.1.el5.028stab057.2) (hd1,0)md2
   root (hd1,0)
   kernel /vmlinuz-2.6.18-92.1.1.el5.028stab057.2 ro root=/dev/md2 vga=773
   initrd /initrd-2.6.18-92.1.1.el5.028stab057.2.img

fstabにswapを追加

#LABEL=SWAP-hda2         swap                    swap    defaults        0 0
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
/dev/hda2               swap                    swap    defaults        0 0
/dev/hdc2               swap                    swap    defaults        0 0

仕上げにgrubを確定設定する。

  • 1台目のHDDのMBRを更新する
# grub
grub> device (hd0) /dev/hda
grub> root (hd0,0)
Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  15 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
grub> quit
  • 2台目のHDDのMBRを更新する

(連続して行わず、一度quitで抜けてから2台目の設定を行う事)

# grub
grub> device (hd0) /dev/hdc
grub> root (hd0,0)
Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  15 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
grub> quit

これで再起動をして、問題無く起動出来ればOK。

やってみて

結構手間取ったけど何とか成功。作業をやり忘れてた事とかあって、

一時は全データ損失の危機に陥ったが、何とか復旧させて無事にRAID化に成功。

やはり、こういうクリティカルなトライアンドエラーは勉強になる。

参考サイト

CentOS で Soft RAID1 RAID5 を構築

非RAIDシステムのRAID化

RAID構成ハードディスク交換

【CentOS4】 通常のディスクからSoftware RAID1に変換する  ・・・のgoogleキャッシュ