系统启动流程:
POST 加电自检,载入一段程序完成基本及核心硬件的检测
--> BIOS 根据BIOS中设定的引导次序,查找对应设备上的MBR
--> 读取MBR的BootLoader,BootLoader中配置了要引导的操作系统的内核的位置
--> 读取内核,内核进行初始化,需要initrd 将Kernel和真正的根文件系统连接起来
--> 执行init,配置文件/etc/inittab。
(RHEL6上的init是被称为upstart的init程序,配置文件/etc/inittab,/etc/init/*.conf)
过程为 :POST—>BIOS—>MBR—>kernel-->initrd-->sbin/init
![](http://img1.51cto.com/attachment/201308/183232472.png)
一、准备工作
1、在/mnt下创建两个目录作为微系统的boot和真正的根文件系统:/mnt/boot、/mnt/sysroot
2、安装一块大小为20G的新硬盘,将其划分为两个分区/dev/sdb1 、 /dev/sdb2
3、格式化/dev/sdb1 、/dev/sdb2
mke2fs -t ext3 /dev/sdb1
mke2fs -t ext3 /dev/sdb2
mount /dev/sdb1 /mnt/boot mount /dev/sdb2 /mnt/sysroot
二、安装 grub至目标磁盘
grub-install --root-directory=/mnt /dev/sdb
vim /mnt/boot/grub/grub.conf
default=0 timeout=5 title My CentOS (2.6.32-431.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-431.11.2.el6.x86_64 ro root=/dev/sda2 quiet selinux=0 init=/bin/bash initrd /initramfs-2.6.32-431.11.2.el6.x86_64.img
三、复制内核和initrd文件
1、先创建目标主机的根文件系统:
mkdir -pv /mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,home,root}
2、复制内核文件:
cp /boot/vmlinuz-2.6.32-431.el6.x86_64 /mnt/boot/vmlinuz cp /boot/initramfs-2.6.32-431.el6.x86_64.img /mnt/boot/initramfs.img
四、提供根文件系统
1、接着去移植bash等至目标主机的根文件系统,编写复制命令脚本:
#!/bin/bash # target="/mnt/sysroot" lddfunc(){ cmdpath=`which $1` if which $1 &> /dev/null;then ldd `which $1`|grep -o -E "/[^[:space:]]{1,}" else echo "wrong input!" exit 6 fi } cpfunc(){ cmddir=`dirname $1` [ -d ${target}${cmddir} ] || mkdir -p ${target}${cmddir} [ -f ${target}${cmddir} ] || cp $1 ${target}${cmddir} } cplibfunc(){ for libpath in `ldd $1 |grep -o -E "/[^[:space:]]{1,}"`;do libdir=`dirname $libpath` [ -d ${target}${libdir} ] || mkdir -p ${target}${libdir} [ -f ${target}${libdir} ] || cp $libpath ${target}${libdir} done } main(){ while true;do read -p "plz input a command: " cmd if [ $cmd == "quit" ];then echo "quit!!!" exit 0 fi lddfunc $cmd if [ $? == 6 ];then continue else cpfunc $cmdpath cplibfunc $cmdpath fi done } main
2、使用上一步编写的脚本,将需要移植的命令及lib文件复制到新文件系统,例如ls、init、bash:
查看复制效果:
ls /mnt/sysroot/bin/ ls /mnt/sysroot/lib/
五、测试裁剪新系统:
1、复制磁盘文件原路径:[B-LUN05] CentOS_6.5-10.64.1.66/CentOS_6.5-10.64.1.66_1.vmdk,并移除第二块硬盘
2、创新新的虚拟机,使用原有磁盘文件:
3、启动新的虚拟机,grub界面:
init的bash已经可以使用~
四、修补新系统:
好了!系统到已经初步成型,不过我们还得修修,我们的init=/bin/bash,而Linux系统化初始化是调用/sbin/init的么,怎么调用了/bin/bash,没错,其实这里指向什么就调什么,那我们现在重新让他指向/sbin/init吧,首先在/mnt/sysroot下建立一个init文件,在里面添加如下字符:完成后记得给/sbin/init一个快 执行权限,然后把/mnt/boot/grub/grub.conf中的指向改成init=/sbin/init
1、为init进程提供配置文件(在/mnt/sysroot下)
/etc/inittab
id:3:initdefault: si::sysinit:/etc/rc.d/rc.sysinit
2、提供系统初始化脚本文件
etc/rc.d/rc.sysinit
#!/bin/bash # echo -e "Welcome to 33[34mPangYan 33[0m Linux" /bin/bash
为新编辑的rc.sysinit文件添加执行权限
chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit
稍微修改一下grub.conf的init指向/etc/rc.d/rc.sysinit ,重新登录后: