用Shell脚本实现自动化完成属于自己的微型Linux!(一)

前两天我写了如何通过宿主Redhat系统通过精简和调用以及修改的方式,打造一个完全属于自己的微型LInux!

详见:http://blog.csdn.net/wei2856059/article/details/6654801

 

但是,很多人懒啊~~,所以我又写了写脚本,通过分步实现的方式。达到用一个脚本,完全的按照用户想要达到的目的安装一个属于自己的微型Linux。

那么下面我们来看如何实现:

 

----------------------------------------------------------------------------------------------------------------------

实现过程分析:

1.分区,按照用户所选的盘,将其格式化,分区

2.挂载,按照用户设定的的分区好的盘分别挂载在我们宿主机的一个目录上。方便对微型linux进行编辑。

3.对微型Linux进行写入各项配置信息

4.将微型Linux中我们需要用到的Bash等命令放进去

5.放入内核,和启动必须加载的配置文件

6.对用户的硬盘安装引导程序。

 

好的~过程已经分析OK了,下面我们动手开始写吧!!!

-----------------------------------------------------------------------------------------------------------------------

第一步:实现自动分区!!

我们将问题分开来看,于是成了这样:

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

OK,开始实现:

#!/bin/bash
#: Title: All_Mini_Linux.sh
#: Synopsis:
#: DateTime: 2011-08-04 00:36:35
#: Version: 0.1
#: Author: weiyan
#: Options: 
#
read -p "The target disk: " DSK        # 提示用户选择即将分区的硬盘

if fdisk -l $DSK | grep "^/dev" &> /dev/null ; then     #判断硬盘的分区状态。
  fdisk -l $DSK | grep "^/dev"
  PARTS=`fdisk -l $DSK | grep "^/dev" | awk '{print $1}'`

  for I in $PARTS; do                  # 使用循环的方式,将硬盘上每一个分区的状态和是否挂载,挂载在哪告诉用户。
    if mount | grep "$I" &> /dev/null; then
       mount | grep "$I"
    else
      echo "$I is not mounted."
    fi
  done
fi

SPART() {                # 制作名为SPART的函数,这个函数的功能就是提示用户准备分区,当允许分区则开始分区!
  read -p "Warning !!!!! Next you do it will wipe your disk !!!! Continue(y/N)?" CHOICE
  case $CHOICE in
  y|Y)
  for I in $PARTS; do
    if mount | grep "$I" &> /dev/null; then
      fuser -km $I
      umount $I
    fi
  done

  dd if=/dev/zero of=$DSK bs=512 count=1 &> /dev/null   # 将用户所选的硬盘的MBR直接擦除。让其成为空盘。

echo ' 
n   
p   
1

+50M
n
p
2

+512M
n
p
3

+256M
t
3
82
w' | fdisk $DSK &> /dev/null      # 将分区的信息传递给 fdisk,开始分区。

  partprobe $DSK
  sleep 1           # 分区之后要用sleep命令让系统“沉睡”1秒,这样可以让分区的信息真正的同步进硬盘,而不至于格式化出错。

  mke2fs -j ${DSK}1 &> /dev/null    # 分别格式化每一个分区并且格式化虚拟分区。
  mke2fs -j ${DSK}2 &> /dev/null
  mkswap ${DSK}3 &> /dev/null
  return 0
  ;;
  n|N)
    return 1
    ;;
  *)
    return 2
    ;;
esac
}
SPART              # 执行这个 SPART 函数。
[ $? -eq 0 ] && echo "The Disk wipe success !!!!!!!" || echo "Failure"    # 判断函数的返回值,如果是0,则提示分区成功。


这样一来,我们就有了一个完整的分好了区,并且格式化了的硬盘了。接下来呢?

将硬盘挂载!

---------------------------------------------------------------------------------------------------------------------

第二步:挂载!

那么将第二步好好的整理一下,发现它其实是不是实现了下面的功能呢?

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

那么,目标有了,我们来实现它!

function GUAZAI {                  # 创建一个名为 GUAZAI 的函数
        [ -d /mnt/boot ] ||  mkdir -p /mnt/boot    # 先判断我们要挂载的目录在不在,如果不在,则创建。
        umount /mnt/boot &> /dev/null              # 当有了目录之后,直接先卸载掉它,不管他之前有没有被挂载。(让我懒一下把-。-)
        mount $1 /mnt/boot                         # 挂载我们指定的参数1的目录,到挂载点。
        [ -d /mnt/sysroot ] || mkdir -p /mnt/boot   # 同上,判断第二个。
        umount /mnt/sysroot &> /dev/null
        mount $2 /mnt/sysroot
}

GUAZAI ${DSK}1 ${DSK}2     #  执行这个函数,并传递给它两个需要挂载的分区参数。

OK,挂载也挂载完了,接下来呢?

--------------------------------------------------------------------------------------------------------------------------

第三步:写入配置信息!

分析一下,我们要写入的配置信息:

首先要在我们的第二块分区上创建各种各样的文件夹,比如/bin /sbin /usr /root /home /tmp /etc 等等等等。

然后我们要创建/etc/inittab 这个文件

之后创建读取分区信息挂载信息的文件/etc/fstab

再然后呢?创建/etc/rc.d/rc.sysinit文件~

ok~分析得当!开始着手写入吧!

#这里我们使用函数,传递参数,参数只有$1,而$1则是我们的分区2所挂载的目录/mnt/sysroot
function ROOTFS {        # 使用函数实现各项功能,方便其他用户或者其他程序的调用,多写成函数,为以后着想哟!
        if [ -d $1 ];then
          if mount | grep "$1" &> /dev/null ; then      #  判断我们的分区2是否正确的挂载了
             cd $1
             mkdir {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} -pv &> /dev/null     #在这个目录里创建我们所需要用到的,各项文件夹。(麻雀虽小,五脏俱全嘛)
             chmod 1777 tmp/              

# create inittab
cat >>$1/etc/inittab<< EOF              #创建inittab 写入如下的信息
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
EOF

# create rc.sysinit                     #创建rc.sysinit 写入如下的信息
cat >>$1/etc/rc.d/rc.sysinit<< EOF
#!/bin/bash
echo -e "\t\tWelcome to \033[031;1mLittle\033[0m Linux..."

mount -n -o remount,rw /
mount -n -a

/bin/bash
EOF
                chmod +x etc/inittab               # 分别赋予他们执行的权限(你总不会想看到他们放在那却不能用吧-。-?)
                chmod +x etc/rc.d/rc.sysinit

# create fstab           # 创建fstab 将我们到时候要挂载的分区信息写入。这里注意,一定是“到时候”要挂载的。
cat >>$1/etc/fstab<< EOF
/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
EOF
          else
                read -p "Error,the $1 not mount ! Contiune(y|N)?" MOT   # 如果发现我们的分区2还没有挂上!就停止!
                case $MOT in                    # 不过这应该是不会没挂上的,否则我们上一步岂不是白做了!?
                y|Y)
                        ROOTFS /mnt/sysroot  ;;
                *)
                        echo "Exit......"
                        return 5
                        ;;
                esac
          fi
        fi
}

ROOTFS /mnt/sysroot   # 最后,执行这个函数,传递给他一个/mnt/sysroot这个参数~~OK~

好的!我们完成了前三步!总结一下:

 

我们先按照用户选择的硬盘,将其分区,分成3块,然后都将其格式化。

之后我们把需要用到的分区挂载到我们设定的目录上去!

然后我们将分区内写入各项配置信息。

 

接下来,看第二篇啦~完成后面三个步骤!!OK,加油~换个页面,我们继续!!

你可能感兴趣的:(学习心得,linux,脚本,shell,disk,redhat,ext)