新加磁盘初始化脚本
跳转:优化(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