說明:腳本執行時,可以顯示一個菜單給用戶,形如下面:
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