迁移与裁剪linux系统

系统启动流程:

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

迁移与裁剪linux系统

一、准备工作

1、在/mnt下创建两个目录作为微系统的boot和真正的根文件系统:/mnt/boot、/mnt/sysroot
2、安装一块大小为20G的新硬盘,将其划分为两个分区/dev/sdb1 、 /dev/sdb2

迁移与裁剪linux系统

3、格式化/dev/sdb1 、/dev/sdb2

mke2fs -t ext3 /dev/sdb1
mke2fs -t ext3 /dev/sdb2
4、挂载磁盘至/mnt/boot 、/mnt/sysroot
mount /dev/sdb1 /mnt/boot
mount /dev/sdb2 /mnt/sysroot

迁移与裁剪linux系统

二、安装 grub至目标磁盘

grub-install --root-directory=/mnt /dev/sdb
        为grub提供配置文件

     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}

迁移与裁剪linux系统

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:

迁移与裁剪linux系统

查看复制效果:

ls /mnt/sysroot/bin/
ls /mnt/sysroot/lib/

迁移与裁剪linux系统

五、测试裁剪新系统:

1、复制磁盘文件原路径:[B-LUN05] CentOS_6.5-10.64.1.66/CentOS_6.5-10.64.1.66_1.vmdk,并移除第二块硬盘

迁移与裁剪linux系统

2、创新新的虚拟机,使用原有磁盘文件:

迁移与裁剪linux系统

3、启动新的虚拟机,grub界面:

迁移与裁剪linux系统

init的bash已经可以使用~

迁移与裁剪linux系统

四、修补新系统:

好了!系统到已经初步成型,不过我们还得修修,我们的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

迁移与裁剪linux系统

稍微修改一下grub.conf的init指向/etc/rc.d/rc.sysinit ,重新登录后:

迁移与裁剪linux系统