読者です 読者をやめる 読者になる 読者になる

GeekFactory

int128.hatenablog.com

LVMブートのinitramfsをスクラッチから作る

Linux

/を論理ボリューム上に置く場合は、カーネルが/をマウントする前に論理ボリュームを有効化してやる必要があります。そのため、initramfsに有効化処理を組み込んでカーネルに渡します。

genkernelを使うと自動でやってくれますが、スクラッチから作る方法もあります。

ディスク構成

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1               1         123      987966   83  Linux
/dev/hda2             124         246      987997+  82  Linux swap / Solaris
/dev/hda3             247        9729    76172197+  8e  Linux LVM

/dev/hda3上の論理ボリュームをルートファイルシステムにします。

  ACTIVE            '/dev/vg/0root' [5.00 GB] inherit

論理ボリュームは/mnt/gentooにマウントされています。

/dev/mapper/vg-0root on / type xfs (rw,ikeep,noquota)
/dev/hda1 on /boot type ext3 (rw,data=ordered)

createinitramfsスクリプトを使用します。このスクリプトは、実行ファイルを引数に渡すと依存ライブラリまでコピーしてくれます。

createinitramfs: 依存ライブラリを自動検出してinitramfsを生成するスクリプト

http://d.hatena.ne.jp/int128/20080622/1214066340

initramfsの作成とgrubの設定

busyboxと依存ライブラリを組み込みます。また、busyboxへのシンボリックリンクを配置します。

# cd /mnt/gentoo/root
# ./createinitramfs /bin/busybox
# cd initramfs/
# tar xf /usr/share/busybox/busybox-links.tar
# rm linuxrc

以下のスクリプトを作成し、initという名前で保存します。

#!/bin/sh

echo -e "\x1b[1;32m *\x1b[0m Mounting filesystems"
/bin/mount -t proc none /proc
/bin/mount -t sysfs none /sys
/bin/mount -t tmpfs none /dev

echo -e "\x1b[1;32m *\x1b[0m Starting mdev"
/sbin/mdev -s

echo -e "\x1b[1;32m *\x1b[0m Activating logical volumes"
/sbin/vgchange -ay

ROOT="`cat /proc/cmdline | sed -ne 's,.*root=\([^ ]*\).*,\1,p'`"
echo -e "\x1b[1;32m *\x1b[0m Determining root... $ROOT"
[ -b "$ROOT" ] || exec /bin/ash

echo -e "\x1b[1;32m *\x1b[0m Mounting target filesystem"
/bin/mount -o ro "$ROOT" /point

echo -e "\x1b[1;32m *\x1b[0m Switching environment"
/bin/umount /sys
/bin/umount /proc
/bin/umount /dev
exec /sbin/switch_root /point /sbin/init

echo -e "\x1b[1;31m *\x1b[0m Fallback to /bin/ash"
exec /bin/ash

必要なディレクトリを作成します。

# cd /mnt/gentoo/root/initramfs
# chmod +x init
# mkdir proc sys dev point

LVMのコマンドを組み込みます。

# cd /mnt/gentoo/root
# ./createinitramfs /sbin/vgchange

x86_64の場合はライブラリを/lib64に集約します。

# cd /mnt/gentoo/root/initramfs/lib
# mv * ../lib64
# cd ..
# rmdir lib
# ln -s lib64 lib

chrootできることを確認します。そしてinitramfsを再生成し、/bootにコピーします。

# cd /mnt/gentoo/root
# chroot initramfs /bin/sh
(chroot)# exit
# ./createinitramfs
# cp -a initramfs.gz /boot

/boot/grub/grub.confにinitrd行を追記します。

title Gentoo Linux
root (hd0,0)
kernel /vmlinuz root=/dev/vg/0root
initrd /initramfs.gz

再起動します。正常に/sbin/initが上がれば成功です。