shell腳本編程:Linux的自動化邏輯卷創建腳本

寫一個腳本,實現創建並管理LV:
說明:腳本執行時,可以顯示一個菜單給用戶,形如下面:
A Create an LV.
B Create an LV in an existing VG.
C Extend an LV.
D Reduce an LV.


如果用戶選擇了A項,則完成如下功能:
1)顯示當前系統上的所有磁盤及磁盤柱面的相關信息:共有柱面數及空閒柱面範圍;而後提示用戶選擇一個特定的磁盤,
  做爲創建LV的磁盤;
2)當用戶選定磁盤後將選定磁盤的分區信息顯示給用戶;
3)詢問用戶創建的VG名字、PV個數及每個PV的大小;而後新建分分區,分區大小對應於各PV大小;
4)而後創建相應的PV,並以之創建出VG;
5)創建LV:
a)提示用戶輸入LV的大小及名稱後創建LV;
b)格式化此LV;
6)提示用戶指定掛載點
  a)如果掛載點已經存在,且掛載有其它存儲設備,則提示用戶換一個,直到換到一個可用掛載點;
  b)否則,則使用此掛載點掛載此LV; 


如果用戶選擇了B項,則完成以下功能:
1)提示用戶輸入要創建的LV的名字,大小,和VG的名字;
2)創建此LV;(說明:在創建LV之前要測試VG中所餘的空間是否夠指定的LV使用;)


如果用戶選擇了C項,則完成以下功能:
1)提示用戶選定LV;而後顯示當前LV的大小,並提示用戶指定擴展後的大小;
2)擴展此LV至用戶指定的大小;(提示:擴展之前要測試當前VG中是否仍有足夠的磁盤空間可用;)


如果用戶選擇了D項,則完成以下功能:
1)提示用戶選定LV;而後顯示當前LV的大小,並提示用戶指定縮減後的大小;
2)縮減此LV至用戶指定的大小;(提示:縮減之前要測試當前縮減後的空間是否能容納當前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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章