#!/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