Advertisement

shell脚本编程:Linux的自动化逻辑卷创建脚本

阅读量:

编写一个脚本以实现创建和管理虚拟化存储(LV)的功能。例如:
A. 创建一个LV。
B. 在已有的虚拟集群(VG)中创建LV。
C. 扩展现有的LV。
D. 缩小或减少现有LV的数量。

如果用户选择了A项,则完成如下功能:
1)显示当前系统中所有磁盘及其柱面的相关信息:包括共有柱面数量及空闲柱面范围;随后请求用户选择一个特定的磁盘作为创建LV的基础;
2)当用户选定该磁盘后将展示其详细的分区信息;
3)询问用户创建的新VG名称、PV数量以及每个PV的具体容量;随后自动划分相应的PV并建立对应的VG;
4)完成后将创建相应的PV并以这些PV为基础生成VG;
5)创建LV:首先请用户输入所需的LV容量与名称后进行创建;
6)完成格式化该LV的操作;
7)提示用户指定挂载点:如果已有的挂载点存在且连接有其他存储设备,则要求更换一个可用的挂载位置直至成功找到空闲位置;否则就使用当前选中的挂载点完成文件系统的挂载

如果用户选择了B项,则完成以下功能:
1)引导用户输入要创建的LV名称、容量和对应的VG名称;
2)生成此LV。(说明:在为该LV生成之前,请确保VG剩余空间足以容纳所需的空间。)

当用户选择选项C时,系统将执行以下操作:首先要求用户选定一个LV,并显示其当前容量;随后请求用户提供扩展后的容量。随后将该LV按用户的指定容量进行扩展。(注:在执行扩展操作前,请确认VG中剩余磁盘空间足以支持此次操作。)

如果用户选择了D项,则执行以下操作:

  1. 引导用户选择一个 LV,并告知当前 LV 的空间占用情况。
  2. 将其容量压缩至用户的设定值。
    (注:在进行压缩操作前,请确保目标空间能够容纳当前 LV 的全部数据。)
复制代码
 #!/bin/bash

    
 #: Title:lvm3.sh 
    
 #: Synopsis: 
    
 #: Date:2011-08-01 20:48:38
    
 #: Version: 1.0
    
 #: Author: Dean 
    
 #: Options:
    
  
    
  
    
 function A {
    
 #DISK INFORMATION          要求用户只能选择一个空硬盘进行操作
    
   D=`fdisk -l | grep -v Extended | grep Di | awk '{print $2}' | cut -d: -f1`                //截取出所有的DISK名字
    
 for I in $D;do                                                                              //用for循环打印出每一个DISK的柱面信息
    
   C=`fdisk -l $I | grep -v Extended |  head -3 | tail -1 | awk '{print $5}'`                //截取出总柱面信息 
    
   CN=`fdisk -l $I | grep -v Extended | tail -1 | awk '{print $3}' `                         //截取出最后柱面,并排除extend分区
    
     if [ $CN == 'Start' ];then                                                              //排除新硬盘没有分区的情况
    
    let CN=0
    
    echo "DISK:$I Total:$C Free:$[$C-$CN]"
    
     else
    
    echo "DISK:$I Total:$C Free:$[$C-$CN]"
    
     fi
    
 done
    
  
    
  
    
 #USER INPUT      
    
   read -p "Please chose a free disk for creating LV:" DISK
    
   fdisk -l $DISK
    
   read -p "Input the VG's name;" VG
    
   read -p "The number of PV;" NPV
    
  
    
  
    
 #FDISK PV  用for循环实现创建用户所要求的PV,精确到每一个
    
 for (( i=1;i<=$NPV;i++ ));do
    
   read -p "The size of $i PV:" SPV
    
 fdisk /dev/sda << End
    
 n
    
 p
    
  
    
  
    
 +$SPV                      
    
 t
    
 $i
    
 8e
    
 w 
    
 End
    
 done
    
  
    
  
    
   partprobe $DISK
    
 #PV $ VG CREATE                 在刚创建的PV基础上创建VG
    
   DPV=`fdisk -l /dev/sda | tail -$NPV | awk '{print $1}'`
    
 for I in $DPV ;do
    
   pvcreate $I
    
 done
    
   DPV=`echo $DPV`
    
   vgcreate $VG $DPV
    
  
    
  
    
 #LV CREATE                      询问用户创建的LV的名字,和vg,创建出LV
    
   read -p "Input the name of LV:" LV
    
   read -p "Input the size of LV;" SLV
    
   lvcreate -L $SLV -n $LV $VG
    
   mke2fs -r /dev/$LV
    
  
    
  
    
 #MOUNT              询问用户挂载点,并且直到这个挂载点没有被占用,才挂载上LV
    
   read -p "Input the mount dir:" DIR
    
   mount | grep "DIR"
    
   TEST=$?
    
 until [ $TEST -eq 0 ] ;do
    
     echo "The dir is exist,try another!"
    
     read -p "Input the mount dir:" DIR
    
     mount | grep "DIR"
    
     TEST=$?
    
 done
    
   mount /dev/$VG/$LV
    
  
    
  
    
 }
    
  
    
  
    
 function B {
    
  
    
 ######################创建LV
    
 until [ $TEST -eq 0 ];do
    
   read -p "Input the the name of LV:" LV
    
   read -p "Input the size of LV:" SLV
    
   vgdisplay
    
   read -p "Input the VG's name:" VG
    
   lvcreate /dev/$VG/$LV
    
   TEST=$?
    
 done
    
 }
    
  
    
 #####################扩展LV,如果容量不够扩展,重新选择大小进行扩展,直到可以扩展
    
 function C {
    
 until [ $TEST -eq 0 ];do                                       
    
   read -p "Which LV you want extend:" LV          
    
   lvdisplay $LV
    
   read -p "Input the VG;s name:" VG
    
   read -p "The size of extend:" SEN
    
   lvextend -L $SEN /dev/$VG/$LV
    
   TEST=$?
    
   resize -p /dev/$VG/$LV
    
 done
    
 }
    
  
    
 #######################缩小LV,如果容量限制不能缩小,重新选择大小,直到可以缩小,并且缩小前自检
    
 function D {
    
 until [ $TEST -eq 0 ];do
    
   read -p "Which LV you want reduce:" LV
    
   lvdisplay $LV
    
   read -p "Input the VG's name:" VG
    
   read -p "The size of reduce to:" SRE
    
   umount /dev/$VG/$LV
    
   e2fsck -f /dev/$VG/$LV
    
   resize2fs /dev/$VG/$LV $SRE
    
   TEST=$?
    
   lvreduce -L $SRE /dev/$VG/$LV
    
 done
    
 }
    
  
    
 ### 程序选择界面
    
 echo "------------------------------------------"
    
 echo '-----------Program for LVM----------------'
    
 echo "A Create an LV.
    
 B Create an LV in an existing VG.
    
 C Extend an LV.
    
 D Reduce an LV."
    
 read -p "Your choise,others for quite:" CH
    
 case $CH in
    
 'A')
    
      A
    
     ;;
    
 'B')
    
      B
    
     ;;
    
 'C')
    
      C
    
     ;;
    
 'D')
    
      D
    
     ;;
    
   *)
    
     exit
    
     ;;
    
 esac

全部评论 (0)

还没有任何评论哟~