shell脚本创建逻辑卷(VG&&LV)

本文介绍了如何使用bash脚本在Linux中自动化创建VG(卷组)、PV(物理卷)和LV(逻辑卷),包括检查磁盘状态、创建PV和VG、创建文件系统并挂载到指定目录。还演示了如何挂载LV到客户端目录以供使用。
摘要由CSDN通过智能技术生成

一、新建VG&&LV

vim create_pv_lv.sh
#!/bin/bash
set -x
############################################################
if [ $# -ne 3 ];then
    echo "error,please use like sh creat_pv_lv.sh  disk(/dev/sdb[0-9])  vgname(vg_data) lvname(lv_data)"
    exit 201
fi
############################################################
if ! which lvm >/dev/null 2>&1;then
    echo "install lvm2 first"
    exit 201
fi
############################################################
function create_vg_pv(){
    # disk 可能不存在
    if ! lsblk $1 >/dev/null 2>&1;then
        echo "error,$1 is not found,may not exist"
        return 201
    fi

    # disk分区,disk[num]可用,disk不可用
    respart=$(lsblk $1 |awk 'NR>=2{print $1}' |wc -l)
    if ((respart > 1));then
        echo "error,$1 can not use,just use $1[num]"
        return 201
    fi

    # 检查disk是否已经挂载
    reslsblk=$(lsblk $1 |awk 'NR==2{print $NF}'|grep "/"|wc -l)
    if [ $reslsblk -ne 0 ];then
        echo "error,$1 can not use,already mounted"
        return 201
    fi

    # 检查disk是否已经有文件系统
    resfilesys=$(file -s $1|grep "data$"|wc -l)
    if [ $resfilesys -eq 0 ];then
        # echo "disk $1 has filesystem"
        # 检查disk是否已经pv
        respvs=$(pvs --noheadings --nolocking 2>/dev/null |grep $1|wc -l)
        if ((respvs == 1));then
            # echo "$1 has been used in pv"
            # 检查vg_name是否已经存在
            resvgs=$(vgs --noheadings --nolocking 2>/dev/null   |grep $2 |wc -l)
            if [ $resvgs -ne 0 ];then
                echo "$2 has been created,no use create"
                return 201
            fi
        fi
    fi

    # now create pv vg
    pvcreate $1 >/dev/null 2>&1
    vgcreate -s 4M $2 $1 >/dev/null 2>&1

    resvgsagain=$(vgs --noheadings --nolocking 2>/dev/null |grep $2 |wc -l)
    if ((resvgsagain==1));then
        echo "OK,$1 create $2 successfully"
    else
        echo "error,$1 create $2 failed,check"
    fi
}
################################################################
function mkfilesystem()
{
    lvname=/dev/$1/$2
    file_res=$(lsblk -f $lvname | awk 'NR==2{print $2}'| egrep -i "XFS|ext4"|wc -l)

    if [ "$file_res" -eq 0 ];then

        if which mkfs.xfs >/dev/null 2>&1;then
            mkfs.xfs -f $lvname >/dev/null 2>&1
            echo "200::$lvname successfully make filesystem xfs"

        elif which mkfs.ext4 >/dev/null 2>&1;then
            mkfs.ext4 -F $lvname >/dev/null 2>&1
            echo "200::$lvname successfully make filesystem ext4"

        else
            echo "400::error,no suitable mkfs found or make filesystem failed..."
            return 201
        fi

    else
        echo "400::find filesystem, no need to mkfs"
        return 201
    fi
}
################################################################
function create_lv()
{
    ################################################################
    vgname=$1
    lvname=$2
    ################################################################
    # lvs && filesystem
    reslvs=$(lvs --noheadings --nolocking 2>/dev/null | grep "/dev/$vgname/$lvname" && echo yes || echo no)
    if [ "$reslvs" == "yes" ];then
        mkfilesystem  $1 $2
    else
        freesize=$(vgs --noheadings --nolocking --units g $vgname 2>/dev/null|awk '{print $NF}'|awk -F '<' '{print $NF}'|awk -F 'G' '{print $1}'|awk -F . '{print $1}')
        if [ $freesize -lt 1 ];then
            echo "400::error,pvk空间小于1G,不足以新建lv"
            exit 201
        fi

        #lvsize=$(awk 'BEGIN{printf "%.1f\n",('$freesize' - '0.1')}')
        #lvsizefinly=$(echo $lvsize"G")
        createlvres=$(lvcreate -l 100%FREE -n $lvname $vgname 2>&1)
        if [ $(echo $?) -eq 0 ];then
            mkfilesystem $1 $2
        else
            echo "400::error,create lv $lvname failed"
            return 201
        fi

    fi
}
################################################################
create_vg_pv $1 $2
create_lv $2 $3
################################################################

二、挂载

vim mount.sh
#!/bin/bash
#set -x
############################################################
function ClientMount() {
    if [ ! $# -eq 2 ];then
        echo "please input:lvname(/dev/vg_data/lv_data)、client_dir(/test)"
        return 201
    fi
    ############################################################
    lvname=$1
    client_dir=$2
    ############################################################
    if [ ! -d $client_dir ];then 
        mkdir -p $client_dir >/dev/null 2>&1
    fi
    ############################################################
    ismounted=$(cat /proc/mounts | awk '{if($3~"xfs|ext4"){print $0}}'|awk '{if($2=="'$client_dir'"){print $0}}'|wc -l) 
    if [ $ismounted -ne 0 ];then
        echo "error,$client_dir has been mounted"
        return 201
    fi
    
    if  ! egrep "$lvname[[:space:]]*$client_dir[[:space:]]*xfs[[:space:]]*defaults[[:space:]]*0[[:space:]]*0" /etc/fstab >/dev/null 2>&1;then
        echo "$lvname     $client_dir                   xfs     defaults        0 0"  >>/etc/fstab 
    fi 

    mount -a
    ismounted=$(cat /proc/mounts | awk '{if($3~"xfs|ext4"){print $0}}'|awk '{if($2=="'$client_dir'"){print $0}}'|wc -l)
    if [ $ismounted -eq 0 ];then                
        echo "$2 mount $1 failed"
        return 201
    else
        echo "$2 successfully mount $1"
        exit 0
    fi
}
############################################################
ClientMount $1  $2
############################################################

三、使用

sh create_pv_lv.sh /dev/vdb vg_data lv_data
sh mount.sh /dev/vg_data/lv_data /test-2022
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值