#!/bin/bash # # This script is used to configure raid. # # ############################################## # source raidutils ############################################## # prepare tmp log file for configraid touch="touch" timestamp=`date +"%Y%m%d%H%M%S"` log_file="/tmp/configraid.log.$timestamp" $touch $log_file str_dir_name=`dirname $0` . $str_dir_name/raidutils $log_file ################################################################################### # # Usage # ################################################################################# function usagesc { echo 'Usage: configraid delete_raid=[all|""|null] ' echo ' stripe_size=[16|64|256] ' echo ' create_raid="rl!|[pci_id#|pci_slot_name#|disk_names##..#]|disk_num#" ... ' echo ' 1. delete_raid: ' echo ' List raid arrays which should be removed. If its value is all, all raid arrays detected should be deleted.' echo ' If its value is a list of raid array names, these raid arrays will be deleted. Raid array names should be seperated by "#".' echo ' If its value is null, no raid array will be deleted.' echo ' If there is no delete_raid, the default value is null.' echo ' The format is : delete_raid = [all|"#...#"|null]' echo ' For example:' echo ' delete_raid="sda#sdd" ' echo ' ' echo ' 2. stripe_size: ' echo ' Currently supported stripe sizes in kb include 16, 64, and 256.' echo ' If stripe size is not specified, it will default to the recommended stripe size for the selected RAID level.' echo ' For example:' echo ' stripe_size=256 ' echo ' ' echo ' 3. create_raid: ' echo ' To create a raid array, add a line begginning with create_raid.' echo ' The format is : ' echo ' create_raid="rl#[0,10,5,6]|[PCI_ID#|PCI_SLOT_name#]|disk_num#"' echo ' rl means RAID level, RAID level can be any supported RAID level for the given adapter, such as 0, 10, 5, 6;' echo ' rl is a must for every create_raid. ' echo ' pci_id is PCI vender and device ID; refer to http://pci-ids.ucw.cz/read/PC/1014/034a;' echo ' disk_num is the number of disk this RAID will contain, default value is all unused disks in its pci slot; ' echo ' pci_slot_name is the specified PCI location. If specify pci_slot_name, this raid will be created using disks from this pci_slot;' echo ' disk_names is a list of advanced format disk names. If specify disk_names, this raid will be created using these disks;' echo ' Example 1, create 2 raid0 arrays, one is using 3 disks, the other is using 2 disks, the disks PCI_ID is 1014:034a:' echo ' create_raid="rl#0|pci_id#1014:034a|disk_num#1 create_raid="rl#0|pci_id#1014:034a|disk_num#2' echo ' Example 2, pci_slot_name is 0001:08:00.0, create raid10 array, using 2 disks ' echo ' create_raid="rl#10|pci_slot_name#0001:08:00.0|disk_num#2"' echo ' Example 3, create 1 raid0 array using advanced format disk sg1' echo ' create_raid="rl#0|disk_names#sg1|disk_num#1"' } ############################################################################### # # handle each create raid # # input format: stripe_size=16 create_raid=rl#1|pci_id#1014:034a|disk_num#1 # ############################################################################### function handle_each_create_raid { local create_raid_list=$1 local striple_pair=$2 # cut striple_size from striple_pair # if striple_size is null, it will default to the recommended stripe size local striple_size="" if [ x$striple_pair != x ]; then striple_size=`echo $striple_pair | $awk -F= '{print $2}'` else striple_size="default" fi # cut create_raid_list into raid_level pci_id|pci_slot_name|disk_names disk_num local create_raid_value="" local raidlevel="" local disknum="" local pciid="" local pcislot_name="" local disk_names="" create_raid_value=`echo $create_raid_list| $awk -F= '{print $2}' \ | $sed -e 's/|/ /g'` # make sure create_raid_value is not null firstpara=`echo $create_raid_value|awk '{print $1}'` if [ x$firstpara != x ]; then for item in $create_raid_value do key=`echo $item | $awk -F# '{print $1}'` vla=`echo $item | $awk -F# '{if($1=="disk_names"){$1="";print $0} else { print $2}}' \ | $sed -e 's/^\s*//g' -e 's/ /#/g'` case $key in rl ) raidlevel=$vla ;; pci_id ) pciid=$vla ;; pci_slot_name ) pcislot_name=$vla ;; disk_num ) disknum=$vla ;; disk_names ) disk_names="$vla" ;; esac done fi if [ x$raidlevel == x ]; then log_error "Can not create RAID for $create_raid_list. There is no raid level enter." return 1 fi # if disk_num is null, will pick up all the disks if [ x$disknum == x ]; then disknum=all fi log_info "handle create raid: $create_raid_value" local pcilocs="" local slocs_grps="" # If there is disk_names, using them if [ x$disk_names != x ]; then handle_create_raid_array "$striple_size" "$raidlevel" "$disknum" "null" "$disk_names" else # If there is pci_slot_name, use it. # If there is no pci_slot_name, there is pci_id, use pci_id. if [ x$pciid != x -a x$pcislot_name == x ]; then pcilocs=`get_pciloc_by_id $pciid` elif [ x$pcislot_name != x ]; then pcilocs=$pcislot_name else log_error "pci_id or pci_slot_name or pci_disk_names can not be empty." return 1 fi if [ -n "$pcilocs" ]; then handle_create_raid_array "$striple_size" "$raidlevel" "$disknum" "$pcilocs" "null" else log_error "PCI adapter $pcilocs does not exists!" >&2 return 1 fi fi } ############################################################################## # # main section to handle delete raid # # input format : delete_raid=[all|dev1#dev2...|null] # ############################################################################## function handle_delete_raid { local input=$* local raid_arrays="" local valid_arrays="" del_value=`echo "$input"|awk -F= '{print $2}'` # if delete_raid=all if [ "x$del_value" == "xall" -o "x$del_value" == "xALL" ]; then raid_arrays=`get_all_raid_arrays` # if delete_raid=null or nothing elif [ "x$del_value" == "xnull" -o "x$del_value" == "x" ]; then log_info "There is no need to delete RAID arrays." return 1 # if delete_raid=devlist else # delete # between raid names raid_arrays=`echo ${del_value}|sed 's/#/ /g'` fi for r_a in $raid_arrays do res=`is_array $r_a` if [ $res -eq 0 ]; then if [ "x$valid_arrays" != "x" ]; then valid_arrays=$valid_arrays" "$r_a else valid_arrays=$r_a fi fi done if [ "x$valid_arrays" != "x" ]; then # delete raid arrays delete_ipr_array enforce=1 tryCnt=360 tryInt=60 -- $valid_arrays else log_info "There is no valid raid arrays." return 1 fi } ############################################################################################# # # Main section : # delete raid # create raid # ############################################################################################ input=$* # If input parameter number is less than 1, print usage if [ $# -lt 1 ]; then usagesc exit 1 fi # If "-h|--help", print usage if [ "x$input" == "x--help" -o "x$input" == "x-h" ]; then usagesc exit 0 fi # clear up delete_raid stripe_size and create_raid del_raid_valid="" cre_raid_list="" stripe_pair="" for args in "$@" do del_raid=`echo "$args" | grep "^delete_raid="` cre_raid=`echo "$args" | grep "^create_raid="` str_size=`echo "$args" | grep "^stripe_size="` if [ x$del_raid != x ]; then del_raid_valid=$del_raid fi if [ x$str_size != x ]; then stripe_pair=$str_size fi # This is for the first create_raid if [ x$cre_raid_list == x -a x$cre_raid != x ]; then cre_raid_list=$cre_raid # if there are many create_raid elif [ x$cre_raid_list != x -a x$cre_raid != x ]; then cre_raid_list=$cre_raid_list" "$cre_raid fi done # main process for deleting raid if [ x$del_raid_valid != x ]; then handle_delete_raid "$del_raid_valid" fi # main process for creating raid create_r1=`echo $cre_raid_list|awk '{print $1}'` if [ "x${create_r1}" != "x" ]; then for cr in $cre_raid_list do # handle every create_raid handle_each_create_raid $cr $stripe_pair $lable_num done else log_info "Can not create RAID. There is no create_raid." fi