Step by Step: シングルHDDをRAID 1に変換; LVM on RAID編 (Fedora 20)

(2014.11)

[[注意]] 私(堀川)の手元の環境ではできましたが、同じことをしても失敗するリスクがあります。データを失ったとしても,私は責任を負えません。事前に忘れずデータをバックアップしてください。

HDD 1台で, RAID構成ではなく, 正常にシステムが動作している。ここから、新しいHDD を1台だけ足して、2台のRAID 1構成にする。

次のページは, GRUB Legacy (GRUB 0.9x) 時代の内容。このページの内容を, 新しい環境にあった方法で, 実行できるようにする.

Fedora 20 Linux でやってみた。

できあがりの階層イメージは、こんな感じ。mdカーネルドライバが冗長性を確保する。その上の層は, md0/1を物理ディスクに見立てて設定する。

/boot 以外については, LVM でミラーリングするほうが柔軟性が高い。その方法についてはこちら; Step by Step: LVM RAID logical volumeでソフトウェアRAID 1 (Fedora 20)

事前状態

元のHDDは, /dev/sda に接続されている。

パーティションの状態

一覧表示して, 現在のパーティションをメモ.

# fdisk -l
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 1026047 512000 83 Linux
/dev/sda2 1026048 41943039 20458496 8e Linux LVM

/dev/sda1 の前に MBRがあり, GRUBがインストールされている。/dev/sda1 が /boot に mountされる。

/dev/sda2 上には, swap LV, root LV がある。

[[参考]] 2TB以上の場合は, GPTテーブルを使うので、様子が変わる。

Device Start End Size Type
/dev/sda1 2048 4095 1M BIOS boot partition
/dev/sda2 4096 1028095 500M EFI System
/dev/sda3 1028096 3907028991 1.8T Linux LVM

/dev/sda2 を /boot に mount する。

/dev/sda3 は、SWAP 2GiB, lv_home 1.77TiB, lv_root 50.00GiB

[[参考ここまで]]

RAIDアレイを作る

パーティションを切る

新しいHDD のパーティション(区画) を切る。新しいHDD は /dev/sdb.

fdiskcfdiskコマンドがあるが、cfdisk (util-linuxパッケージ) が優れている。

とはいえ、説明を節約するために、以下では fdisk を使う。やることは一緒。

# fdisk /dev/sdb

使うコマンド::

m コマンドの一覧
n 新しいパーティションを作る
t パーティションタイプの変更
a bootableフラグの切り替え
p パーティション表を表示
w パーティション表をディスクに書き込み、終了

次のようにする。

  Device    Boot Start   End       Blocks   Id  System
  /dev/sdb1 *       2048   1026047   512000 fd  Linux raid autodetect
  /dev/sdb2      1026048   5220351  2097152 82  Linux swap / Solaris
  /dev/sdb3      5220352  41943039 18361344 fd  Linux raid autodetect

意図としては、/dev/sdb1 は /bootにマウントし、/dev/sdb3 の上にLVMを載せる。

swapは、1ドライブ/パーティションだけで, 十分なサイズになるようにする。

次のページは, おすすめのパーティション構成、その大きさを示している。しかし、Fedoraインストーラのデフォルト設定は、まったくこの通りになっていない。???

RAIDデバイスを作る

mdadmパッケージのmdadmコマンドを使う。

1台目として "missing" を指定するのがミソ。

# mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
# mdadm --create /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb3

できたか確認。

# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sdb3[1]
      18344960 blocks super 1.2 [2/1] [_U]

md0 : active raid1 sdb1[1]
      511680 blocks super 1.2 [2/1] [_U]

unused devices: 

LVMを載せる

/dev/md1 (/dev/sdb3) は, LVMを載せる。

LVM LVは bootパーティションにできない。/dev/md0 のほうはこの手順はスキップ。

# pvcreate /dev/md1
  Physical volume "/dev/md1" successfully created
# vgcreate VolGroupArray /dev/md1

root LVだけ作る場合は、次のようにする。/home と / (root) を分けたいときは、適宜、lvcreateしてください。

# lvcreate -l +100%FREE VolGroupArray -n lvroot
  Logical volume "lvroot" created

できたか確認。

# lvdisplay

ファイルシステムを作る

それぞれ、ファイルシステムを載せる。bootもext4にする。

# mkfs.ext4 -L RAID-BOOT /dev/md0
mke2fs 1.42.8 (20-Jun-2013)
...

-Lオプション ... ボリュームラベル

# mkswap -L NEW-SWAP /dev/sdb2
# mkfs.ext4 -L RAID-ROOT /dev/VolGroupArray/lvroot

データをコピー

新しいドライブが整ったら、現在のドライブのデータをすべてコピー。元のドライブに複数のLVがあれば、それらもすべてコピーする。

まずは /boot.

# mkdir /mnt/new-raid/boot
# mount /dev/md0 /mnt/new-raid/boot
# rsync -avxHAXS --delete --progress /boot /mnt/new-raid

-x オプション ... ファイルシステムを跨がない. / (root) と /home が別のLVのときに必要。

/ (root) 以下もコピー。

