# 这是一个基于SHELL的Linux LVM管理工具.类似于AIX下的SMIT.当然,它只能管理LVM.


# 此工具当前版本为1.0.实现了如下功能:


物理卷模块的功能:创建,移除,更改,扫描,查看.

卷组模块的功能:创建,移除,更改,扫描,查看,合并,迁移.

逻辑卷模块的功能:创建,移除,更改,扫描,查看,快照.


# 已在Red Hat Enterprise Linux 5.4 64bit上测试通过.


# 脚本可通过附件下载




#!/bin/bash
# Version 1.0
# AUTHOR:       Xin23   http://weibo.com/231988
Tab()
{
        printf \\t
}
NextLine()
{
        echo ' '
}
EchoTitle()
{
        NextLine
        if [ "$1" == "newline" ]
                then echo "--------$TITLE-----------------------------------------"
                NextLine
                NextLine
        else
                                echo "--------$TITLE-----------------------------------------"
        fi
}
ErrorInput()
{
        NextLine
        echo "$(printf \\t)Warning:$(printf \\t)Invalid Value,Please Retype!"
                NextLine
}
ReadError()
{
                NextLine
                read -p "$(printf \\t)Press Any Key Plus Enter To Return:$(printf \\t)" ErrorVar
                                  
                NextLine
}
ChooseDisk()
{
                NextLine
        Tab
        read -p "Please Choose Disk:$(printf \\t)(Example: /dev/sdc)$(printf \\t)"  PARAMETER
        NextLine
}
ChoosePV()
{
                NextLine
                               
        Tab
        read -p "Please Choose Physical Volumn:$(printf \\t)(Example: /dev/sdb)$(printf \\t)"  PVVAR
        NextLine
}
ChooseVG()
{
                NextLine
        Tab
        read -p "Please Choose Volumn Group:$(printf \\t)(Example: datavg)$(printf \\t)"  VGVAR
        NextLine
}
ChooseLV()
{
                NextLine
        Tab
        read -p "Please Choose Logical Volumn:$(printf \\t)(Example: /dev/datavg/datalv)$(printf \\t)"  LVVAR
        NextLine
}
GetChoice()
{
                NextLine
        Tab
        read -p "Input Your Choice:$(printf \\t)" CHOICE
        NextLine
}
RunCommand()
{
        if   [ $CHOICE == y ]
             then $COMMAND $ADDTIONAL_OPTIONS $PARAMETER
        elif [ $CHOICE == n ]
             then LVMMain
        else
                            VerifyOperate
        fi
                                      
        if [ $? -ne 0 ]
             then exit 1
        fi
}
VerifyOperate()
{
        NextLine
                echo "$(printf \\t)Attention:$(printf \\t)You Will Run Command:$(printf \\t) $COMMAND $ADDTIONAL_OPTIONS $PARAMETER"
        NextLine
        echo "$(printf \\t)Continue$(printf \\t)...... y
$(printf \\t)Return$(printf \\t)$(printf \\t)...... n"
        GetChoice
        NextLine
        RunCommand
}
UnsetVar()
{
        unset COMMAND ADDTIONAL_OPTIONS PARAMETER PVVAR VGVAR LVVAR TITLE PVNAME VGNAME PESIZE DestinationVG SourceVG VGSTATUS LVNAME LVNAMEVAR
        unset LVOPTION LENUM LVSIZE SIZE MIRRORNUM STRIPESIZE STRIPEWIDTH MIRRORVAR STRIPEVAR LVSIZECreateType PVSTATUS LVSTATUS
}
PVChange()
{
        echo "$(printf \\t)Which Operate You Want To do ?"
        NextLine
        echo "$(printf \\t)Enable Allocatable$(printf \\t)...... y
$(printf \\t)Disable Allocatable$(printf \\t)...... n"
        GetChoice
        if   [ $CHOICE == y ]
             then ADDTIONAL_OPTIONS='-x y'
                                    PVSTATUS=Enable
                                    TITLE='Enable Physical Volumn'
                    EchoTitle newline
        elif [ $CHOICE == n ]
             then ADDTIONAL_OPTIONS='-x n'
                                    PVSTATUS=Disable
                                    TITLE='Disable Physical Volumn'
                    EchoTitle newline
        else
                                    ErrorInput
                    ReadError
                    PV
        fi
}
PVShow()
{
        echo "$(printf \\t)Which Physical Volumn You Want To Show ?"
        NextLine
        echo "$(printf \\t)All    Physical Volumn$(printf \\t)...... 1
$(printf \\t)Single Physical Volumn$(printf \\t)...... 2"
        GetChoice
        if   [ $CHOICE -eq 1 ]
             then clear
                            pvdisplay
        elif [ $CHOICE -eq 2 ]
             then EchoTitle newline
                            ChooseDisk
                            clear
                            pvdisplay $PARAMETER
                else
                            ErrorInput
                            ReadError
                            PV
        fi
}
MigratePE()
{
        read -p "$(printf \\t)Please Input Source Physical Volumn:$(printf \\t)" SourcePV
        NextLine
        read -p "$(printf \\t)Please Input Destination Physical Volumn:$(printf \\t)" DestinationPV
        NextLine
        COMMAND=pvmove
        PARAMETER="$SourcePV $DestinationPV"
        echo "$(printf \\t)Attention:$(printf \\t)Extents on Physical Volumn $SourcePV Will Move To $DestinationPV"
        VerifyOperate
}
PV()
{
                UnsetVar
                clear
                TITLE='Physical Volumn Menu'
                EchoTitle
ShowPVMenu()
{
        echo "
                                      
$(printf \\t)Physical Volumn Menu
$(printf \\t)Input Number To Choose!
$(printf \\t)Create  Physical Volumn$(printf \\t)...... 1
$(printf \\t)Remove  Physical Volumn$(printf \\t)...... 2
$(printf \\t)Change  Physical Volumn$(printf \\t)...... 3
$(printf \\t)Show    Physical Volumn$(printf \\t)...... 4
$(printf \\t)Scan    Physical Volumn$(printf \\t)...... 5
$(printf \\t)Migrate Physical Extent$(printf \\t)...... 6
$(printf \\t)Exit                   $(printf \\t)...... 7"
        NextLine
}
ShowPVMenu
GetChoice
case $CHOICE in
        "1")
                TITLE='Create Physical Volumn'
                EchoTitle newline
                COMMAND=pvcreate
                ChooseDisk             
                echo "$(printf \\t)Attention:$(printf \\t)Disk $PARAMETER Will Convert To Physical Volumn"
                VerifyOperate
        ;;
        "2")
                TITLE='Remove Physical Volumn'
                EchoTitle newline
                COMMAND=pvremove
                ChooseDisk
                echo "$(printf \\t)Attention:$(printf \\t)Disk $PARAMETER Will Be Remove From Physical Volumn"
                VerifyOperate
        ;;
        "3")
                TITLE='Change Physical Volumn'
                EchoTitle newline
                COMMAND=pvchange
                PVChange
                ChooseDisk
                echo "$(printf \\t)Attention:$(printf \\t)Physical Volumn $PARAMETER Will $PVSTATUS"
                VerifyOperate
        ;;
        "4")
                TITLE='Show   Physical Volumn'
                EchoTitle newline
                PVShow
        ;;
        "5")
                TITLE='Scan   Physical Volumn'
                                clear
                EchoTitle newline
                pvscan
        ;;
        "6")
                TITLE='Migrate Physical Extent'
                EchoTitle newline
                MigratePE
        ;;
        "7")
                LVMMain
        ;;
         * )
                ErrorInput
                                ReadError
                PV
        ;;
                                      
