一,什么是系统裁剪?

   个人理解是在一个完整的Linux系统功能上,进行一些功能的删除操作。适合自己的需求,够用即可!

二,实验环境介绍

       vmware workstatin 10,CentOS6.5,64bit

三,具体操作步骤

   1,用VMWare10,安装CentOS6.5,64bit系统。(不了解可以google一下,^_^)

   2,安装完系统后,给系统增加一块20G的硬盘,新建2个硬盘分区,并进进行格式化,如下图

基于CentOS6.5 64bit 系统裁剪制作属于自己的系统(初级小实验)_第1张图片

   3,在根分区,新建目录mylinux,及子目录boot,sysroot,如下图命令:

wKioL1Mb1a3AjFAkAAEWvu0fA20200.jpg

   4,分别挂载硬盘分区,/dev/sdc1,/dev/sdc2,至目录/mylinux/boot,/mylinux/sysroot,如下图

wKiom1Mb1sTjR3LzAADD_ufxvvk960.jpg

   5,安装grub引导程序,如下图

基于CentOS6.5 64bit 系统裁剪制作属于自己的系统(初级小实验)_第2张图片

   6,复制内核文件及初始化文件系统文件到目录/mylinux/boot,如下图:

wKioL1Mb2DvTdyP0AAFvnYC3pVA063.jpg

   7,在目录/mylinux/boot/grub中创建文件grub.conf,并输入如下内容,设置系统的引导路径和启动软件等信息:

基于CentOS6.5 64bit 系统裁剪制作属于自己的系统(初级小实验)_第3张图片

   8,复制常用的命令,引导系统时使用,这里要用一个shell脚本,名称为:cmdCopy.sh,目的是:当你需要复制命令时,相对应的命令的库文件也会复制到相应的库文件目录中,脚本内容如下:

#!/bin/bash
#
#定义目标目录
target=/mylinux/sysroot
#判断是否有此输入的命令,查看此命令的绝对路径,不包含昵称所定义的同名命令
clearCmd() {
  if which $cmd &> /dev/null; then
        cmdPath=`which --skip-alias $cmd`
  else
        echo "No such command"
        return 5
  fi
}
#复制输入的命令到目标目录
cmdCopy() {
        cmdDir=`dirname $1`
        [ -d ${target}${cmdDir} ] || mkdir -p ${target}${cmdDir}
        [ -f ${target}${1} ] || cp $1 ${target}${cmdDir}
}
#复制输入的命令所依赖的库文件到目标目录
libCopy() {
        for lib in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`; do
                libDir=`dirname $lib`
                [ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}
                [ -f ${target}${lib} ] || cp $lib ${target}${libDir}
        done
}
#判断输入命令的有效性
while true; do
  read -p "Enter a command: " cmd
  if [ "$cmd" == 'quit' ] ;then
        echo "quit"
        exit 0
  fi
  clearCmd $cmd
  [ $? -eq 5 ] && continue
#复制命令及对应的库文件到目标目录
  cmdCopy $cmdPath
  libCopy $cmdPath
done

注:增加此文件的可执行权限,chmow +x cmdCopy.sh

   9,运行脚本./cmdCopy.sh 输入命令,ls,pwd,ping,ifconfig,mount,umount等,输入quit退出,如图:

基于CentOS6.5 64bit 系统裁剪制作属于自己的系统(初级小实验)_第4张图片

   注:命令复制完成后,记得使用命令:sync同步内存数据到硬盘

   至此一个基于HOST宿主机的简易Linux系统环境启动硬盘已经完成了一大步,接下来新建一虚拟机,硬盘使用刚才新建的。

四,新建一虚拟机,选择刚才新建的硬盘。(过程不再详细描述)如下图所示:

注:新建虚拟机的系统类型要与宿主机的平台一致,引用新建的硬盘时,一定要保证HOST宿主机处于挂起的状态,为了避免同时读一块硬盘,出现错误,数据不一致的情况。

基于CentOS6.5 64bit 系统裁剪制作属于自己的系统(初级小实验)_第5张图片

启动新虚拟机,如下图所示:

基于CentOS6.5 64bit 系统裁剪制作属于自己的系统(初级小实验)_第6张图片

到此一个微小的Linux系统制作已经成功,系统功能是极其的简单,其中所具有的功能,也就是我们所复制的一些系统命令,比如,ls,pwd,等,但是ifconfig命令能使用么?不能,因为系统不具有识别网卡的能力且网卡的驱动也没有,接下来进行网卡驱动模块的加载与系统自动配置IP地址的功能

五,对裁减的小系统增加网卡驱动模块与IP

   顺着这个思路,我们要查看一个宿主机HOST中网卡信息及配置

   1,命令lsmod查找系统中加载的所有模块,找到e1000这个模块,如下图所示:

基于CentOS6.5 64bit 系统裁剪制作属于自己的系统(初级小实验)_第7张图片

   2,接着再看一下此模块所使用的模块文件及文件位置,使用命令:modinfo e1000,如下图所示:

基于CentOS6.5 64bit 系统裁剪制作属于自己的系统(初级小实验)_第8张图片

   3,复制上图所示文件至

/mylinux/sysroot/lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/net/e1000/e1000.ko

wKiom1McX0zzPX4kAAE3dF2Qb-U171.jpg

   4,接着修改grub.conf文件,让Linux系统内核在启动时,自动加载初始化脚本,进行裁剪系统的目录(伪文件系统,如:proc,sys)挂载,及系统IP的自动设置等工作

   修改grub.conf配置文件中init参数为:boot=/sbin/init,发下图所示:

基于CentOS6.5 64bit 系统裁剪制作属于自己的系统(初级小实验)_第9张图片

   在宿主机目录/mylinux/sysroot/sbin中,新建init文件,并给予可执行权限,文件内容如下图:

   基于CentOS6.5 64bit 系统裁剪制作属于自己的系统(初级小实验)_第10张图片

   至此一个超级简单的Linux系统已经制作成功,可以进行简单的ping命令,设置主机IP等

六,后续

   虽然看似简单的一个系统裁剪过程,里面却涉及到了许许多多系统启动过程中所涉及的内容,当然肯定也是似是而非(对于大多数计算机专业的学生),不要认为有些事儿很简单,自己动手做一下才知道,(后来连续做了不下十遍,这也是严格按照老师的思路走的),记住当你没有把握的时候,你只有跟着老师走!后续的内容是自己查找资料自己做个LFS,加油!