# mount /dev/VolGroupArray/lvroot /mnt/new-raid
# rsync -avxHAXS --delete --progress / /mnt/new-raid/

GRUB2のインストール

新しいHDDだけでも起動できるように, 新しいHDD の MBRにGRUBをインストールする。

chroot

grub2-install は、/etc/fstab などのファイルを見て、設定をインストールする。元のHDDから起動しなくなっては困るので, 新しいHDDの /etc/fstab などを編集し, chroot して、動いている元のHDDと違う設定を読みこませなければならない。

新しいHDD の各区画を /mnt/new-raid 以下に mount し、

# cd /mnt/new-raid
# mount -t proc proc proc/
# mount -t sysfs sys sys/
# mount -o bind /dev dev/
# mount -t devpts pts dev/pts/
# chroot /mnt/new-raid

設定ファイル

新しいドライブの /boot/grub2/grub.cfg ファイルを編集する。

新しい menuentry を追加する。起動できるエントリを丸ごとコピー。

search 行の <<UUID>> は、/dev/md0 のUUID. linuxコマンド行の root= は, / にmountするLV. rhgb quiet は取っておく.

UUIDは blkid コマンドで確認できる。

一部を抜粋すると、次のようになる。

menuentry 'Fedora 20 RAID' {
	insmod part_msdos
        insmod ext2
        insmod mdraid1x   # これを追加
        set root='md/0'   # 変更
        search --no-floppy --fs-uuid --set=root <<UUID>>
        linux /vmlinuz-3.16.7-200.fc20.x86_64 root=/dev/mapper/fedora00-root ro rd.lvm.lv=fedora00/swap vconsole.font=latarcyrheb-sun16 rd.lvm.lv=fedora00/root  LANG=ja_JP.UTF-8
        initrd /initramfs-3.16.7-200.fc20.x86_64.img
}

/etc/fstab の /bootの行を変更。/etc/mtab は /proc/self/mounts を参照しているだけなので、変更不要。

/dev/md0     /boot  ext4  defaults 1 2

/etc/mdadm.conf ファイルで, MD RAID のマッピング先を固定する.

# mdadm --detail --scan >> /etc/mdadm.conf

パスを /dev/md0 に変更し、ホスト名などの部分を削除して、次のようにする。<<UUID>> は, /dev/sdb1 のUUID.

ARRAY /dev/md0 UUID=<<UUID>>

initramfs を更新

initramfs は, / をマウントするためのデバイスドライバのロード, などをおこないます。元のHDD と構成が変わるので, initramfs を作り直さなければなりません。

これをしないと, 起動中に root, swap が見つからず, Dracut Emergency Shell に落ちます。

Emergency Shell でのエラー内容は, /run/initramfs/rdsosreport.txt ファイル

dracut コマンドを使って書き込む。

# dracut /boot/initramfs-raid.img

次のコマンドで内容確認。

# lsinitrd /boot/initramfs-raid.img | less

dracut modules として, lvm と mdraid が入っていることを確認。/etc/mdadm.conf ファイルが含まれていることも見ておく。

/boot/grub2/grub.cfg を initramfs ファイルのファイル名に合わせて, 再度, 修正。

MBRにインストール

ようやく, GRUB2のインストールをおこなう。インストール先は, パーティション(区画)ではなく, ドライブを指定する。

# grub2-install --modules="mdraid1x ext2 part_msdos" --recheck /dev/sdb
Installation finished. No error reported.

sdbから起動

ここで一度, 電源を切り, sda を外して, sdbから起動できるか確認する。

grubで止まった場合は, 次のようにする。mdが見えていない場合は, grub2のmdraidモジュールが MBR GRUB に組み込まれていない。

grub> ls
(hd0) (hd0,msdos3) (hd0,msdos2) (hd0,msdos1) (fd0)

mdが見えているが, 起動できないときは, 次のようにして, set root= で boot区画を指して、手でvmlinuz, initramfs を指定して、起動する。

grub> set root=(md/0)
grub> linux /vmlinuz-3.16.7-200.fc20.x86_64 root=/dev/mapper/fedora00-root
grub> initrd /initramfs-3.16.7-200.fc20.x86_64.img
grub> boot

initramfs の途中で止まった時は, /etc/mdadm.conf を確認。mdが認識できたものの、mdadm.conf のUUIDにマッチしないときは, /dev/md/ホスト名:0 や /dev/md127 になってしまう。

起動して、ログインできたら、mount コマンド、cat /proc/mdstat で状況を確認。

swapon -s で, swapが有効になっているか確認。

元のHDD を RAIDに組み込む

[[注意]] この手順をおこなうと, 後戻りできません。ハードディスクの内容のコピー忘れは本当にないですか??

これまでの手順ができていれば、あとは難しくありません。

元のHDD のパーティションを fdiskコマンドで切り直す。/dev/sda2 には swap を載せる。

作りなおした元のHDDの /dev/sda1, /dev/sda3 を mdraidに加える。

# mdadm /dev/md0 --add /dev/sda1
# mdadm /dev/md1 --add /dev/sda3

cat /proc/mdstat で同期の進捗状況を確認。

元のHDDの MBR にも、再度 GRUB2 をインストール。

以上!