esac
                        exit 0
}
VGChange()
{
                                  
        echo "$(printf \\t)Which Operate You Want To do ?"
        NextLine
        echo "$(printf \\t)Extend Volumn Group$(printf \\t)...... 1
$(printf \\t)Reduce Volumn Group$(printf \\t)...... 2
$(printf \\t)Active Volumn Group$(printf \\t)...... 3
$(printf \\t)Inactive Volumn Group$(printf \\t)...... 4"
        GetChoice
                                      
case $CHOICE in
                                      
        "1")
                TITLE='Extend Volumn Group'
                EchoTitle newline
                COMMAND=vgextend
                read -p "$(printf \\t)Which Volumn Group You Want To Extend?$(printf \\t)(Example: datavg)$(printf \\t)" VGVAR
                NextLine
                read -p "$(printf \\t)Which Physical Volumn You Want To Add?$(printf \\t)(Example: /dev/sdb)$(printf \\t)" PVVAR
                PARAMETER="$VGVAR $PVVAR"
                                VGSTATUS=Extend
        ;;
        "2")
                TITLE='Reduce Volumn Group'
                EchoTitle newline
                COMMAND=vgreduce
                read -p "$(printf \\t)Which Volumn Group You Want To Reduce ?$(printf \\t)(Example: datavg)$(printf \\t)" VGVAR
                NextLine
                read -p "$(printf \\t)Which Physical Volumn You Want To Remove ?$(printf \\t)(Example: /dev/sdb)$(printf \\t)" PVVAR
                                PARAMETER="$VGVAR $PVVAR"
                                VGSTATUS=Reduce
        ;;
        "3")
                TITLE='Active Volumn Group'
                EchoTitle newline
                COMMAND=vgchange
                ChooseVG
                ADDTIONAL_OPTIONS='-a y'
                PARAMETER=$VGVAR
                                VGSTATUS=Active
        ;;
        "4")
                TITLE='Inactive Volumn Group'
                EchoTitle newline
                COMMAND=vgchange
                ChooseVG
                ADDTIONAL_OPTIONS='-a n'
                PARAMETER=$VGVAR
                                VGSTATUS=Inactive
        ;;
         * )
                                ErrorInput
                ReadError
                                VG
        ;;
                                      
