閉じる

Slackwareを UEFI+LVM(+RAID1)な環境にインストールしたメモ

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

raid1に変換。*3 *4

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)

*1 この書き方は正しいのか?

*2 とりあえずテスト環境では LVM用は 100gibで。

*3 コマンド自体はすぐに終了するけど、裏で同期をとっているのでそれなりの時間がかかる。

*4 lvsコマンドで進捗を確認可能。

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)