linux 一键分区脚本,支持LVM自动扩容

来源:互联网 发布:飞利浦剃须刀 知乎 编辑:程序博客网 时间:2024/06/03 14:22

一、功能说明
1 根据自定义的配置文件,对指定硬盘做分区,一键安装,不需要交互
2 支持 Swap,Primary,Extend,Logical 分区格式
3 可以自动计算大小
4 支持LVM分区,并自动创建
5 自动分区顺序是:Swap,Primary,Extend,Logical

遗留的问题 :
1 目前暂时没有考虑对大于2T磁盘的分区(那个需要使用GPT分区格式)
2 另外在分区时候 可能实际分区大小跟 配置文件指定的有微小出入

二、分区配置文件格式说明:
举例:
nova_volumes sdb msdos 200 primary 1 0

nova_volumes sdb msdos 400 primary 2 0

  • sdb msdos 300 extended 3 0
    nova_volumes sdb msdos 100 logical 4 3
    nova_volumes sdb msdos 100 logical 5 3

第一列 : LVM 卷名 ,如不需要用 “-”替代
第二列 : 所用的物理磁盘名 , sda/sdb/sdc 等
第三列 : 磁盘分区表格式,支持 (msdos,小于2T用; gpt 大于2T用)
第四列 : 分区大小,以M作为单位
第五列 : 分区类型(主分区/扩展分区/逻辑分区 并且一个物理磁盘下只允许有一个扩展分区)
第六列 : 配置ID,整型数字,不能为空,更不能重复
第七列 : 配置父ID号,整型数字。ID为0时,表示没有父ID号;如果不为0,则也不允许重复.

第5,第6列的配置,做个关系型数据开发的都应明白,是用做标示配置行间的父子关系
不过在此脚本中,不支持多层父子关系

上例的配置中的解释:
第一行: 配置 /dev/sdb第一个 分区,类型是 主分区 200M,所属的LVM卷名是 : nova_volumes
第二行: 配置 /dev/sdb 第二个 分区,类型是 主分区 400M,所属的LVM卷名是 : nova_volumes

第三行: 配置 /dev/sdb 第三个 分区,类型是 扩展分区 300M
第四行 : 配置 /dev/sdb 第四个 分区,类型是 逻辑分区 100M,它属于 第三行的扩展分区300M的一部分,并且它所属的LVM卷名是 : nova_volumes
第五行 : 配置 /dev/sdb 第四个 分区,类型是 逻辑分区 100M,它属于 第三行的扩展分区300M的一部分,并且它所属的LVM卷名是 : nova_volumes