esac
}
VGShow()
{
        echo "$(printf \\t)Which Volumn Group You Want To Show ?"
        NextLine
        echo "$(printf \\t)All    Volumn Group$(printf \\t)...... 1
$(printf \\t)Single Volumn Group$(printf \\t)...... 2"
        GetChoice
        if   [ $CHOICE -eq 1 ]
             then clear
                            vgdisplay -v
        elif [ $CHOICE -eq 2 ]
             then EchoTitle newline
                            ChooseVG
                            PARAMETER=$VGVAR
                            clear
                            vgdisplay -v $PARAMETER
                else
              ErrorInput
              ReadError
              VG
        fi
}
VGMerge()
{
        echo "$(printf \\t)Merge Source Volumn Group To Destination Volumn Group!"
        NextLine
        read -p "$(printf \\t)Please Input Your Destination Volumn Group:$(printf \\t)" DestinationVG
        NextLine
        read -p "$(printf \\t)Please Input Your Source Volumn Group:$(printf \\t)" SourceVG
        NextLine
        COMMAND=vgmerge
        PARAMETER="$DestinationVG $SourceVG"
}
VGMigrate()
{
        echo "$(printf \\t)Which Operation Do You Want To Do?"
        NextLine
        echo "$(printf \\t)Export Volumn Group$(printf \\t)...... 1
$(printf \\t)Import Volumn Group$(printf \\t)...... 2"
        GetChoice
        NextLine
        if [ $CHOICE -eq 1 ]
                then TITLE='Export Volumn Group'
                                EchoTitle newline
                                COMMAND=vgexport
                                read -p "$(printf \\t)Which Volumn Group Do You Want To Export:$(printf \\t)"       PARAMETER
                                NextLine
                                VGSTATUS=Export
        elif [ $CHOICE -eq 2 ]
                then TITLE='Import Volumn Group'
                                EchoTitle newline
                                COMMAND=vgimport
                                read -p "$(printf \\t)Which Volumn Group Do You Want To Import:$(printf \\t)"       PARAMETER
                                NextLine
                                VGSTATUS=Import            
                else
                                ErrorInput
                ReadError
                                VG
        fi
}
VG()
{
                UnsetVar
                clear
                TITLE='Volumn   Group Menu'
                EchoTitle
ShowVGMenu()
{
                                  
        echo "
                                      
$(printf \\t)Volumn   Group Menu
$(printf \\t)Input Number To Choose!
$(printf \\t)Create  Volumn Group$(printf \\t)...... 1
$(printf \\t)Remove  Volumn Group$(printf \\t)...... 2
$(printf \\t)Change  Volumn Group$(printf \\t)...... 3
$(printf \\t)Show    Volumn Group$(printf \\t)...... 4
$(printf \\t)Scan    Volumn Group$(printf \\t)...... 5
$(printf \\t)Merge   Volumn Group$(printf \\t)...... 6
$(printf \\t)Migrate Volumn Group$(printf \\t)...... 7
$(printf \\t)Exit                $(printf \\t)...... 8"
        NextLine
}
ShowVGMenu
GetChoice
case $CHOICE in
        "1")
                TITLE='Create Volumn Group'
                EchoTitle newline
                COMMAND=vgcreate
                read -p "$(printf \\t)Please Input VGNAME You Want To Create:$(printf \\t)"       VGNAME
                NextLine
                read -p "$(printf \\t)Please Input PVNAME(Member Of Volumn Group):$(printf \\t)" PVNAME
                NextLine
                read -p "$(printf \\t)Please Input Physical Extent Size:$(printf \\t)(Example: 16MB$(printf \\t)Default: 4MB)$(printf \\t)" PESIZE
                NextLine
                PARAMETER=" $VGNAME $PVNAME"
                if [ -n "$PESIZE" ]
                then ADDTIONAL_OPTIONS="-s $PESIZE"
                fi
                echo "$(printf \\t)Attention:$(printf \\t)Volumn Group $VGNAME Will Be Create And $PVNAME Will Be It Member"
                VerifyOperate
        ;;
        "2")
                TITLE='Remove Volumn Group'
                EchoTitle newline
                COMMAND=vgremove
                ChooseVG
                PARAMETER=$VGVAR
                echo "$(printf \\t)Attention:$(printf \\t)Volumn Group $PARAMETER Will Remove"
                VerifyOperate
        ;;
        "3")
                TITLE='Change Volumn Group'
                EchoTitle newline
                VGChange
                NextLine
                echo "$(printf \\t)Attention:$(printf \\t)Volumn Group $VGVAR Will $VGSTATUS"
                VerifyOperate
        ;;
        "4")
                TITLE='Show   Volumn Group'
                EchoTitle newline
                VGShow
        ;;
        "5")
                TITLE='Scan   Volumn Group'
                                clear
                EchoTitle newline
                vgscan
        ;;
        "6")
                TITLE='Merge  Volumn Group'
                EchoTitle newline
                VGMerge
                echo "$(printf \\t)Attention:$(printf \\t)Volumn Group $SourceVG Will Merge To $DestinationVG "
                VerifyOperate
        ;;
        "7")
                TITLE='Migrate   Volumn Group'
                EchoTitle newline
                VGMigrate
                echo "$(printf \\t)Attention:$(printf \\t)Volumn Group $PARAMETER Will Be $VGSTATUS"
                VerifyOperate
        ;;
        "8")
                LVMMain
        ;;
         * )
                ErrorInput
                                ReadError
                VG
        ;;
                                      
