linux ,叫你如何实现脚本自动创建自己专属迷你小linux(一)

一、写一个脚本,实现将一个硬盘中原有分区信息全部删除,并重新将其分为三个区:
1、提示用户指定要操作的磁盘;如果此硬盘中有新区,显示分区信息,并判断此中分区是否仍然处于挂载状态;
   如果是,则显示分区和对应的挂载点;否则,则说明分区没有挂载;
2、提示用户接下来操作会破坏硬盘上的所有数据,并询问用户是否继续进行;形如:Continue(y/N)?
   如果用户选择继续,则抹除此硬盘上的所有分区信息(如果是仍处理挂载状态的分区,则需要先卸载);否则退出;
3、将此硬盘分为三个主分区:
  第一个主分区,50M,ext3文件系统
  第二个主分区,512M,ext3文件系统
  第三个主分区,256M,swap文件系统

要求:上面第2和第3步要求用函数实现;函数执行结束要有返回值;
#============1======================================

#!/bin/bashA
#
    read -p "qing shu ru yige ci pan de mingzi : " CNAME

    if fdisk -l $CNAME | grep "^$CNAME" &> /dev/null ; then
       fdisk -l $CNAME | grep "^$CNAME"
       MLNAME=`fdisk -l $CNAME | grep "^$CNAME" | awk '{print $1}'`

       for I in $MLNAME ; do

          if mount | grep "$I" &> /dev/null ;then
             mount | grep "$I"
          else
             echo "$I is not mounted."
          fi

       done

    fi

    read -p "jie xia lai hui po huai yuan you de cao zuo ,shi fou ji xu:(y/N)?" UCHO


function CHOICE {
    case $UCHO in
      y|Y)

      dd if=/dev/zero of=$CNAME bs=512 count=1
      partprobe $CNAME
      sleep 1
echo '
p
n
p
1

+50M
n
p
2

+512M
n
p
3

+256M
t
3
82
w' | fdisk $CNAME &> /dev/null
        partprobe $CNAME
        sleep 1
      mke2fs -j ${CNAME}1
      mke2fs -j ${CNAME}2
      mkswap ${CNAME}3

         if fdisk -l | grep "^/dev" &> /dev/null ;then
            fdisk -l $CNAME
            echo "successful"
         else
            echo "fauls"
         fi

      ;;
      n|N)
      echo "Quiet>>>"
      return 1
      ;;
      *)
      return 2
      ;;
    esac

}

#CHOICE $UCHO


##########################################################################################
二、写一个脚本,实现将上述步骤中创建的分区挂载至某目录:
1、写一个函数,接受两个参数,完成以下功能:  
   参数1为/boot分区对应的设备,传递至函数之后将其挂载至/mnt/boot;
   参数2为/分区对应的设备,传递至函数之后将其挂载至/mnt/sysroot;
   说明:上述的挂载点/mnt/boot和/mnt/sysroot如果事先不存在,需要先创建;如果事先存在,且已经被某设备挂载使用,则需要先卸载原来挂载的设备;
2、将第一个脚本中实现的分区1和分区2传递给些函数执行;
#=============================2========================================


function GUAZAI {

      if [ -d /mnt/boot ];then
         echo "/mnt/boot is exsit." 
      else
         echo "/mnt/boot is not exsit and will build"
         mkdir /mnt/boot
      fi
      if [ -d /mnt/sysroot ];then
         echo "/mnt/sysroot is exsit." 
      else
         echo "/mnt/sysroot is not exsit and will build"
         mkdir /mnt/sysroot
      fi

       mount | grep "/mnt/boot" &> /dev/null
       N=$?
       if [ $N -eq 0 ];then
         umount /mnt/boot
         fuser -km $1
         mount $1 /mnt/boot
       else
         mount $1 /mnt/boot
       fi

      mount | grep "/mnt/boot" &> /dev/null
      M=$?
      if [ $M -eq 0 ];then
        echo "$1 mounted sucess."
      else
        echo "$1 mounted fail"
      fi

       mount | grep "/mnt/sysroot" &> /dev/null
       N=$?
       if [ $N -eq 0 ];then
         umount /mnt/sysroot
         fuser -km $2
         mount $2 /mnt/sysroot
       else
         mount $2 /mnt/sysroot
       fi

      mount | grep "/mnt/sysroot" &> /dev/null
      M=$?
      if [ $M -eq 0 ];then
        echo "$2 mounted sucess."
      else
        echo "$2 mounted fail"
      fi
}

#GUAZAI ${CNAME}1 ${CNAME}2


