Linuxで昔からあるのは mdadmを使った仕組みだけど、今回はせっかく LVMを導入するので RAIDもそちらに任せてみる。
ちなみに /bootは対応できないらしいので、こちらは mdadmで。
用意したのはインストールメディアは slackware64-current-install-dvd.iso(2021/3/15版)
UEFIでインストール DVDから起動。*1
GRUBが起動するので huge.s kernelを選択。
まずは 2台共同じ構成でパーティショニング。*2
parted /dev/sda
mkpart boot 1mib 500mib
set 1 boot on
mkpart root 501mib 100gib
set 2 lvm on
parted /dev/sdb
sdaと同じ
続いて LVMを構成。(swapに 4G、残りを /と /home/に)
# 物理ボリュームの作成
pvcreate /dev/sda2
# ボリュームグループの作成(myvg)
vgcreate myvg /dev/sda2
# myvg下に論理ボリュームの作成(swap領域 / 4G)
lvcreate -L 4G myvg -n swap
# myvg下に論理ボリュームの作成(root領域 / 100G)
lvcreate -L 100G myvg -n root
# myvg下に論理ボリュームの作成(home領域 / 残り全部)
lvcreate -l 100%free myvg -n home
# /のサイズを少し縮めておく(RAIDのメタデータ格納用)
lvreduce -v --size -1g myvg/root
lvreduce -v --size -1g myvg/home
2台目を LVMグループに追加
vgextend myvg /dev/sdb2
lvconvert -v --type raid1 --mirrors 1 myvg/root
lvconvert -v --type raid1 --mirrors 1 myvg/home
円滑にすすめるために仕込み。
mkfs.vfat /dev/sda1
mkswap /dev/myvg/swap
ここいらで Slackware自体のセットアップを。
/dev/myvg/swapをスワップに追加。
/dev/myvg/rootをインストールターゲットに。
/dev/myvg/homeを /home/にマウント。
/dev/sda1は自動的に /boot/efiにマウントされる。
パッケージは適当に。
UEFIから起動しているので liloでなく eliloのインストールを促されるので従う。
setup終了後、再起動しないでコンソールへ戻る。
再起動してしまったらもう一度インストールメディアで起動し、以下を実行して次へ。
mount /dev/myvg/root /mnt
mount /dev/sda1 /mnt/boot/efi
mount --rbind /dev /mnt/dev
mount -t proc none /mnt/proc
mount --rbind /sys /mnt/sys
補助スクリプトを使って mkinitrdのコマンドラインを作る。
この際、デフォルトだと dm_raidカーネルモジュールが組み込まれず、起動に失敗するのでちょろっと細工してから。
再起動すれば HDDにインストールされた Slackwareが立ち上がるのでもう一息。
chroot /mnt
$(/usr/share/mkinitrd/mkinitrd_command_generator.sh -k ${KERNEL_VER} -m dm_raid -r)
cp -a /boot/initrd.gz /boot/efi/EFI/Slackware/
exit
reboot
# bootミラーリング用の mdを作る
mdadm --create /dev/md0 --auto=yes --level=raid1 --raid-devices=2 missing /dev/sdb2
echo 'DEVICE partitions' >> /etc/mdadm.conf
mdadm --detail --scan >> /etc/mdadm.conf
echo 'MAILADDR root' >> /etc/mdadm.conf
# 出来た boot用 mdに bootをコピー
mkfs.vfat /dev/md0
mount /dev/md0 /mnt/hd/
cp -a /boot/efi/* /mnt/hd/
umount /mnt/hd
fstabも /dev/md0を /boot/efi/へマウントするように変更
sed -i -e 's/\/dev\/sda2/\/dev\/md0/'
元の bootを mdに追加
mdadm /dev/md0 --add /dev/sda2
FYI: Step by Step: LVM RAID logical volumeでソフトウェアRAID 1 (Fedora 33)
FUI: LVM RAID Logical Volumeのクラッシュからの復旧
2022/05/02追記
Slackwareのカーネルを更新後、うっかり initrdの更新を忘れたまま再起動してしまってからの後始末ログ。
md_raidが組み込まれていないので起動に失敗する羽目に。
古いインストールメディアから起動するも、カーネルのバージョンが異なるので作業できない。
なので、更新後のカーネルを含むインストールメディア(slackware64-current-install-dvd.iso等)から起動し、setup終了後の処理をしないで再起動してしまったときの処理をなぞる。
mount /dev/myvg/root /mnt
mount /dev/sda1 /mnt/boot/efi
mount --rbind /dev /mnt/dev
mount -t proc none /mnt/proc
mount --rbind /sys /mnt/sys
chroot /mnt
$(/usr/share/mkinitrd/mkinitrd_command_generator.sh -k ${KERNEL_VER} -m dm_raid -r)
cp -a /boot/initrd.gz /boot/efi/EFI/Slackware/
exit
reboot
通常は mkinitrd_command_generator.shで /boot/initrd.gzを作り、/boot/efi/EFI/Slackware/へコピーすればよし。
2022/05/18追記
mkinitrd_command_generator.shはデフォルトでは現在動作しているカーネルのバージョンを元にモジュールを探しに行くのでカーネルの更新直後は動作しているカーネルのバージョンと新たにインストールされたカーネルのバージョンが食い違い、モジュールが見つからない旨報告して initrdの作成に失敗してしまう。
なので、「-k」オプションで対象となるカーネルのバージョンを明示してやる必要がある。
毎回新たなカーネルのバージョンを手動で指定するのは馬鹿らしいのでこんな感じで。
KERNEL_VER=`ls /var/log/packages/kernel-source-* | sed -e 's/.*\([0-9]\+\.[0-9]\+\.[0-9]\+\).\+/\1/'`
$(/usr/share/mkinitrd/mkinitrd_command_generator.sh -k ${KERNEL_VER} -m dm_raid -r)