不求甚解

此博客为个人学习之用,如与其他作品雷同,纯属巧合。

导航

initDB.sh初始化磁盘脚本centos7

Posted on 2022-02-28 17:28  三年三班王小朋  阅读(74)  评论(0编辑  收藏  举报

新加磁盘初始化脚本

跳转:优化(2022-4-14)

vim initDB.sh

#!/bin/bash
# auther by wangxp

EXCLUDE_LIST='2,11'
EXCLUDE_DISK=sda
VG_NAME=vg0

function check {
if test ! $? -eq 0
then
echo "Error!"
exit 1
fi
}
lsblk |grep -v sda
#生成磁盘数组1
VDA_NUM=`lsblk -d -e $EXCLUDE_LIST -p|grep -v $EXCLUDE_DISK|grep -v 'NAME'|wc -l`
if test $VDA_NUM -ge 1;then
echo "-------------- New hard disk detected ---------------------"
for(( i=0; i< ${VDA_NUM} ; i++ ))
do
vda_name=`lsblk -d -e $EXCLUDE_LIST -p|grep -v $EXCLUDE_DISK|grep -v 'NAME'|awk "NR==($i+1)"|awk '{print $1}'`
vda_names[$i]=${vda_name}
done
else
exit 1
fi
#设置选择操作磁盘 VDA_NAME 磁盘名
PS3="Select an unmounted hard disk: "
select VDA_NAME in ${vda_names[@]}
do
if test -z $VDA_NAME
then
echo "Input error!"
exit 1
fi
break
done
#设置挂载点数量
read -p "Input the number of mount points: " POINT_NUM
while true;do
if test -z $POINT_NUM
then
echo "ERROR,input is null"
echo -n "Input the number of mount points: "
read POINT_NUM
else
break
fi
done

if test $POINT_NUM -ge 1
then
LV_MAX_SIZE=`lsblk -d -e $EXCLUDE_LIST -p| grep $VDA_NAME|awk '{print $4}'`
LV_FREE_SIZE=${LV_MAX_SIZE%G*}
for (( i=0;i<${POINT_NUM};i++ ))
do
j=$[$i+1]
#设置挂载目录名
read -p "[$j].Input name of ${j}th_mount(default u0$j): " MOUNT_NAME
if test -z $MOUNT_NAME;then
MOUNT_NAME="u0$j"
fi
mount_names[$i]=$MOUNT_NAME
#设置最后一个lv剩余空间大小
echo "Set mount point /${mount_names[$i]}"
if test $[$POINT_NUM-$j] -eq 0
then
echo "Set /${mount_names[$i]} all free size is ${LV_FREE_SIZE}G"
LV_SIZE=$LV_FREE_SIZE
else
#规范空间大小
read -p "Input size of ${mount_names[$i]}(free size ${LV_FREE_SIZE}G): " LV_SIZE
while true;do
if test -z $LV_SIZE
then
echo "ERROR,input is null"
echo -n "Input size of ${mount_names[$i]}(free size ${LV_FREE_SIZE}G): "
read LV_SIZE
elif test $LV_SIZE -ge $LV_FREE_SIZE
then
echo "ERROR,input size greater than or equal to ${LV_FREE_SIZE}G"
echo -n "Input size of ${mount_names[$i]}(free size ${LV_FREE_SIZE}G): "
read LV_SIZE
elif test $LV_SIZE -le 0
then
echo "ERROR,input size less than or equal to 0G"
echo -n "Input size of ${mount_names[$i]}(free size ${LV_FREE_SIZE}G): "
read LV_SIZE
else
break
fi
done
LV_FREE_SIZE=$[$LV_FREE_SIZE-$LV_SIZE]
fi
lv_sizes[$i]=$LV_SIZE
lv_names[$i]=lv${j}
done
else
echo "Input illegal"
fi


echo '-----------------'
echo VDA_NAME=$VDA_NAME
echo VG_NAME=$VG_NAME
for (( i=0;i<${POINT_NUM};i++ ))
do
echo "mount point=/${mount_names[$i]}    size=${lv_sizes[$i]}G"
done
echo '-----------------'
read -p "Confirm configuration(yes/no)?" INPUT
while true;do
case $INPUT in
y|yes)
    #创建物理卷
    pvcreate $VDA_NAME
    check
    #创建逻辑卷组
    vgcreate $VG_NAME $VDA_NAME
    check
    #创建逻辑卷
    for (( i=0;i<${POINT_NUM};i++ ))
    do
    j=$[$i+1]
    if test $[$POINT_NUM-$j] -eq 0
    then
    lvcreate -l +100%free -n "lv${lv_names[$i]}" $VG_NAME
    check
    else
    lvcreate -L ${lv_sizes[$i]}G -n "lv${lv_names[$i]}" $VG_NAME
    check
    fi
    #创建挂载点
    mkdir "/${mount_names[$i]}"
    check
    #格式化逻辑卷
        mkfs -t xfs "/dev/$VG_NAME/lv${lv_names[$i]}"
    check
    #添加fstab开机启动
    fstab_lv=`cat /etc/fstab|grep "/dev/mapper/$VG_NAME-lv${lv_names[$i]}"`
    if test -z $fstab_lv
    then
    echo "/dev/mapper/$VG_NAME-lv${lv_names[$i]} /${mount_names[$i]}  xfs  defaults  0 0" >> /etc/fstab
    check
    fi
    done
    #重新加载fstab文件中的内容
    echo "mount all point......"
    mount -a
    lsblk
    break