########################################################################################
三、写一个脚本,初始化rootfs
1、写一个函数,接受一个参数(参数为第二步骤中挂载的/mnt/sysroot),完成以下功能;
   1)判断/mnt/sysroot是否存在并且如果存在是否是挂载的一个独立的分区,如果是,则继续后面的操作;否则,则提示用户错误信息,而后询问是否继续;
   2)在/mnt/sysroot目录中创建如下子目录:
   boot, proc, sys, dev, home, root, etc/{rc.d,sysconfig,init.d}, bin, sbin, lib, usr/{bin,sbin,lib,include}, var/{log,run}, tmp, mnt, opt, media;
   3)将上面创建的tmp目录的权限设置为1777;
   4)创建文件/mnt/sysroot/etc/inittab,内容如下:
   id:3:initdefault:
   si::sysinit:/etc/rc.d/rc.sysinit
   5)创建文件/mnt/sysroot/etc/rc.d/rc.sysinit,内容如下:
   #!/bin/bash
   echo -e "\t\tWelcome to \033[31;1mLittle\033[0m Linux..."
  
   mount -n -o remount,rw /
   mount -n -a
  
   /bin/bash
  
   而后给此文件以执行权限;
   6)创建文件/mnt/sysroot/etc/fstab,内容如下:
   /dev/sda2        /            ext3    defaults        0 0
   /dev/sda1               /boot                   ext3    defaults        0 0
   sysfs                   /sys                    sysfs   defaults        0 0
   proc                    /proc                   proc    defaults        0 0
2、执行此函数
#==================================3=================================

function CHUSHIHUA {

        if [ -d $1 ];then
          echo "$1 is exist."
        else
          echo "$1 is not exist."
          mkdir $1
        fi

        mount | grep "$1" &> /dev/null
        P=$?
        if [ $P -eq 0 ];then
        cd $1
        mkdir -p boot proc sys dev home root etc/{rc.d,sysconfig,init.d} bin sbin lib usr/{bin,sbin,lib,include} var/{log,run} tmp mnt opt media
        chmod 1777 tmp

echo 'id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit' > /mnt/sysroot/etc/inittab

echo '#!/bin/bash
echo -e "\t\tWelcome to \033[31;1mLittle\033[0m Linux..."
   
mount -n -o remount,rw /
mount -n -a
   
/bin/bash' > /mnt/sysroot/etc/rc.d/rc.sysinit

         chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit

echo '/dev/sda2       /       ext3    defaults        0 0
/dev/sda1       /boot   ext3    defaults        0 0
sysfs           /sys    sysfs   defaults        0 0
proc            /proc   proc    defaults        0 0' > /mnt/sysroot/etc/fstab

             echo "build is sucess..."
          else
             echo "wrong..."
        fi
}

#CHUSHIHUA /mnt/sysroot


#######################################################################################
四、写一个脚本,实现二进制命令及对应库文件的拷贝:
1、写一个函数,接受两个参数(参数1为要复制的命令,参数2为复制命令对应的目标位置,如/mnt/sysroot),完成以下功能:
   1)判断参数1所对应的命令是否存在;如果存在:
     取得其目录路径,及命令对应的文件的名字;
     而后将此命令复制到参数2对应的路径下,跟此命令原来的目录路径相同的子目录中;
     比如,如果参数2为/mnt/sysroot,而命令路径为/bin/ls,则需要将ls复制到/mnt/sysroot/bin目录;如果命令路径为/usr/bin/man,则需要将man复制至/mnt/sysroot/usr/bin/中去;
   2)复制命令的同时,判定此命令所依赖的库文件,而后对每一个库文件做如下操作:
     取得其目录路径,及命令对应的文件的名字;
     而后将此命令复制到参数2对应的路径下,跟此命令原来的目录路径相同的子目录中;但如果此库文件已经复制过,则不需要再次复制;
2、执行此函数;
#==============================4=======================================


function KU {

        # read -p "qing shu ru ni yao kao bei de ming ling :" $1
        # read -p "qing shu ru mu biao di zhi :" $2

MLFFILE=`which $1 | grep -v "^alias" | awk '{print $1}' | sed 's@\(.*\)/[[:alpha:]]\{1,\}@\1@g'`
MLFILE=`which $1 | grep -v "^a" | awk '{print $1}'`

         which $1
         I=$?
         if [ $I -eq 0 ] ; then
           cp $MLFILE $2/$MLFFILE
         else
           echo "command not found"
         fi

LDDTAB=`ldd $MLFILE | grep -o "/.*" | awk '{print $1}'`
              for N in $LDDTAB ;do
                BSNAME=`basename $N`
                FLDDTAB=`echo "$N" | sed "s@\(.*\)/$BSNAME@\1@g"`
                  [ -d ${2}$FLDDTAB ] || mkdir -p ${2}$FLDDTAB
                  [ ! -e ${2}$BSNAME ] && cp -f $N ${2}$FLDDTAB
              done
          echo "cp ldd sucess..." 
}

        # read -p "qing shu ru ni yao kao bei de ming ling :" ML
        # read -p "qing shu ru mu biao di zhi :" DZ
        #KU $ML $DZ


