寫一個指令碼,實現建立並管理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]" fidone#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:" SPVfdisk /dev/sda << Endnp+$SPV t$i8ew Enddone partprobe $DISK#PV $ VG CREATE 在剛建立的PV基礎上建立VG DPV=`fdisk -l /dev/sda | tail -$NPV | awk '{print $1}'`for I in $DPV ;do pvcreate $Idone 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 {######################建立LVuntil [ $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/$LVdone}#######################縮小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/$LVdone}### 程式選擇介面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:" CHcase $CH in'A') A ;;'B') B ;;'C') C ;;'D') D ;; *) exit ;;esac