;;
n|no)
        break
;;
*)
        echo "Input ERROR"
    echo -n "Confirm configuration(yes/no)?"
        read INPUT
;;
esac
done

 

 

优化

  • 识别T级别以上磁盘
  • 排除已经使用的pv
  • 判断是否存在目录

vim initDB.sh

#!/bin/bash
# auther by wangxp

function check {
if test ! $? -eq 0
then
echo "Error!"
exit 1
fi
}
#lsblk |grep -v sda
#生成磁盘数组
pv_used_num=`pvs|grep -v PV|wc -l`
for (( i=0; i<$pv_used_num; i++))
do
pv_used_name=`pvs|egrep -o /dev/[[:alpha:]]{3}|awk "NR==($i+1)"`
pv_useds_names[i]=$pv_used_name
done
pv_num=`lsblk -ldp|grep -v sr|grep -v fd|grep -v 'NAME'|wc -l`
for(( i=0; i< ${pv_num} ; i++ ))
do
pv_name=`lsblk -ldp|grep -v sr|grep -v fd|grep -v 'NAME'|awk "NR==($i+1)"|awk '{print $1}'`
pv_names[$i]=${pv_name}
done
#去除已经存在的pv
for (( i=0; i<${pv_num}; i++ ))
do
for (( j=0; j<${pv_used_num}; j++ ))
do
if test "${pv_names[$i]}" == "${pv_useds_names[$j]}";then
unset pv_names[$i]
break
fi
done
done

#设置选择操作磁盘 pv_name 磁盘名
PS3="Select an unmounted hard disk: "
select pv_name in ${pv_names[@]}
do
if test -z $pv_name
then
echo "Input error!"
exit 1
fi
break
done

#生成了逻辑卷组数组
vg_num=`vgs|grep -v 'VG'|awk '{print $1}'|wc -l`
for(( i=0; i<$vg_num; i++))
do
vg_names[$i]=`vgs|grep -v 'VG'|awk '{print $1}'|awk "NR==$i+1"`
done
#设置vg_name卷组名
for (( j=0; j<$vg_num; j++))
do
VG_NAME="vg$j"
for (( i=0; i<$vg_num; i++))
do
if test "$vg_name" == "${vg_names[$i]}";then
j=$[$j+1]
break
fi
done
done

#设置挂载点数量
read -p "Input the number of mount points: " POINT_NUM
while true;do
if test -z $POINT_NUM
then
echo "ERROR,input is null"
echo -n "Input the number of mount points: "
read POINT_NUM
else
break
fi
done

