|
发表于 2010-1-12 00:08:27
|
显示全部楼层
不知道楼主解决了没有,前些天我也把根分区放到了LVM里面,是自己手动编译的内核,没有使用genkernel。下面发下我所做的步骤,希望对楼主解决问题有些用处。
1. 将initramfs放在/usr/src/initramfs
mkdir -pv /usr/src/initramfs/{boot,bin,dev,etc,lib,mnt,proc,root,sbin,sys}
2. 引导中需要lvm和busybox两个程序,lvm用来识别分区,busybox用来执行 /init脚本,并进行mount等操作
cp /sbin/lvm.static /usr/src/initramfs/sbin/lvm
cp /usr/bin/busybox.static /usr/src/initramfs/bin/busybox
3. 在 initramfs 中制作必须的几个 dev 文件
cp -a /dev/console /usr/src/initramfs/dev
cp -a /dev/null /usr/src/initramfs/dev
cp -a /dev/zero /usr/src/initramfs/dev
cp -a /dev/mem /usr/src/initramfs/dev
4. 制作自己的启动脚本
cat > /usr/src/initramfs/init <<EOF
#!/bin/busybox sh
# mdev is for dynamic devices
mini_udev() {
busybox echo /sbin/mdev > /proc/sys/kernel/hotplug
busybox mdev -s
}
# Mount the /proc and /sys filesystems.
busybox mount -t proc none /proc
busybox mount -t sysfs none /sys
# Start UDEV
mini_udev &> /dev/null
# LVM Load
lvm vgscan &> /dev/null
lvm vgchange -a y &> /dev/null
# Mount the root filesystem.
busybox mount -o ro /dev/mapper/linux-root /mnt/root || busybox echo "Mouting Fail"
# Clean up.
busybox umount /proc
busybox umount /sys
# Boot the real thing.
exec busybox switch_root -c /dev/console /mnt/root /sbin/init &> /dev/null
EOF
5. 最后将新制作的initramfs放到内存中。在内核编译中 Initramfs source file 中填入我们制作系统所在的位置 /usr/src/initramfs,编译并安装新内核
cd /usr/src/linux
make menuconfig
改进思路
busybox中包含很多功能,而启动脚本中只用了很少的几条命令,因此可以在编译busybox时候剔除掉我们不需要的功能。另外使用uclibc编译busybox应该能很大程序减小程序尺寸,并最终减小内核大小,加速启动过程。 |
|