mdraid(RAID1)のディスク交換をしてみたメモ

自宅サーバで使用しているHP MicroServerはオンボードのRAIDがFakeRAIDでLinux用のドライバもないし(多分)使う価値がないので、
mdraidを使っていたのですが今までディスク交換のオペレーションを行ったことがありませんでした。

そしてとある日 Seagate ST2000DX001(SSD Hybrid Drive)を購入したので酒を呑みながら自宅サーバのディスク交換をしていたら、
血中アルコールの影響で頭の中がこんがらがってしまって最終的にはレスキューディスクでシステムをぶっ壊してしまったので
戒め書としてこのPOSTを余生に残しておく。

以下の状態からブロックデバイスsdcを追加してsdbを切り離すオペレーションを実施しました。
効率の良い方法を知っている方ツッコミ歓迎です。教えてください。

ディスクの構成

/dev/sda (md0 raid1 active)
+- /dev/sda1 (Extended Volume)
+- /dev/sda2 (Linux RAID Volume)
+- /dev/sda5 (Linux SWAP Volume)

/dev/sdb (md0 raid1 active)
+- /dev/sdb1 (Extended Volume)
+- /dev/sdb2 (Linux RAID Volume)
+- /dev/sdb5 (Linux SWAP Volume)

/dev/sdc (md0 standby)
+- Blank

fdiskでsdcのパーテーションを切る

交換前のディスクと同じ感じにパーテーションを切る

# fdisk /dev/sdc

(snip)

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

コマンド (m でヘルプ): p

Disk /dev/sdc: 2000.4 GB, 2000398934016 bytes
ヘッド 255, セクタ 63, シリンダ 243201, 合計 3907029168 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
ディスク識別子: 0xcd6994eb

デバイス ブート 始点 終点 ブロック Id システム
/dev/sdc1 3899213824 3907028991 3907584 5 拡張領域
/dev/sdc2 2048 3899213823 1949605888 fd Linux raid 自動検出
/dev/sdc5 3899215872 3907028991 3906560 82 Linux スワップ / Solaris

パーティションテーブル項目がディスクの順序と一致しません

 

md0(RAID1)のアレイにデバイスを追加する

# mdadm –manage /dev/md0 –add /dev/sdc2
mdadm: added /dev/sdc2

スタンバイ中のデバイスにデータをSync(rebuild)

# mdadm –manage /dev/md0 –raid-devices=3

Syncが終わったか確認

# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdc2[2] sdb2[1] sda2[0]
1949474624 blocks super 1.2 [3/3] [UUU]

unused devices: <none>

新しいDiskにgrubをインストール

# grub-install /dev/sdc
Installation finished. No error reported.

sdb2をfailにする

# mdadm –manage /dev/md0 –fail /dev/sdb2
mdadm: set /dev/sdb2 faulty in /dev/md0

# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdc2[2] sdb2[1](F) sda2[0]
1949474624 blocks super 1.2 [3/2] [U_U]

unused devices: <none>

sdb2をアレイから外す

# mdadm –manage /dev/md0 –remove /dev/sdb2
mdadm: hot removed /dev/sdb2 from /dev/md0

# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdc2[2] sda2[0]
1949474624 blocks super 1.2 [3/2] [U_U]

unused devices: <none>

SWAP領域を作る(fdiskでパーテション切られているのを前提)

# mkswap /dev/sdc5
スワップ空間バージョン1を設定します、サイズ = 3906556 KiB
ラベルはありません, UUID=46784dd2-6ca5-44f5-b18f-157ee2197182

fstabを確認

必要に応じて書き換えを行う

 # vi /etc/fstab

# /etc/fstab: static file system information.
#
# Use ‘blkid’ to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc nodev,noexec,nosuid 0 0
# / was on /dev/md0 during installation
UUID=d54325b4-7b02-45d5-93f7-a8a049a50830 / ext4 errors=remount-ro 0 1
# swap was on /dev/sda5 during installation
UUID=4a3e84f9-5f51-4856-8306-08391cdc23bf none swap sw 0 0
# swap was on /dev/sdb5 during installation
UUID=46784dd2-6ca5-44f5-b18f-157ee2197182 none swap sw 0 0 <===今回の場合はsdb5のUUIDをsdc5のものに書き換える

swapon する

# free -m ; swapon -a ; free -m
total used free shared buffers cached
Mem: 7860 5466 2393 0 572 3704
-/+ buffers/cache: 1189 6670
Swap: 7629 0 7629
total used free shared buffers cached
Mem: 7860 5473 2386 0 572 3704
-/+ buffers/cache: 1195 6664
Swap: 11444 0 11444

古いディスクを外す

Hotswapじゃないけど気合で外す。
(SATAのコネクタはホットスワップ前提で作られているから電気的には大丈夫なはず。)

 

以上でひと通りの作業が完了のはずです。

今回の教訓 酒を呑みながらのオペレーションはやめよう。