#!/bin/bash cfglist="disk_custsize_partition.list"; cfglist_vaild="disk_custsize_partition_vaild.list"; cfglist_vaild_for_disk_tmp="disk_custsize_partition_vaild_for_disk_tmp.list"; cfglist_vaild_for_disk_logical_tmp="disk_custsize_partition_vaild_for_disk_logical_tmp.list"; fdisk_cmd_part="parted"; fdisk_cmd_fdk="fdisk"; partition_array=("primary" "extended" "logical"); partition_main_max=4; dev_array=(); length=${#dev_array[@]}; for i in `ls /dev/sd* |grep -vE "[0-9]"` do  dev_basename=`basename $i`;  dev_dirname=`dirname $i`;  #echo $dev_basename" "$dev_dirname;  dev_array[$length]=$dev_basename;  _length_=$(( length++ ));  #echo $length":" done #echo "OOOK,array()"; #echo ${dev_array[@]}; if [[ -f $cfglist ]] then    > $cfglist_vaild;    cat $cfglist|grep -v "#"|while read line    do       cfg_array=($line);       sub_disk=${cfg_array[1]};       if [[ -e "/dev/$sub_disk" ]]       then          #echo "/dev/"$sub_disk;          echo $line >> $cfglist_vaild;       fi    done fi fdisk_test=$( which $fdisk_cmd_fdk ); parted_test=$( which $fdisk_cmd_part ); if [[ -n $fdisk_test ]] && [[ -n $parted_test ]] then    #echo " fdisk parted OK";    for i in ${dev_array[@]}    do        echo "initial partition : "$i;        hd_sysdir="/dev";        hd_dev="$i";        hd_allinbyte=`$fdisk_cmd_fdk -l $hd_sysdir/$hd_dev |grep -E "^Disk $hd_sysdir/$hd_dev"|awk '{print $5}'`;        hd_allinMbyte=$(( $hd_allinbyte/1000/1000));        hd_allinMbyte_Used_Str=$($fdisk_cmd_part $hd_sysdir/$hd_dev print|grep -P '^[[:space:]][1-9]+'|awk '{print $3}'|tail -n 1);        if [[ -n $hd_allinMbyte_Used_Str ]] ;        then            hd_allinMbyte_Used_Array=( $( echo $hd_allinMbyte_Used_Str |sed "s/\([0-9]\+\)\(B\|MB\|GB\|TB\|PB\)/\1 \2/" ) );           #echo "hd_allinMbyte_Used :"${hd_allinMbyte_Used_Array[0]}" :"${hd_allinMbyte_Used_Array[1]};           hd_allinMbyte_Used_Array[1]=$( echo ${hd_allinMbyte_Used_Array[1]}|tr '[a-z]' '[A-Z]' );           case "${hd_allinMbyte_Used_Array[1]}" in           MB|mb)           hd_allinMbyte_Used=${hd_allinMbyte_Used_Array[0]};           ;;           GB|gb)           hd_allinMbyte_Used=$(( ${hd_allinMbyte_Used_Array[0]}*1000 ));           ;;           TB|tb)           hd_allinMbyte_Used=$(( ${hd_allinMbyte_Used_Array[0]}*1000*1000 ));           ;;           PB|pb)           hd_allinMbyte_Used=$(( ${hd_allinMbyte_Used_Array[0]}*1000*1000*1000 ));           ;;           *)           hd_allinMbyte_Used=$(( ${hd_allinMbyte_Used_Array[0]}/1000 ));           ;;           esac        else           hd_allinMbyte_Used=0;           #echo "hd_allinMbyte_Used_Array : 0 MB"};        fi        echo "hd_allinMbyte_Used_Array:"${hd_allinMbyte_Used_Array[0]};        hd_allinMbyte_Used=$( printf "%.f" $hd_allinMbyte_Used );        hd_allinMbyte_Vaild=$(( $hd_allinMbyte - $hd_allinMbyte_Used ));        echo "$hd_allinbyte : $hd_allinMbyte $hd_allinMbyte_Used ($hd_allinMbyte_Vaild)";        #continue;        #disk label        hd_lable=`$fdisk_cmd_part -s $hd_sysdir/$hd_dev print|grep -E "^Partition Table:"|awk '{print $NF}'`;        if [[ -z $hd_lable ]];        then           hd_allinGigabytes=$(( $hd_allinbyte/1000/1000/1000 ));             if [[ $hd_allinGigabytes -gt 2048 ]];                   then                      hd_lable_type="gpt";                   else                      hd_lable_type="msdos";             fi           mklabel_cmd="$fdisk_cmd_part -s $hd_sysdir/$hd_dev mklabel $hd_lable_type";                   echo ">>> mklabel_cmd :"$mklabel_cmd;                   eval "$mklabel_cmd";        fi            #continue;        for k in ${partition_array[@]};        do           echo "partition type:"$k;           if [[ ! ($k = "logical") ]];           then              #primary partition process              partition_main_used=`$fdisk_cmd_part $hd_sysdir/$hd_dev print|grep -P '^[[:space:]][1-9]+'|awk 'BEGIN{t=0};{if($5~"primary|extended"){t++}};END{print t}'`;              if [[ $partition_main_used -ge $partition_main_max ]]              then                 echo "The number of Partition: primary/extend is reach the max:$partition_main_max";                 continue;              fi              #partition start              > $cfglist_vaild_for_disk_tmp;              case "$k" in              primary)                 #echo "primary cfglist_vaild ";                 cat $cfglist_vaild |grep -E "[[:space:]]$hd_dev[[:space:]]"|awk '{if($5~"'$k'"){print $0}}' > $cfglist_vaild_for_disk_tmp;              ;;              extended)                 #echo "extended cfglist_vaild ";                 cfg_seq_num=`cat $cfglist_vaild |grep -E "[[:space:]]$hd_dev[[:space:]]"|awk '$5 =="'$k'" {print $6}'|head -n 1`;                     cat $cfglist_vaild |grep -E "[[:space:]]$hd_dev[[:space:]]"|awk '$5 =="'$k'" || $7 =="'$cfg_seq_num'" {print $0}' > $cfglist_vaild_for_disk_tmp;              ;;              esac                    while read line;                    do                        #echo $line;continue;                        sub_dev=($line);                        echo ">>> Subdev: " ${sub_dev[@]};                        hd_build_scount_req=${sub_dev[3]};                        hd_partition_type_req=${sub_dev[4]};                        hd_partition_seq=${sub_dev[5]};                        hd_partition_seq_parent=${sub_dev[6]};                        if [[ ($hd_partition_type_req = "primary" || $hd_partition_type_req = "extended") && ($hd_allinMbyte_Vaild -ge $hd_build_scount_req) ]];                        then                            echo ">>> disk count : $hd_allinMbyte  $hd_allinMbyte_Used $hd_allinMbyte_Vaild $hd_build_scount_req";                           if [[ $hd_allinMbyte_Used -eq 0 ]];                           then                              hd_build_start=1;                           else                              hd_build_start=$hd_allinMbyte_Used;                           fi                                 hd_build_end=$(( hd_build_start + hd_build_scount_req ));                                 hd_build_partition_type="";                                 case  "$k" in                                 primary)                                 hd_build_partition_type="ext4";                                 ;;                                 extended)                                 hd_build_partition_type="";                                 ;;                                 esac                                                           #start partition create                                   parted_cmd="$parted_test -s $hd_sysdir/$hd_dev mkpart $hd_partition_type_req $hd_build_partition_type $hd_build_start $hd_build_end";                                   echo "parted cmd: $parted_cmd";                                   eval "$parted_cmd";                                   parted_cmd_res=$?;                                   #wile loop,variables reset                           #hd_allinMbyte_Used=$hd_build_end;                           #echo "DDDD hd_build_end >> "$hd_build_end;                           #hd_allinMbyte_Vaild=$(( hd_allinMbyte - hd_allinMbyte_Used ));                           if [[ $k = "extended" ]];                           then                           #exntended/logical partition process                           hd_ext_all=$hd_build_scount_req;                           hd_ext_all_start=$(( hd_build_start + 1 ));                           hd_ext_all_end=$hd_build_end;                           hd_ext_allinMbyte_Vaild=$hd_ext_all;                           echo "exntended/logical partition process!"$hd_ext_all" : "$hd_ext_all_start" : "$hd_ext_all_end;                           > $cfglist_vaild_for_disk_logical_tmp                           cat $cfglist_vaild |grep -E "[[:space:]]$hd_dev[[:space:]]"|awk '{if($5=="logical" && $7=="'$hd_partition_seq'"){print $0}}' > $cfglist_vaild_for_disk_logical_tmp;                           hd_build_logicalline_seq=0;                           while read logicalline;                           do                              #echo $logicalline;                              cfg_ext_array=($logicalline);                              hd_build_ext_req=${cfg_ext_array[3]};                              #echo ">>> $hd_ext_allinMbyte_Vaild -ge $hd_build_ext_req";                              if [[ $hd_ext_allinMbyte_Vaild -ge $hd_build_ext_req ]];                              then                                 if [[ hd_build_logicalline_seq -eq 0 ]];                                 then                                    hd_build_ext_start=$hd_ext_all_start;                                 fi                                 hd_build_ext_end=$(( hd_build_ext_start + hd_build_ext_req -1 ));                                 #start partition (extend) create                                 parted_ext_cmd="$parted_test -s $hd_sysdir/$hd_dev mkpart logical ext4 $hd_build_ext_start $hd_build_ext_end";                                 echo "partedext cmd: $parted_ext_cmd";                                 eval "$parted_ext_cmd";                                 sleep 1;                                 if [[ $? -eq 0 ]];                                 then                                    hd_ext_allinMbyte_Vaild=$(( hd_ext_allinMbyte_Vaild - hd_build_ext_req ));                                    hd_build_ext_start=$(( hd_build_ext_end+1 ));                                    hd_build_ext_end=0;                                    #lvm create                                    partition_create_seq=`$fdisk_cmd_fdk -l $hd_sysdir/$hd_dev|grep -E "^$hd_sysdir/$hd_dev" |cut -d " " -f 1|sed -e "s/^.*$hd_dev//"|tail -n 1`;                                    vg_obg_id="${cfg_ext_array[0]}";                                    if [[ $vg_obg_id != '-' ]];                                    then                                                    eval "vg_obg_id_length=$(echo '${#'$vg_obg_id'[@]}')";                                                    echo "LV-Vg Create: $vg_obg_id";                                                    eval "(pvdisplay -s $hd_sysdir/$hd_dev 2>&1) > /dev/null";                                                          if [[ $? -ne 0 ]];                                                          then                                                             vg_cmd="pvcreate -f $hd_sysdir/$hd_dev"$partition_create_seq;                                                                 echo "Vgcreate cmd: $vg_cmd";                                                             eval "$vg_cmd";                                                             #put pgid in the vg arrays                                                             eval "${vg_obg_id}[$vg_obg_id_length]='$hd_sysdir/$hd_dev$partition_create_seq'";                                                         echo "$vg_obg_id_length: '"$hd_sysdir"/"$hd_dev$partition_create_seq"'";                                                             vg_obg_id_length=$(( vg_obg_id_length+1  ));                                                          fi                                                        fi                                 fi                              fi                              hd_build_logicalline_seq=$(( hd_build_logicalline_seq + 1 ));                           done < $cfglist_vaild_for_disk_logical_tmp;                           > $cfglist_vaild_for_disk_logical_tmp;                           fi                                   #end if [[ $k = "extended" ]]                                   #wile loop,variables reset                           hd_allinMbyte_Used=$hd_build_end;                           #echo "DDDD hd_build_end >> "$hd_build_end;                           hd_allinMbyte_Vaild=$(( hd_allinMbyte - hd_allinMbyte_Used ));                                   #continue;                                   #Lvm: pvcreate                                   #echo "LVM: parted_cmd_res:"${sub_dev[0]};                                   if [[ $parted_cmd_res -eq 0 ]];                                   then                                     partition_create_seq=`$fdisk_cmd_fdk -l $hd_sysdir/$hd_dev|grep -E "^$hd_sysdir/$hd_dev" |cut -d " " -f 1|sed -e "s/^.*$hd_dev//"|tail -n 1`;                                     if [[ ${sub_dev[0]} != '-' ]];                                     then                                        vg_obg_id="${sub_dev[0]}";                                        eval "vg_obg_id_length=$(echo '${#'$vg_obg_id'[@]}')";                                        echo "LV-Vg Create: $vg_obg_id";                                        eval "(pvdisplay -s $hd_sysdir/$hd_dev 2>&1) > /dev/null";                                             if [[ $? -ne 0 ]];                                             then                                                vg_cmd="pvcreate -f $hd_sysdir/$hd_dev"$partition_create_seq;                                                    echo "Vgcreate cmd: $vg_cmd";                                                eval "$vg_cmd";                                                #put pgid in the vg arrays                                                eval "${vg_obg_id}[$vg_obg_id_length]='$hd_sysdir/$hd_dev$partition_create_seq'";                                            echo "$vg_obg_id_length: '"$hd_sysdir"/"$hd_dev$partition_create_seq"'";                                                vg_obg_id_length=$(( vg_obg_id_length+1  ));                                             fi                                 fi                             fi                           #end if [[ $? -eq 0 ]]                          fi                          #end if [[ $hd_allinMbyte_Vaild -ge $hd_build_scount_req ]]                    done < $cfglist_vaild_for_disk_tmp;           fi           #end if [[ ! ($k = "primary" ]]        done        continue;         done; else    echo " system doesn't install fdisk or parted!";    exit 1; fi #echo "partition customize end";exit #lvm start unset vg_obg_id vg_obg_id_length; for i in `cat $cfglist_vaild |cut -d " " -f 1|grep -v "-"|sort -u`; do vg_obg_id=$i; echo "__"$i"__"; eval "vg_obg_id_length=$(echo '${#'$vg_obg_id'[@]}')"; for ((j=0;j<$vg_obg_id_length;j++)) do    eval 'vg_obg_disk_name=${'$vg_obg_id'[$j]}';    echo $j":"$vg_obg_disk_name;    eval "(vgdisplay -s $vg_obg_id 2>&1) > /dev/null"    if [[ $? -eq 0 ]];    then       eval "(vgextend $vg_obg_id $vg_obg_disk_name 2>&1) >/dev/null";    else       eval "(vgcreate $vg_obg_id $vg_obg_disk_name 2>&1) >/dev/null";    fi done; done; exit 0; 
0 0
原创粉丝点击