esac
        exit 0
}
VerifyLVType()
{
                                      
        echo "$(printf \\t)Which Type You Want To Determine Size Of Logical Volumn?
                                      
$(printf \\t)LogicalExtentsNumber$(printf \\t)...... 1
$(printf \\t)LogicalVolumeSize   $(printf \\t)...... 2"
        GetChoice
        if [ $CHOICE -eq 1 ]
            then    LVOPTION='-l'
                        read -p "$(printf \\t)Please Input Numbers Of Logical Extent:$(printf \\t)" LENUM
                        SIZE="$LVOPTION $LENUM"
        elif [ $CHOICE -eq 2 ]
            then  LVOPTION='-L'
                        read -p "$(printf \\t)Please Input Size Of Logical Volumn:$(printf \\t)" LVSIZE
                        SIZE="$LVOPTION $LVSIZE"
        else
                        ErrorInput
                        ReadError
                        LV
        fi
}
Snapshot()
{
        VerifyLVType
        NextLine
        COMMAND=lvcreate
        read -p "$(printf \\t)Please Input Logical Volumn Name You Want To Create:$(printf \\t)" LVNAME
        NextLine
        ChooseLV
        PARAMETER=$LVVAR
        NextLine
    LVNAMEVAR="-n $LVNAME"
    ADDTIONAL_OPTIONS="-s $LVNAMEVAR $SIZE"
        echo "$(printf \\t)Attention:$(printf \\t)Snapshot $LVNAME Will Create"
    VerifyOperate
}
LVCreate()
{
        COMMAND=lvcreate
        read -p "$(printf \\t)Please Input Logical Volumn Name You Want To Create:$(printf \\t)" LVNAME
        LVNAMEVAR="-n $LVNAME"
        ChooseVG
        PARAMETER=$VGVAR
                                      
        echo "$(printf \\t)Which Type Of Logical Volumn You Want To Create?
                                      
$(printf \\t)Common Logical Volumn$(printf \\t)...... 1
$(printf \\t)Mirror Logical Volumn$(printf \\t)...... 2
$(printf \\t)Stripe Logical Volumn$(printf \\t)...... 3
$(printf \\t)exit         $(printf \\t)...... 4"
        NextLine
                                      
        GetChoice
                                      
case $CHOICE in
        "1")
                                TITLE='Create Common Logical Volumn'
                EchoTitle newline
                VerifyLVType
                                NextLine
                ADDTIONAL_OPTIONS="$LVNAMEVAR $SIZE"
        ;;
        "2")
                                TITLE='Create Mirror Logical Volumn'
                EchoTitle newline
                VerifyLVType
                                NextLine
                read -p "$(printf \\t)How Many Mirror You Want To Create?$(printf \\t)" MIRRORNUM
                MIRRORVAR="-m $MIRRORNUM"
                ADDTIONAL_OPTIONS="$MIRRORVAR $LVNAMEVAR $SIZE"
        ;;
        "3")
                                TITLE='Create Stripe Logical Volumn'
                EchoTitle newline
                VerifyLVType
                                NextLine
                read -p "$(printf \\t)Please Input Stripe Size:$(printf \\t)" STRIPESIZE
                                NextLine
                read -p "$(printf \\t)Please Input Stripe Width:$(printf \\t)" STRIPEWIDTH
                STRIPEVAR="-i $STRIPEWIDTH -I $STRIPESIZE"
                ADDTIONAL_OPTIONS="$STRIPEVAR $LVNAMEVAR $SIZE"
        ;;
        "4")
                LV
        ;;
         * )
                ErrorInput
                ReadError
                LV
        ;;
                                      
