#!/usr/bin/env bash

#version 0.2 #author:tianyukai #set -x export LC_ALL=C export PATH=/bin:/sbin:/usr/bin:/usr/sbin _writemode="WB" _cachemode="Cached" _ramode="RA" _adapter="a0" ####################################### #Get the info of all the disks ####################################### MEGACLI=/opt/MegaRAID/MegaCli/MegaCli64 ENCLOSURE=$($MEGACLI -EncInfo -aAll | awk '/Device ID/ { print $NF }' | sed q) #Device ID DISKNUM=$($MEGACLI -EncInfo -aAll | awk '/Number of Physical Drives/ { print $NF }' | sed q) #硬盘数量

declare -a disks_cfgsize declare -a disks_unit declare -a disks_esid x=1 #每个硬盘的相关id信息以及容量大小 for((i=1;i<=$DISKNUM;i++)) do e_id=$MEGACLI -pdlist -aall |grep "Enclosure Device ID" | head -n $i | tail -n 1 | awk '{print $4}' s_id=$MEGACLI -pdlist -aall |grep "Slot Number" | head -n $i | tail -n 1 | awk '{print $3}' disk_cfgsize_raw=$MEGACLI -pdInfo -PhysDrv[$e_id:$s_id] -aALL|grep "Raw Size"|awk '{print $3}' disk_size_unit=/opt/MegaRAID/MegaCli/MegaCli64 -pdInfo -PhysDrv[$e_id:$s_id] -aALL|grep "Raw Size"|awk '{print $4}' #容量大小转换 [ "$disk_size_unit" = "GB" ] && disk_cfgsize=echo "scale=0; $disk_cfgsize_raw/100*100" | bc [ "$disk_size_unit" = "TB" ] && disk_cfgsize=echo "scale=1; $disk_cfgsize_raw/1" | bc #数组储存所有硬盘的信息 disks_cfgsize[$x]=$disk_cfgsize disks_unit[$x]=$disk_size_unit disks_esid[$x]=$e_id:$s_id

let x++

done #硬盘容量处理,硬盘容量大小由大到小储存 function disks_sort(){ rm -fr /tmp/disks_size.log >/dev/null 2>&1 for i in ${disks_cfgsize[*]};do echo "$i" >> /tmp/disks_size.log;done num=sort -n /tmp/disks_size.log |uniq -c|wc -l for i in seq $num do #相同容量的硬盘数量 number=sort -n /tmp/disks_size.log |uniq -c|sed -n "$i"p|awk '{print $1}' #该容量的具体大小 value=sort -n /tmp/disks_size.log |uniq -c|sed -n "$i"p|awk '{print $2}' for j in seq $number do eval disk_$i[$j]=$value done #数量大于4个的时候 if [ "$number" -ge 4 ] then #留一块盘做hotspare let num_raid=$number-1 #raid5 create_raid $value,$num_raid,raid5

#单独一个盘做hotspare create_raid $value,1,hotspare #数量等于3个的时候 elif [ $number -eq 3 ] then #留一块盘做hotspare let num_raid_3=$number-1 #raid1 create_raid $value,$num_raid_3,raid1 #单独一个盘做hotspare create_raid $value,1,hotspare #数量等于2个的时候 elif [ $number -eq 2 ] then #2个盘做一个raid1 num_raid_2=2 create_raid $value,$num_raid_2,raid1 else #1个盘做一个raid0 create_raid $value,1,raid0 fi

done

} #参数检查为创建raid 做准备 parameter_verify(){ local size=$1 local num=$2 local level=$3 [ -z "$size" -o -z "$num" -o -z "$level" ] && echo "All parameters cann't be empty." && return 1 #支持raid0,5,10,1,50,60. [ $level != "raid0" -a $level != "raid5" -a $level != "raid10" -a $level != "raid1" -a $level != "raid50" -a $level != "hotspare" ] && echo "Just support raid0, raid1, raid10, raid5, raid50, raid60 so far" && return 2 return 0 } #raid 0 的创建过程 makeraid0(){ echo "Make raid0" declare -a disks #硬盘信息描述 local disks_txt=echo "$@" | awk -F'ENDDISK' '{print $1}' #写模式格式 local write_mode=echo "$@" | awk -F'ENDDISK' '{print $2}' | awk '{print $1}' #缓存模式格式 local cache_mode=echo "$@" | awk -F'ENDDISK' '{print $2}' | awk '{print $2}' #ra模式 local ra_mode=echo "$@" | awk -F'ENDDISK' '{print $2}' | awk '{print $3}'

local i=1; for disk in echo $disks_txt ; do disks[$i]=$disk; let i=i+1; done #定义上述写模式、缓存模式、RA模式的具体值 local write="WB" local cache="Cached" local ramode="RA" [ "$write_mode" = "WT" ] && write="WT" [ "$cache_mode" = "Direct" ] && cache="Direct" [ "$ra_mode" = "NORA" ] && ramode="NORA" [ "$ra_mode" = "ADRA" ] && ramode="ADRA" #创建raid0 的过程 for((i=1;i<=${#disks[@]};i++)) do [ ! -z "${disks[$i]}" ] && $MEGACLI -CfgLdAdd -r0 [${disks[$i]}] $write $cache $ramode -$adapter || return 1 disks[$i]="" echo "raid0 is Ok ....." done #创建VD $MEGACLI XD -AddVd raid0 size=102400 }

#raid 5 的创建过程 makeraid5(){ echo "Make raid5" declare -a disks #硬盘信息描述 local disks_txt=echo "$@" | awk -F'ENDDISK' '{print $1}' #写模式格式 local write_mode=echo "$@" | awk -F'ENDDISK' '{print $2}' | awk '{print $1}' #缓存模式格式 local cache_mode=echo "$@" | awk -F'ENDDISK' '{print $2}' | awk '{print $2}' #ra模式 local ra_mode=echo "$@" | awk -F'ENDDISK' '{print $2}' | awk '{print $3}'

local i=1; for disk in echo $disks_txt ; do disks[$i]=$disk; let i=i+1; done #定义上述写模式、缓存模式、RA模式的具体值 local write="WB" local cache="Cached" local ramode="RA" [ "$write_mode" = "WT" ] && write="WT" [ "$cache_mode" = "Direct" ] && cache="Direct" [ "$ra_mode" = "NORA" ] && ramode="NORA" [ "$ra_mode" = "ADRA" ] && ramode="ADRA" #创建raid5 的过程br/>_parameter=$( _parameter=$( for((i=1;i<=${#disks[@]};i++)) do echo -n ${disks[$i]}, done | sed 's/,$//') echo "raid5 is ----------$_parameter" $MEGACLI -CfgLdAdd -r5 [$_parameter] $write $cache $ramode -a0 #创建VD $MEGACLI XD -AddVd raid5 size=102400 }

makeraid1(){ echo "Make raid1" declare -a disks #硬盘信息描述 local disks_txt=echo "$@" | awk -F'ENDDISK' '{print $1}' #写模式格式 local write_mode=echo "$@" | awk -F'ENDDISK' '{print $2}' | awk '{print $1}' #缓存模式格式 local cache_mode=echo "$@" | awk -F'ENDDISK' '{print $2}' | awk '{print $2}' #ra模式 local ra_mode=echo "$@" | awk -F'ENDDISK' '{print $2}' | awk '{print $3}'

local i=1; for disk in echo $disks_txt ; do disks[$i]=$disk; let i=i+1; done #定义上述写模式、缓存模式、RA模式的具体值 local write="WB" local cache="Cached" local ramode="RA" [ "$write_mode" = "WT" ] && write="WT" [ "$cache_mode" = "Direct" ] && cache="Direct" [ "$ra_mode" = "NORA" ] && ramode="NORA" [ "$ra_mode" = "ADRA" ] && ramode="ADRA" #创建raid1 的过程br/> _parameter=$( for((i=1;i<=${#disks[@]};i++)) do echo -n ${disks[$i]}, done | sed 's/,$//') echo "raid1 is ----------$_parameter" $MEGACLI -CfgLdAdd -r1 [$_parameter] $write $cache $ramode -a0 #创建VD $MEGACLI XD -AddVd raid1 size=102400 }

#创建热备盘 makehotspare(){ echo "Make hotspare" declare -a disks local i=1; local disks_txt=echo "$@" | awk -F'ENDDISK' '{print $1}' for disk in echo $disks_txt ; do disks[$i]=$disk; let i=i+1; done _parameter=$( for((i=1;i<=${#disks[@]};i++)) do echo -n ${disks[$i]}, done | sed 's/,$//') echo "hotspare is ----------$_parameter" $MEGACLI -PDHSP -Set -physdrv[$_parameter] -a0

}

