系統啟動流程:
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

一、准備工作
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 \033[34mPangYan\033[0m Linux" /bin/bash
為新編輯的rc.sysinit文件添加執行權限
chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit
稍微修改一下grub.conf的init指向/etc/rc.d/rc.sysinit ,重新登錄后: