这是我前几天在马哥的带领下写的6个脚本,他们串起来就可以实现(一)篇一所有的功能,很方便吧微笑我们以后要通过不断倒腾这个小linux,来由浅入深的学习linux的系统构架和调优,最后实现编译内核,真正意义上打造自己的Linux,如果你有兴趣,那我一起学习吧微笑强烈建议自己动手写出这六个脚本,对脚本的学习帮助非常大。

这六个脚本其实就是(一)篇的几个步骤组合起来,它们连在一起就可以完全实现(一)篇的目的,六个脚本如下:

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

 

 
  
  1. #!/bin/bash   
  2. #the script:rmdisk3.sh   
  3.    
  4. function CH {                                                                             #题目要求的第二个功能   
  5.  read -p "WARMING!The next action will clean the DISK!COTINUE?(Y|y.other for quite)" CH   
  6.  if [ $CH == 'Y' -o $CH == 'y' ];then   
  7.     MOUNT=`mount | grep $1`                                                  #通过grep来抓取mount里的指定磁盘,看是否被挂载   
  8.     for i in $MOUNT;do                                                       #用for循环列表来一个一个卸载掉挂载的分区   
  9.        i=`mount | grep /dev/sdb | awk '{print $1}'`   
  10.        fuser -km $i                                                          #这个命令用于剔除分区里的活动用户保证卸载   
  11.        umount $i   
  12.        return 0   
  13.     done   
  14.   else   
  15.     exit   
  16.   fi   
  17. }   
  18. function FDISK {                                                 #格式化所选磁盘为3个分区   
  19.   dd if=/dev/zero of=$1 bs=512 count=1                           #dd命令比较特殊它是一种特殊的复制   /dev/zero是一个特殊设备用于吐出0,它们组合起来   
  20.   partprobe $1                                                   #意思就是给指定磁盘的第0个块输出512个字节0,等于破坏掉他的bootloader和分区信息   
  21. echo '                                                           #使用partprobe命令重读下分区,确保格式化顺利进行                                     
  22. n   
  23. p   
  24. 1   
  25.    
  26. +50M   
  27. n   
  28. p   
  29. 2   
  30.    
  31. +512M   
  32. n   
  33. p   
  34. 3   
  35.    
  36. +256M   
  37. t   
  38. 3   
  39. 82   
  40. w' | fdisk $1 &> /dev/null   
  41.   partprobe $1   
  42.   sleep 1                                                         #这里要睡1秒,等待系统将分区信息读入   
  43.   mke2fs -j ${1}1 &> /dev/null                                    #格式化三个分区   
  44.   mke2fs -j ${1}2 &> /dev/null   
  45.   mkswap ${1}3 &> /dev/null   
  46. }   
  47.    
  48. read -p "Chose a disk:" DISK                                      #下面的是提醒用户的信息     
  49. fdisk -l $DISK | grep ^/dev   
  50.    
  51. for I in `fdisk -l $DISK | grep ^/dev |awk '{print $1}'`;do   
  52.   mount | grep "$I"   
  53.     if [ $? -ne 0 ];then   
  54.       echo "The $I is not mounted."   
  55.     else   
  56.       echo "The $I is mounted"   
  57.     fi   
  58. done   
  59.    
  60. read -p "Countinue?(y|n)" P   
  61.   if [ $P == 'Y' -o $P == 'y' ];then   
  62.        CH $DISK   
  63.        FDISK $DISK   
  64.        echo -e "\033[32mThe action is suceess!\033[0m"       
  65.   else   
  66.        exit   
  67.   fi   

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

 

 

 
  
  1. #!/bin/bash   
  2. #   
  3.  source /root/LX/1               #这条命令用于连接第一个脚本,可以引用它的变量,路径一定要对,/root/LX/1是我的存放路径   
  4. #目录/mnt/boot是否存在,如果不存在,创建,并挂载上磁盘。如果存在,踢掉里面的活动人员,卸载挂载的磁盘,挂载上刚格式化的分区1   
  5. function MOUNT {   
  6.       [ -d $A ] &> /dev/null || mkdir $A && fuser $A | umount $A &> /dev/null | mount ${DISK}1 $A   
  7.       sleep 1   
  8.       [ -d $B ] &> /dev/null || mkdir $B && fuser $B | umount $B &> /dev/null | mount ${DISK}2 $B   
  9. }   
  10.    
  11. A=/mnt/boot   
  12. B=/mnt/sysroot   
  13. MOUNT $A $B   

三、写一个脚本,初始化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、执行此函数

 

 

 
  
  1. #!/bin/bash   
  2. #   
  3. source /root/LX/2   
  4.    
  5. function ROOTFS {   
  6. [ -d $B ] && ( mount | grep "$B" &> /dev/null ) || echo "ERRO!The $B is not mounted" | read -p "Countinue?(y|n)" INPUT   
  7.   if [ "$INPUT" == 'n' ];then                                       #这是一个判断函数,防止意外情况发生   
  8.       exit   
  9.   fi   
  10.    
  11.   cd $B                                              #创建目录   
  12.   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   
  13.   chmod 1777 tmp   
  14.    
  15. cat >> etc/inittab << EOF                             #创建题目要求的几个文件   
  16. id:3:initdefault:   
  17. si::sysinit:/etc/rc.d/rc.sysinit   
  18. EOF   
  19. cat >> etc/rc.d/rc.sysinit << EOF   
  20. #!/bin/bash   
  21. echo -e "\t\tWelcome to \033[31m;1mLittle\033[0m Linux..."   
  22.    
  23. mount -n -o remount,rw /   
  24. mount -n -a   
  25.    
  26. /bin/bash    
  27. EOF   
  28.    
  29.   chmod 755 etc/rc.d/rc.sysinit   
  30. cat >> etc/fstab << EOF   
  31. /dev/sda2               /                       ext3    defaults        0 0   
  32. /dev/sda1               /boot                   ext3    defaults        0 0   
  33. sysfs                   /sys                    sysfs   defaults        0 0   
  34. proc                    /proc                   proc    defaults        0 0   
  35. EOF   
  36. }   
  37.    
  38. ROOTFS $B   
五、写一个脚本,实现引导分区的设定: 
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文件,也可使用。