#################################################################################
五、写一个脚本,实现引导分区的设定:
1、写一个函数,接受一个参数(参数为目标Linux的boot目录),实现以下功能:
  1)创建一个临时目录/tmp/litte.XX;
  2)将宿主机的/boot/initrd-`uname -r`.img文件展开至临时目录;
  3)修改展开而来的init文件:
    a)注释掉如下行:
    echo Scanning and configuring dmraid supported devices
    echo Scanning logical volumes
    lvm vgscan --ignorelockingfailure
    echo Activating logical volumes
    lvm vgchange -ay --ignorelockingfailure  vol0
    resume LABEL=SWAP-sda3
    b)将如下行中的设备修改为你所需要的:
    mkrootdev -t ext3 -o defaults,ro /dev/vol0/root
  4)将修改好的内容重新封闭为cpio的归档文件,并gzip压缩后存放至参数所指定的目录;
  5)复制/boot/vmlinuz-`uname -r`至参数所指定的目录,并重命令为vmlinuz;
2、执行此函数;
3、说明:此处的`uname -r`只是为了引用当前系统正在使用的内核和initrd文件,但这并非是必须。即如果你有其它内核和对应的initrd文件,也可使用。
#===========================5===================================


function YINDAO {
     cd $1
     TMPDIR=`mktemp -d /tmp/little.XX`
     cd $TMPDIR
     zcat /boot/initrd-`uname -r`.img | cpio -id
     sed -i 's/echo Scanning and configuring dmraid supported devices/#&/g' init
     sed -i 's/echo Scanning logical volumes/#&/g' init
     sed -i 's/lvm vgscan --ignorelockingfailure/#&/g' init
     sed -i 's/echo Activating logical volumes/#&/g' init
     sed -i 's/lvm vgchange -ay --ignorelockingfailure  vol0/#&/g' init
     sed -i 's/resume LABEL=SWAP-sda3/#&/g' init
     sed -i "s@\(mkrootdev.*\) /.*@\1 ${CNAME}2@g" init

     find . | cpio -H newc -o --quiet | gzip -9 > /mnt/boot/initrd.gz
     cp /boot/vmlinuz-`uname -r` /mnt/boot/vmlinuz
     echo "sucess....."
}


#YINDAO /mnt/boot


##################################################################################
六、写一个脚本,为目标主机所以磁盘设定grub:
1、写一个函数,接受四个参数(参数1为目标磁盘,参数2为引导分区的挂载点,
参数3为内核文件名,参数4为initrd文件名),完成以下功能:
 1)判断挂载点路径的基名是否为boot,如果不是,则停止执行,并提示用户修改;
 否则,则继续下面的操作;
 2)向目标磁盘安装grub;
 3)在参数3中的子目录grub下建立文件grub.conf;内容类似如下内容:
 default=0
 timeout=10
 title Little Linux
   root (hd0,0)
   kernel /$3
   initrd /$4
2、执行此函数  
#=============================6==================================


function SDGRUB {

         if [ "`basename $2`" == "boot" ]; then
            grub-install --root-directory=/mnt $1 2> /dev/null
            echo "build greb sucess..."
            cd $2/grub
echo 'default=0
timeout=10
title Little Linux
      root (hd0,0)
      kernel /vmlinuz ro root=/dev/sda2 quiet
      initrd /initrd.gz' > grub.conf
            echo "sucess..."
         else
            echo "create fail,please change the mount address"
         fi

}

#SDGRUB $CNAME /mnt/boot
# vmlinuz initrd.gz


 

#=================over=========================================
################################################################################
一下是将以上的各个功能一起实现,其中那个添加基本命令哪里你可以写一个for循环,将你以后要用到的全部写进去
这样也会为我们接下来实现网络功能起到很大的作用,接下来我们还会提供如何完善这个小的linux


#--------1--------------------------------------------------------
CHOICE $UCHO
#--------2--------------------------------------------------------
GUAZAI ${CNAME}1 ${CNAME}2
#--------3--------------------------------------------------------
CHUSHIHUA /mnt/sysroot
#--------4--------------------------------------------------------
#read -p "qing shu ru ni yao kao bei de ming ling :" ML
#read -p "qing shu ru mu biao di zhi :" DZ
#KU $ML $DZ
#--------5--------------------------------------------------------
YINDAO /mnt/boot
#--------6--------------------------------------------------------
SDGRUB $CNAME /mnt/boot
  # vmlinuz initrd.gz
#--------4--------------------------------------------------------

echo "ji ben ming ling zheng zai tian  jia ............."
DZ=/mnt/sysroot
    KU bash $DZ
    KU ls $DZ
    KU mount $DZ
    KU umount $DZ
    KU init $DZ
echo "yi wei ni tian jia bash,ls,cd,init,mount,umount."
read -p "qing shu ru ni xiang yao de ming ling huo zhe an q|Q tui chu :" ML

until [ $ML == 'q' -o  $ML == 'Q' ] ; do
   KU $ML $DZ
   read -p "DO YOU WANT CONTINUE :" ML
done

echo -e "\033[5;32mYou want The little linux create sucess!!!!!\033[0m"
#==============================================================


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值