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 に接続されている。

パーティションの状態

一覧表示して, 現在のパーティションをメモする. [2021-01] 現代では parted --list コマンド.

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

表示されないが, 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パッケージ) が優れている。2TB を超えるドライヴの場合は partedgdisk を使う。

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

# fdisk /dev/sdb

使うコマンド::

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

次のようにする。MD-RAID は, パーティションタイプを fd にする。

  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: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

[2021-01] Metadata にはヴァージョンがある。現在のデフォルトは the new version-1. 昔のは 0.90, ほかに ddf, imsm がある.

次のステップは, / (root) 以下全体を LVM on RAID にする場合のみ行う.

# 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を載せる

(このセクションは, 全体を LVM on RAID にする場合のみ)

/dev/md1 (/dev/sdb3) に LVMを載せる。MDデヴァイスを上から見るとパーティションに見えるので、単に pvcreate する。

# 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にする。

[2021-01] 現代は XFS が主流. mkfs.xfs /dev/md0 でよい。

# 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 によるファイル同期

ファイルを同期させるのに, rsync コマンドがしばしば使われる。バッドノウハウ「奥が深い症候群」の典型。

# rsync -avxHAXS --delete --progress /boot /mnt/new-raid

[2021-01] 新しい rsync だと -N の指定も必要。昔の man だと, -a は no -H,-A,-X になっとる. 現代のファイルシステムは crtime (作成日時) を持つ。伝統的な UNIX / POSIX では作成日時はなかった。

rsync のオプション (ごく一部)
--archive, -a -rlptgoD と同じ。Be aware that it does not include preserving ACLs (-A), xattrs (-X), atimes (-U), crtimes (-N), nor the finding and preserving of hardlinks (-H).
--delete 転送元で見つからないファイルは、転送 "先" でも同様に削除する
--one-file-system,
-x
ファイルシステムを跨がない. / (root) と /home が別のLVのときに必要。この場合は cp コマンドを使いにくい。
--progress
--sparse, -S
--verbose, -v

さらに、転送 "元" の末尾スラッシュの有無で挙動が変わる。転送先の末尾はどちらでもよい。上記例では、末尾スラッシュがないので、/boot そのものを .../new-raid/ 以下にコピーする, つまり .../new-raid/boot にコピーと読む。

一つのファイルシステムであれば、普通に cp コマンドのほうが易しい。ただ、cp も, ドットファイルのコピー漏れ、シンボリックリンクの取扱いなど、注意が必要。

/ (root) 以下もコピー。

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

GRUB2のインストール

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

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

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

次のようになる。<<UUID>> 部分は, /dev/sdb1 のUUID.

ARRAY /dev/md0 metadata=1.2 name=orange.fruits:0 UUID=<<UUID>>

[2021-01] Fedora 33 だとこれだけでよかった。再起動して /dev/md0 が自動認識されていればOK。後工程が簡単になる。

chroot

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

[2021-01] そうなんだけど、/boot 以外を LVM にする今どきの構成だと、データをコピーするわけではないので /dev/md0 が起動時に自動認識されることを確認したら、いきなり /etc/fstab を新しいほうに振り向ければよい。grub2-install するために chroot したりするのは同様。

新しい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 ファイルを編集する。

[2020.11] 注: 現代では, /boot/grub2/grub.cfg ファイルを直接編集することはない。/etc/grub.d 以下に設定ファイルを置く。

新しい 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

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 をインストール。

以上!

次のように2台の物理ドライブが active sync で表示されれば、正常に動いている。

# mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Sat Jan 23 23:28:36 2021
        Raid Level : raid1
        Array Size : 1046528 (1022.00 MiB 1071.64 MB)
     Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Tue Jan 26 23:46:01 2021
             State : clean 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : orange.fruits:0  (local to host orange.fruits)
              UUID : a495efca:c31db61a:f5787c23:577689fb
            Events : 204

    Number   Major   Minor   RaidDevice State
       2       8        1        0      active sync   /dev/sda1
       3       8       17        1      active sync   /dev/sdb1