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 -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
|