Advertisement
Guest User

z_disc_to_md_inserter_v2.sh

a guest
Aug 20th, 2014
420
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 4.77 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. # скрипт добавления дисков в поломаные массивы, запускается через udev с передачей имени диска
  4.  
  5. DATE=`date +%d.%m.%y\ %H:%M:%S`
  6. raids="/proc/mdstat"
  7. new_disc=$1
  8. log_file="/var/log/raid_recover.log"
  9.  
  10. if [ $# -eq 1 ]
  11. then
  12. #спим 30 секунд, если начинать сразу, то иногда по непонятной причине начинает расти LA и 3.14здец...(видимо диск не успевает определиться, хз)
  13. sleep 30
  14. #проверяем смарт, если плохой - выходим и пишем в лог
  15. if [[ `smartctl -a $new_disc | grep FAILING_NOW` ]]
  16.   then
  17.     echo $DATE "Bad smart on inserted disc($new_disc) . Please insert enother one." >>$log_file
  18. # сигналим "не подходит"
  19.     for i in {1..2} ; do beep -f 840 -l 20 -n -f 2400 -l 20 ; done ; sleep 0.1 ; for i in {1..2} ; do beep -f 840 -l 20 -n -f 2400 -l 20 ; done
  20.   exit 0
  21. fi
  22.  
  23. # проверяем сколько у нас вообще битых массивов и пишем в лог
  24. for md in `cat $raids | grep "md[0-9]" | grep -v "(F)" | awk '{print $1}' | sort -n`
  25. do
  26.   if [ `cat $raids | grep $md | awk '/sd[a-z][0-9]/{for(i=1;i<=NF;++i)if($i~/sd[a-z][0-9]/)print $i}' | wc -l` -eq 1 ]
  27.   then
  28.     echo $DATE "Found md array with one element: $md with `cat $raids | grep $md | awk '/sd/{for(i=1;i<=NF;++i)if($i~/sd/)print $i}' | \
  29.     sed 's/\[[0-9\]]//g'`" >>$log_file
  30.   fi
  31. done
  32. ##############################################
  33. # перебираем массивы с одним элементом, исключая содержащие в себе диски с меткой "(F)"
  34. for md in `cat $raids | grep md[0-9] | grep -v "(F)" | awk '{print $1}' | sort -n`
  35. do
  36. # если нашёлся неполный массив(с одним элементом)
  37.   if [ `cat $raids | grep $md | awk '/sd[a-z][0-9]/{for(i=1;i<=NF;++i)if($i~/sd[a-z][0-9]/)print $i}' | wc -l` -eq 1 ]
  38.   then
  39. # узнаём имя оставшегося в массиве диска(устройство а не номер раздела)
  40.     good_disc=`cat $raids | grep $md | awk '/sd/{for(i=1;i<=NF;++i)if($i~/sd/)print $i}' | sed 's/[0-9]\[[0-9\]]//g'`
  41. # если размеры дисков совпадают (допуск кажется прмерно 50кб)
  42.     if [[ `fdisk -s $new_disc` -ge `fdisk -s /dev/$good_disc` ]]
  43.     then
  44. # сообщение "диски одинаковые"
  45.       echo $DATE "$new_disc have same size as /dev/$good_disc, OK"  >>$log_file
  46. # затираем суперблок
  47.       mdadm --zero-superblock $new_disc >/dev/null 2>&1
  48. # копируем таблицу разделов с диска на диск
  49.       sfdisk -d /dev/$good_disc | sfdisk $new_disc >/dev/null 2>&1
  50. # перебираем разделы нового диска
  51.       for i in `ls $new_disc`
  52.       do
  53. echo $i
  54. # перебираем массивы с нужным нам диском
  55.         for md_f in `cat $raids | grep $good_disc | awk '{print $1}' | sort -n`
  56.         do
  57. echo $md_f
  58. # узнаём номер(1..n) присутствующего в массиве раздела и пришиваем соответствующий раздел нового диска
  59.           part_number=`cat $raids | grep $md_f | awk '/sd/{for(i=1;i<=NF;++i)if($i~/sd/)print $i}' | sed 's/sd[a-z]//g;s/\[[0-9\]]//g'`
  60.           echo $DATE "add $new_disc$part_number to /dev/$md_f"  >>$log_file
  61.           mdadm /dev/$md_f -a $new_disc$part_number >/dev/null 2>&1
  62. # сигналим при добавлении раздела в массив
  63.           beep -f 2200 -l 400 -n -f 2300 -l 400 -n -f 2400 -l 400 ; sleep 0.7
  64.         done
  65. echo "*" >>$log_file
  66. # закончили перебирать разделы и пришивать, заканчиваем работу скрипта
  67.       exit
  68.       done
  69. # если новый диск меньше - сообщение "новый диск меньше на х кб, вставьте диск размером xxx кб или больше"
  70.     elif [[ `fdisk -s $new_disc` -lt `fdisk -s /dev/$good_disc` ]]
  71.     then
  72.       let "work_disc_size=$((`fdisk -s /dev/$good_disc`))/1024"
  73.       let "disc_diff=$((`fdisk -s /dev/$good_disc`-`fdisk -s $new_disc`))/1024" ; echo $a
  74.       echo $DATE "Warning, inserted disk - $new_disc smaller then /dev/$good_disc at $disc_diff MB, please insert disc $work_disc_size MB or larger"  >>$log_file
  75. # сигналим "не подходит"
  76.       for i in {1..2} ; do beep -f 840 -l 20 -n -f 2400 -l 20 ; done ; sleep 0.1 ; for i in {1..2} ; do beep -f 840 -l 20 -n -f 2400 -l 20 ; done
  77.     fi
  78. echo "*" >>$log_file
  79. # диск меньше - выходим не перебирая все массивы
  80.   exit 0
  81.   fi
  82. done
  83. else
  84.   echo "give me device, example "/dev/sdx""
  85. exit 0
  86. fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement