/を論理ボリューム上に置く場合は、カーネルが/をマウントする前に論理ボリュームを有効化してやる必要があります。そのため、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が上がれば成功です。