Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # скрипт добавления дисков в поломаные массивы, запускается через udev с передачей имени диска
- DATE=`date +%d.%m.%y\ %H:%M:%S`
- raids="/proc/mdstat"
- new_disc=$1
- log_file="/var/log/raid_recover.log"
- if [ $# -eq 1 ]
- then
- #спим 30 секунд, если начинать сразу, то иногда по непонятной причине начинает расти LA и 3.14здец...(видимо диск не успевает определиться, хз)
- sleep 30
- #проверяем смарт, если плохой - выходим и пишем в лог
- if [[ `smartctl -a $new_disc | grep FAILING_NOW` ]]
- then
- echo $DATE "Bad smart on inserted disc($new_disc) . Please insert enother one." >>$log_file
- # сигналим "не подходит"
- 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
- exit 0
- fi
- # проверяем сколько у нас вообще битых массивов и пишем в лог
- for md in `cat $raids | grep "md[0-9]" | grep -v "(F)" | awk '{print $1}' | sort -n`
- do
- 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 ]
- then
- 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}' | \
- sed 's/\[[0-9\]]//g'`" >>$log_file
- fi
- done
- ##############################################
- # перебираем массивы с одним элементом, исключая содержащие в себе диски с меткой "(F)"
- for md in `cat $raids | grep md[0-9] | grep -v "(F)" | awk '{print $1}' | sort -n`
- do
- # если нашёлся неполный массив(с одним элементом)
- 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 ]
- then
- # узнаём имя оставшегося в массиве диска(устройство а не номер раздела)
- 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'`
- # если размеры дисков совпадают (допуск кажется прмерно 50кб)
- if [[ `fdisk -s $new_disc` -ge `fdisk -s /dev/$good_disc` ]]
- then
- # сообщение "диски одинаковые"
- echo $DATE "$new_disc have same size as /dev/$good_disc, OK" >>$log_file
- # затираем суперблок
- mdadm --zero-superblock $new_disc >/dev/null 2>&1
- # копируем таблицу разделов с диска на диск
- sfdisk -d /dev/$good_disc | sfdisk $new_disc >/dev/null 2>&1
- # перебираем разделы нового диска
- for i in `ls $new_disc`
- do
- echo $i
- # перебираем массивы с нужным нам диском
- for md_f in `cat $raids | grep $good_disc | awk '{print $1}' | sort -n`
- do
- echo $md_f
- # узнаём номер(1..n) присутствующего в массиве раздела и пришиваем соответствующий раздел нового диска
- 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'`
- echo $DATE "add $new_disc$part_number to /dev/$md_f" >>$log_file
- mdadm /dev/$md_f -a $new_disc$part_number >/dev/null 2>&1
- # сигналим при добавлении раздела в массив
- beep -f 2200 -l 400 -n -f 2300 -l 400 -n -f 2400 -l 400 ; sleep 0.7
- done
- echo "*" >>$log_file
- # закончили перебирать разделы и пришивать, заканчиваем работу скрипта
- exit
- done
- # если новый диск меньше - сообщение "новый диск меньше на х кб, вставьте диск размером xxx кб или больше"
- elif [[ `fdisk -s $new_disc` -lt `fdisk -s /dev/$good_disc` ]]
- then
- let "work_disc_size=$((`fdisk -s /dev/$good_disc`))/1024"
- let "disc_diff=$((`fdisk -s /dev/$good_disc`-`fdisk -s $new_disc`))/1024" ; echo $a
- 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
- # сигналим "не подходит"
- 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
- fi
- echo "*" >>$log_file
- # диск меньше - выходим не перебирая все массивы
- exit 0
- fi
- done
- else
- echo "give me device, example "/dev/sdx""
- exit 0
- fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement