先了解一下开机启动流程

POST-MBR:bootloader-kernel(initrd)-(rootfs|/sbin/init(/etc/rc.d/rc.sysinit(bash))

具体可以描述为:
加电自检-逐一查看启动序列中的启动设备,找到MRB加载启动引导程序-加载内核-initrd(提供可以驱动根分区的驱动程序给内核)-启动init进程(读取/etc/inittab)-执

行/etc/rc.local-mingetty 登录

具体的启动流程还是这样的不能更改,我们能做的就是精简文件系统

首先我们在虚拟机上面加一块磁盘,制作好之后把这块磁盘移植到其他的linux主机上面让他启动就可以了。

我们新加一块磁盘/dev/sdb,划分两个分区一个100M(/dev/sdb1)用来挂载在boot目录上面,一个给他1G(/dev/sdb2),来装文件系统。

我们在/mnt目录下面建两个目录一个/mnt/boot,一个/mnt/sysroot

1.我们先在/mnt/boot上面装一个GRUB,把内核放进去
1)grub-install --root-directory=/mnt /dev/sdb 这里指定为boot的父目录这里为/mnt就可以了,这时候这个硬盘就可以做来引导系统了
cp /boot/vmlinuz-2.6.18-164.el5 /mnt/boot
cp /boot/initrd-2.6.18-164.el5.img /tmp/linux

2)我们把initrd-2.6.18-164.el5.img展开,里面修改一下,先来看一个这个文件的类型
file initrd-2.6.18-164.el5.img
initrd-2.6.18-164.el5.img: gzip compressed data
这里显示是一个gzip的压缩文件,那我们就用gzip来解压缩一下
gzip -d initrd-2.6.18-164.el5.img
gzip: initrd-2.6.18-164.el5.img: unknown suffix -- ignored

报错了,因为这个文件不是以.gz结尾的,那这好办,我们给他加一个.gz就好了嘛
mv initrd-2.6.18-164.el5.img initrd-2.6.18-164.el5.img.gz

再解压缩
gzip -d initrd-2.6.18-164.el5.img.gz
好了,这是一个cpio的归档文件,我们把它释放出来
cpio -id <initrd-2.6.18-164.el5.img
这时候原文件就没用了,删了
rm -rf initrd-2.6.18-164.el5.img

这里面init是一个脚本我们打开修改一些东西
把这个mkrootdev -t ext3 -o defaults,ro /dev/vol0/root
修改为:
mkrootdev -t ext3 -o defaults,ro /dev/sda2 这里是我们的根的位置,等下我们这块磁盘要挂载在一个新的linux虚拟机上面,到时候就是sda了,所以这里指定为sda2,
好了再把文件还原了
find .|cpio -H newc -o --quiet |gzip -9 >/mnt/boot/initrd.gz
3)然后我们创建一个grub的配置文件
vi grub.conf
default=0
timeout=10
title Little Linux
 root (hd0,0)
 kernel /vmlinuz-2.6.18-164.el5 ro root=/dev/sda2
 initrd /initrd.gz
2.在/mnt/sysroot下面创建我们的文件系统
1)mkdir boot proc sys dev home root etc/{rc.d,sysconfig/network,init.d} bin sbin lib usr/{bin,sbin,lib,include} var/{log,run} tmp mnt opt media -pv
作为系统我们当然需要一些命令了,这时候我们把响应的命令复制过来
2)which ls
cp /bin/ls /mnt/sysroot/bin
复制到对应的目录下面来
ldd /bin/ls
linux-gate.so.1 =>  (0x00f40000)
        librt.so.1 => /lib/librt.so.1 (0x00746000)
        libacl.so.1 => /lib/libacl.so.1 (0x00751000)
        libselinux.so.1 => /lib/libselinux.so.1 (0x00c4e000)
        libc.so.6 => /lib/libc.so.6 (0x005b6000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x0072d000)
        /lib/ld-linux.so.2 (0x00593000)
        libattr.so.1 => /lib/libattr.so.1 (0x00d03000)
        libdl.so.2 => /lib/libdl.so.2 (0x006fe000)
        libsepol.so.1 => /lib/libsepol.so.1 (0x00c68000)
ls这个命令的执行依赖这些个库文件,我们把库文件复制过来,第一个linux-gate是库的入口,实际不需要这个文件,一次拷贝下面的文件到/mnt/sysroot/lib目录下面
cp /lib/librt.so.1 /mnt/sysroot/lib ..... 下面的不再重复浪费版面了
接下来就是需要什么命令我们就复制什么命令过来就是了
cp /bin/bash /mnt/sysroot/bin
cp /bin/init /mnt/sysroot/bin
切换一下目录我们来试一下
chroot /mnt/sysroot 执行一下复制过来的命令试试?
3)我们在/mnt/sysroot/etc下面创建inittab文件
vi /mnt/sysroot/etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit 可以了执行最简单的功能就行了

vi /mnt/sysroot/etc/rc.d/rc.sysinit
echo -e "Welcome to \033[32m Little \033[0m Linux"
[ -f /etc/sysconfig/network ] && source /etc/sysconfig/network 这里主要是让我们创建的linux有个主机名
[ -z $HOSTNAME ] && HOSTNAME=localhost
echo $HOSENAME > /proc/sys/kernel/hostname
mount -n -o remount,rw /           这里是让我们创建的系统有读写权限,当然前提是要把mount命令复制进来
mount -n -a
/bin/bash
inittab和rc.sysinit是系统启动必备的脚本,我们这里一定要创建一下
vi /mnt/sysroot/etc/sysconfig/network
HOSTNAME=Little.Linux.org

vi /mnt/sysroot/etc/fstab
/dev/sda1 / ext3 defaults 0 0
/dev/sda2 /boot ext3 defaults 0 0
/proc  /proc proc defaults 0 0
/sysfs  /sys sysfs defaults 0 0

vi /mnt/sysroot/etc/mtab这个文件是空的就可以了,但是不能没有,要不我们的rc.sysinit文件中mount命令会出点问题

好了最后我们新建一个虚拟机,直接使用这块硬盘启动就可以了,试试看你得linux能启动吗?再执行几个命令看看!