zoukankan      html  css  js  c++  java
  • 迁移与裁剪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 33[34mPangYan33[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

  • 相关阅读:
    反射 Reflect Modifier 修饰符工具类
    【泛型】Generic 参数化类型 类型转换
    泛型 Generic 类型擦除引起的问题及解决方法
    注解 Annotation 简介 总结 MD
    反射 Reflect Class 基础 API MD
    【Type】类型 ParameterizedType
    Java中浮点类型的精度问题 double float
    jQuery之$.ajax()方法详解及实例
    pace.js – 加载进度条插件
    在线代码编辑、保存与运行网址推荐
  • 原文地址:https://www.cnblogs.com/musenl/p/5509455.html
Copyright © 2011-2022 走看看