#创建raid模式前需要先清除硬盘数据 clearcfg() { echo "clear" $MEGACLI -CfgClr -aALL for((i=1;i<=${#disks_cfgsize[@]};i++)); do [ "${disks_esid[$i]}" != "" ] && $MEGACLI -PDMakeGood -PhysDrv[${disks_esid[$i]}] -force -a0 1>/dev/null 2>/dev/null done sleep 2s } #创建raid模式前需要先初始化硬盘 diskinit() { $MEGACLI -LDinit -start -L0 -a0 }

[[ "$_clr" -eq 1 ]] && clearcfg

[[ $_noraid -eq 1 ]] && echo "no need to create any raid." && exit 0

#创建raid 过程 create_raid(){ local size=echo $1 | awk -F',' '{print $1}' local num=echo $1 | awk -F',' '{print $2}' local level=echo $1 | awk -F',' '{print $3}' #硬盘容量大小、数量、raid级别 三个参数 echo $size,$num,$level #检查硬盘容量大小、数量、raid级别 三个参数 parameter_verify "$size" "$num" "$level" || exit 1 #数量为0 是 按所有硬盘做一个raid,级别自定义 if [ $num -eq 0 ] ; then echo "All disks will be one raid group."

declare -a disks_esid_notnull
for((i=1;i<=${#disks_cfgsize[@]};i++)); do
    [ "${disks_esid[$i]}" != "" ] && disks_esid_notnull[$x]=${disks_esid[$i]} && disks_esid[$i]=""  && let x++
done

make${level} ${disks_esid_notnull[@]} "ENDDISK" "$_writemode" "$_cachemode" "$_ramode"
if [ $? -ne 0 ] ;then echo "Make $level failed"; exit 1; fi
diskinit
exit 0

else #否则根据定义的数量进行创建 echo "Create $level($num disks with size $size)" declare -a raid_disks x=1 #将需要创建的硬盘数据存储到数组中, for((i=1;i<=${#disks_cfgsize[@]};i++)); do [ ${disks_cfgsize[$i]} = "$size" ] && [ "${disks_esid[$i]}" != "" ] && raid_disks[$x]=${disks_esid[$i]} && disks_esid[$i]="" && let x++ [ $x -gt $num ] && break done [ ${#raid_disks[@]} -ne $num ] && echo "No enought disks with config size $size to create the RAID." && exit 1 #创建硬盘raid (调用相关的raid级别数据进行创建) make${level} ${raid_disks[@]} "ENDDISK" "$_writemode" "$_cachemode" "$_ramode" if [ $? -ne 0 ] ;then echo "Make $level failed"; exit 2; fi fi } disks_sort #判断是否有多张阵列卡 if [ $MEGACLI -pdlist -aall |grep Adapter |wc -l -eq 2 ] then num=$MEGACLI -pdlist -aall |grep "Enclosure Device ID"|wc -l id=$MEGACLI -pdlist -aall |grep "Enclosure Device ID" |awk '{print $4}'|sed -n 1p id_2=$MEGACLI -pdlist -aall |grep "Enclosure Device ID" |awk '{print $4}'|sed -n "$num"p disk_num=$MEGACLI -pdlist -aall |grep "Enclosure Device ID" |awk '{print $4}'|wc -l disk_bnum=$MEGACLI -pdlist -aall |grep -w "Coerced Size" |grep -v "Non"|wc -l disk_b=$MEGACLI -pdlist -aall |grep -w "Coerced Size" |grep -v "Non"|sed -n "$disk_bnum"p|awk '{print $3}' create_raid $disk_b $disk_num raid0 fi