遷移與裁剪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

一、准備工作

1、在/mnt下創建兩個目錄作為微系統的boot和真正的根文件系統:/mnt/boot、/mnt/sysroot
2、安裝一塊大小為20G的新硬盤,將其划分為兩個分區/dev/sdb1 、 /dev/sdb2

image

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

image

二、安裝 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}

image

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:

image

查看復制效果:

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

image

五、測試裁剪新系統:

1、復制磁盤文件原路徑:[B-LUN05] CentOS_6.5-10.64.1.66/CentOS_6.5-10.64.1.66_1.vmdk,並移除第二塊硬盤

image

2、創新新的虛擬機,使用原有磁盤文件:

image

3、啟動新的虛擬機,grub界面:

image

init的bash已經可以使用~

image

四、修補新系統:

好了!系統到已經初步成型,不過我們還得修修,我們的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

image

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

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM