アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

SoftwareRAID + LVM + RAID1 移行(+ パーティション縮小)してみました

サーバーと言えば、冗長化は必須です。
自宅のXenサーバーもそろそろRAID化したくなってきました。
なにしろ、数年前に買ったMaxtor製250GBで、いくら高耐久モデルといっても1台では心配なので、余った別ディスクのパーティションを使用してRAID1構成にするこに。
もちろん、パーティション切って、RAID化して、データをコピーして、コピー元を消してRAIDの片割れとして追加すればRAID化出来ますが、せっかくLVMを使用しているので止めずにRAID1化してみました。

LVMについて
LVMとは大まかに言えばドライブの仮想化です。
複数のパーティションを一まとめの仮想ドライブにし、その中をそれぞれのパーティションに分配するイメージで、物理的は配置は気にしなくて良いのでリサイズなどが自由にできます。
細かいことはググってください。

★注意★
以下の内容を試す場合にはあくまでも自己責任でお願いします。
なお、クリティカルなサーバーなどで実験される際には、必ず同じ構成の壊れてもいい環境で十分にテストされることを推奨いたします。

今回の構成

/dev/hda8: 既存のパーティション
/dev/sdb2: 新規追加
以上2台で構成します。
なお、hda8には、PVが一つあり、その上にVG(lvm0)が一つだけ乗っています。

手順については、
1・sdb2をフォーマットし、PVを作成
2・lvm0にmd7を追加
3・hda8のエクステントををsdb2へ移動
4・hda8を切り離し
5・hda8をmd7に追加
と言う感じになります。

では、早速移行作業をしていきます。

1・sdb2をフォーマットし、PVを作成
fdiskにてsdb2を作成し、typeを"fd"(Linux RAID Autodetect)に設定したのち、以下コマンドを実行。


$ sudo mdadm --create /dev/md7 --level=1 --raid-devices=2 /dev/sdb2 missing

これで、sdb2の上にmd7が作成します。

2・lvm0にmd7を追加


$ sudo pvcreate /dev/md7     #PV作成
$ sudo vgextend lvm0 /dev/md7    #lvm0にmd7を追加


3・hda8のエクステントををsdb2へ移動
今回の肝"pvmove"を実行します。
これは、指定したPV(hda8)の物理エクステントを同じVG内の別のPV(md7)に移動します。
(完了までには多少時間が掛かります)


$ sudo pvmove /dev/hda8


4・hda8を切り離し
vgreduceにて、既存のVG(lvm0)からPV(hda8)を取り除きます。


$ sudo vgreduce lvm0 /dev/hda8


5・hda8をmd7に追加
1番と同じ手順で行けば良かったのですが、sdb2のサイズ指定を間違えてしまいました。


$ sudo fdisk -l /dev/sdb
(中略)
/dev/sdb2           60802       91201   244188000   fd  Linux raid autodetect
$ sudo fdisk -l /dev/hda
(中略)
/dev/hda8            3795       30515   214636401   8e  Linux LVM

pvmoveで移動し直して縮小すれば問題ないですが、せっかくなのでこのままリサイズにチャレンジします。

まずは、PVのサイズを小さくします。


$ sudo pvresize --setphysicalvolumesize 204G /dev/md7
$ sudo pvscan
  PV /dev/md7    VG lvm0            lvm2 [204.00 GB / 16.00 GB free]
  PV /dev/hda8                      lvm2 [204.69 GB]
  Total: 2 [408.69 GB] / in use: 1 [204.00 GB] / in no VG: 1 [204.69 GB]


次にmd7のサイズを変更します


$ sudo mdadm /dev/md7 --grow --size=214628400

$ cat /proc/mdstat
Personalities : [raid1]
md7 : active raid1 sdb2[0]
      214628400 blocks [2/1] [U_]

縮小出来たっぽい?
Raidのサイズは縮小されているようです。


次はsdb2のサイズ変更


$ sudo fdisk  /dev/sdb

The number of cylinders for this disk is set to 91201.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): p

Disk /dev/sdb: 750.1 GB, 750156374016 bytes
255 heads, 63 sectors/track, 91201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1       60801   488384001   fd  Linux raid autodetect
/dev/sdb2           60802       91201   244188000   fd  Linux raid autodetect

Command (m for help): d
Partition number (1-4): 2

Command (m for help): p

Disk /dev/sdb: 750.1 GB, 750156374016 bytes
255 heads, 63 sectors/track, 91201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1       60801   488384001   fd  Linux raid autodetect

Command (m for help): d
Partition number (1-4): 2

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (60802-91201, default 60802):
Using default value 60802
Last cylinder or +size or +sizeM or +sizeK (60802-91201, default 91201): 87521

Command (m for help): p

Disk /dev/sdb: 750.1 GB, 750156374016 bytes
255 heads, 63 sectors/track, 91201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1       60801   488384001   fd  Linux raid autodetect
/dev/sdb2           60802       87521   214628400   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.




後は、hda8をRAIDに追加するだけ?


$ sudo mdadm --manage /dev/md7 --add /dev/hda8
mdadm: added /dev/hda8

$ cat /proc/mdstat
Personalities : [raid1]
md7 : active raid1 hda8[2] sdb2[0]
      214628400 blocks [2/1] [U_]
      [>....................]  recovery =  3.4% (7494976/214628400) finish=118.2min speed=29184K/sec


できた!!
思ったよりハマりましたが何とか完了。
(ちなみに、サイズギリギリでやった場合にhda8が小さいといわれうまく行かなかったので、PVのサイズを小さくして再チャレンジしました)

これで再構成が完了すればRAID1運用出来ます。

LVMと言うより、パーティションのリサイズの方が多くなってしまいました・・・。

おまけ
fdisk後に再起動したくない場合は、


$ sudo partprobe

でOK