if test $POINT_NUM -ge 1
then
LV_MAX_SIZE_BYTE=`lsblk -bdp| grep $pv_name|awk '{print $4}'`
LV_MAX_SIZE=$[${LV_MAX_SIZE_BYTE}/1024/1024/1024]
LV_FREE_SIZE=$LV_MAX_SIZE
for (( i=0;i<${POINT_NUM};i++ ))
do
j=$[$i+1]
#设置挂载目录名
read -p "[$j].Input name of ${j}th_mount(default u0$j): " MOUNT_NAME
if test -z $MOUNT_NAME;then
MOUNT_NAME="u0$j"
fi
if test -d "/${MOUNT_NAME}";then
echo "$MOUNT_NAME is exist!"
exit 1
fi
mount_names[$i]=$MOUNT_NAME
#设置最后一个lv剩余空间大小
echo "Set mount point /${mount_names[$i]}"
if test $[$POINT_NUM-$j] -eq 0
then
echo "Set /${mount_names[$i]} all free size is ${LV_FREE_SIZE}G"
LV_SIZE=$LV_FREE_SIZE
else
#规范空间大小
read -p "Input size of ${mount_names[$i]}(free size ${LV_FREE_SIZE}G): " LV_SIZE
while true;do
if test -z $LV_SIZE
then
echo "ERROR,input is null"
echo -n "Input size of ${mount_names[$i]}(free size ${LV_FREE_SIZE}G): "
read LV_SIZE
elif test $LV_SIZE -ge $LV_FREE_SIZE
then
echo "ERROR,input size greater than or equal to ${LV_FREE_SIZE}G"
echo -n "Input size of ${mount_names[$i]}(free size ${LV_FREE_SIZE}G): "
read LV_SIZE
elif test $LV_SIZE -le 0
then
echo "ERROR,input size less than or equal to 0G"
echo -n "Input size of ${mount_names[$i]}(free size ${LV_FREE_SIZE}G): "
read LV_SIZE
else
break
fi
done
LV_FREE_SIZE=$[$LV_FREE_SIZE-$LV_SIZE]
fi
lv_sizes[$i]=$LV_SIZE
lv_names[$i]=lv${j}
done
else
echo "Input illegal"
fi
echo '-----------------'
echo pv_name=$pv_name
echo VG_NAME=$VG_NAME
for (( i=0;i<${POINT_NUM};i++ ))
do
echo "mount point=/${mount_names[$i]}    size=${lv_sizes[$i]}G"
done
echo '-----------------'
read -p "Confirm configuration(yes/no)?" INPUT
while true;do
case $INPUT in
y|yes)
    #创建物理卷
    pvcreate $pv_name
    check
    #创建逻辑卷组
    vgcreate $VG_NAME $pv_name
    check
    #创建逻辑卷
    for (( i=0;i<${POINT_NUM};i++ ))
    do
    j=$[$i+1]
    if test $[$POINT_NUM-$j] -eq 0
    then
    lvcreate -l +100%free -n "${lv_names[$i]}" $VG_NAME
    check
    else
    lvcreate -L ${lv_sizes[$i]}G -n "${lv_names[$i]}" $VG_NAME
    check
    fi
    #创建挂载点
    mkdir "/${mount_names[$i]}"
    check
    #格式化逻辑卷
        mkfs -t xfs "/dev/$VG_NAME/${lv_names[$i]}"
    check
    #添加fstab开机启动
    fstab_lv=`cat /etc/fstab|grep "/dev/mapper/$VG_NAME-${lv_names[$i]}"`
    if test -z $fstab_lv
    then
    echo "/dev/mapper/$VG_NAME-${lv_names[$i]} /${mount_names[$i]}  xfs  defaults  0 0" >> /etc/fstab
    check
    fi
    done
    #重新加载fstab文件中的内容
    echo "mount all point......"
    mount -a
    lsblk
    break
;;
n|no)
        break
;;
*)
        echo "Input ERROR"
    echo -n "Confirm configuration(yes/no)?"
        read INPUT
;;
esac
done