esac
}
LVChange()
{
        echo "$(printf \\t)Active Logical Volumn$(printf \\t)...... 1
$(printf \\t)Inactive Logical Volumn$(printf \\t)...... 2
$(printf \\t)Rename Logical Volumn$(printf \\t)...... 3
$(printf \\t)Extend Logical Volumn$(printf \\t)...... 4
$(printf \\t)Reduce Logical Volumn$(printf \\t)...... 5"
        GetChoice
case $CHOICE in
        "1")
                TITLE='Active Logical Volumn'
                                EchoTitle newline
                                COMMAND=lvchange
                                ADDTIONAL_OPTIONS='-a y'
                                ChooseLV
                                PARAMETER=$LVVAR
                                LVSTATUS=Active
        ;;
        "2")
                TITLE='Inactive Logical Volumn'
                            EchoTitle newline
                                COMMAND=lvchange
                                ADDTIONAL_OPTIONS='-a n'
                                ChooseLV
                                PARAMETER=$LVVAR
                                LVSTATUS=Inactive
        ;;
        "3")
                TITLE='Rename Logical Volumn'
                            EchoTitle newline
                                COMMAND=lvrename
                                ChooseLV
                                read -p "$(printf \\t)Please Input New Name Of The Logical Volumn:$(printf \\t)" LVNEWNAME
                                PARAMETER="$LVVAR $LVNEWNAME"
                                LVSTATUS=Rename
                                NextLine
        ;;
        "4") 
                        TITLE='Extend Logical Volumn'
                        EchoTitle newline
                VerifyLVType
                COMMAND=lvextend
                ChooseLV
                PARAMETER="$LVVAR"
                                LVSTATUS=Extend
                ADDTIONAL_OPTIONS="$SIZE"
        ;;
        "5") 
                TITLE='Reduce Logical Volumn'
                        EchoTitle newline
                                VerifyLVType
                                COMMAND=lvreduce
                ChooseLV
                PARAMETER="$LVVAR"
                                LVSTATUS=Reduce
                ADDTIONAL_OPTIONS="$SIZE"
        ;;
         * ) 
                ErrorInput
                                ReadError
                LV
        ;;
esac
}
LVShow()
{
                                  
                echo "$(printf \\t)Which Logical Volumn You Want To Show ?"
        NextLine
        echo "$(printf \\t)All    Logical Volumn$(printf \\t)...... 1
$(printf \\t)Single Logical Volumn$(printf \\t)...... 2"
        GetChoice
                                      
        if   [ $CHOICE -eq 1 ]
             then clear
                            lvdisplay
        elif [ $CHOICE -eq 2 ]
             then EchoTitle newline
                            ChooseLV
                            PARAMETER=$LVVAR
                            clear
                            lvdisplay $PARAMETER
                else
                ErrorInput
                ReadError
                LV
                fi
}
LV()
{
        UnsetVar
        clear
        TITLE='Logical Volumn Menu'
        EchoTitle
ShowLVMenu()
{
        echo "
                                      
$(printf \\t)Logical Volumn Menu
$(printf \\t)Input Number To Choose!
$(printf \\t)Create Logical Volumn$(printf \\t)...... 1
$(printf \\t)Remove Logical Volumn$(printf \\t)...... 2
$(printf \\t)Change Logical Volumn$(printf \\t)...... 3
$(printf \\t)Show   Logical Volumn$(printf \\t)...... 4
$(printf \\t)Scan   Logical Volumn$(printf \\t)...... 5
$(printf \\t)Create Snapshot      $(printf \\t)...... 6
$(printf \\t)Exit                 $(printf \\t)...... 7"
        NextLine
}
ShowLVMenu
GetChoice
case $CHOICE in
        "1")
                                TITLE='Create Logical Volumn'
                                EchoTitle newline
                LVCreate
                                NextLine
                echo "$(printf \\t)Attention:$(printf \\t)Logical Volumn $LVNAME Will Create"
                VerifyOperate
        ;;
        "2")
                TITLE='Remove Logical Volumn'
                                EchoTitle newline
                                COMMAND=lvremove
                                ChooseLV
                                PARAMETER=$LVVAR
                                echo "$(printf \\t)Attention:$(printf \\t)Logical Volumn $PARAMETER Will Remove"
                                VerifyOperate
        ;;
        "3")
                                LVChange
                                echo "$(printf \\t)Attention:$(printf \\t)Logical Volumn $PARAMETER Will $LVSTATUS"
                VerifyOperate
        ;;
        "4")
                TITLE='Show   Logical Volumn'
                EchoTitle newline
                LVShow
        ;;
        "5")
                TITLE='Scan   Logical Volumn'
                                clear
                EchoTitle newline
                lvscan
        ;;
        "6")
                                TITLE='Create Snapshot'
                EchoTitle newline
                                Snapshot
        ;;
        "7")
                LVMMain
        ;;
         * )
                ErrorInput
                                ReadError
                LV
        ;;
                                      
esac
exit 0
}
LVMMain()
{
                                  
                clear
        TITLE='LVM Main Menu'
        EchoTitle
echo "
$(printf \\t)LVM Main Menu
$(printf \\t)Input Number To Choose!
$(printf \\t)Physical Volumn Manager$(printf \\t)...... 1
$(printf \\t)Volumn    Group Manager$(printf \\t)...... 2
$(printf \\t)Logical  Volumn Manager$(printf \\t)...... 3
$(printf \\t)Exit                   $(printf \\t)...... 4"
                                      
        GetChoice
                                      
        NextLine
case $CHOICE in
        "1")
                PV
                Status=0
        ;;
        "2")
                VG
                Status=0
        ;;
        "3")
                LV
                Status=0
        ;;
        "4")
                exit 0
        ;;
         * )
                ErrorInput
        ReadError
                LVMMain
        ;;
esac
ReturnToLVMMain()
{
        if [ $Status -eq 0 ]
           then NextLine
                LVMMain
        fi
}
ReturnToLVMMain
}
LVMMain



The End