Сборка распределенного RAID на NBD
Материал из Linux Wiki
Текст-описание, для чего это все надо и как оно работает потом напишу.
#!/bin/bash
#===============================================================================
#
# FILE: storage
#
# USAGE: ./storage <assemble|-a>|<disassemble|-d> [--help]
#
# DESCRIPTION: Скрипт для поиска, подключения и сборки в RAID NBD
#
# OPTIONS: ---
# REQUIREMENTS: nbd-client, mdadm, netcat, timeout
# BUGS: no known
# NOTES: ---
# AUTHOR: (linuxoid.rain@gmail.com), Rain
# COMPANY: ---
# VERSION: 1.2
# CREATED: 29.12.2007 16:06:40 EEST
# REVISION: 05
#===============================================================================
# Вывод сообщений про ошибку и выход.
error() {
echo -e "\e[5;31m"$1"\e[0;00m"
[ ! -z "$2" ] && exit $2
}
# Проверки
[ $UID != 0 ] && error "Error: You are not root" 1
[ ! -x /sbin/nbd-client ] && error "Error: nbd-client not found" 1
[ ! -x /sbin/mdadm ] && error "Error: mdadm not found" 1
[ ! -x /bin/nc ] && error "Error: netcat not found" 1
[ ! -x /usr/bin/timeout ] && error "Error: timeout not found" 1
# Установка переменных
# Адреса подключаемых машин.
address="
192.168.1.217:666 \
192.168.1.230:666 \
192.168.1.224:666 \
192.168.1.99:666 \
"
n=0
# Количество подключаемых машин
devices=`echo $address | tr ' ' '\n' | wc -l`
# Количество не подключенных машин
nc=0
unset components
# Функция сборки RAID'а: Если существует устройство /dev/md0 - попытаться убить
# все связанные с ним процессы и разобрать его, после чего (в любом случае) собрать массив.
assemble_array(){
echo -e "\e[36mAssembling array with that devices: \e[35m$components\e[0;00m"
if [ -e /dev/md0 ]
then
echo -e "\e[5;31mWarning: \e[0;36mTrying to disassemble pre-existing array\e[0;00m";echo
fuser -mk /dev/md0
mdadm -S /dev/md0
fi
modprobe -q raid456
mdadm -A /dev/md0 --run $components
}
case $1 in
assemble|-a)
# Подключение удаленных блочных устройств для каждого из перечисленных адресов
for b in $address
do
# Если существует нужное NBD-устройство - проверить доступность порта на удаленном
# хосте. В случае, если он открыт - подключиться и добавить устройство в список подключенных.
if [ -e /dev/nbd$n ]
then
if [ `nc -w1 -z $(echo $b | sed -e 'ss:s sg');echo $?` -eq 0 ]
then
echo -n "Connecting to $(echo $b | sed -e 'ss:s sg')..."
timeout 3 nbd-client $(echo $b | sed -e 'ss:s sg') /dev/nbd$n 1>/dev/null \
2>/dev/null && components="$components /dev/nbd$n" &&\
echo "Connected" || nc=$[$nc+1]
else
nc=$[$nc+1]
fi
else
# Если устройства нет или подключиться не удалось - увеличить счетчик неподключенных устройств на 1.
error "Error: /dev/nbd$n doesn't exist"
nc=$[$nc+1]
fi
let n+=1
done
# Вывести устрашающие сообщения.
echo
echo -e "\e[36mAccepted array components:\t\e[35m$components\e[0;00m"
echo -e "\e[36mTotal devices connected: \t\e[35m$[$devices-$nc]\e[0;00m"
if [ $nc -ne 0 ]
then
echo -e "\e[0;36mNot connected: \e[5;35m$nc \e[0;36mdevice(s)\e[0;00m"
fi
echo
# Если подключенных устройств оказалось меньше,
# чем общее количество устройств - выдать предупреждение
if [ $devices -gt $[$devices-$nc] ]
then
echo -e "\e[5;31mWarning: \e[0;36mNot all devices connected, trying to build array in run-mode\e[0;00m"
# Если подключенных устройств оказалось на 2 меньше, чем общее количество
# устройств - выдать ошибку и завершить выполнение
if [ $[$devices-1] -gt $[$devices-$nc] ]
then
error "Fatal Error: Can't build array" 1
else assemble_array
fi
else assemble_array
fi
;;
disassemble|-d)
# Написать страшное сообщение, убить все процессы, юзающие массив,
# демонтировать массив, остановить его, попытаться поотключать все NBD-устройства,
# потом добить оставшиеся процессы.
error "Warning: deconstructing array, all non-saved data will lost, all parent processes will killed"
fuser -mk /dev/md0
umount /dev/md0
mdadm -S /dev/md0
for nbd in `ls -1 /dev/nbd*`
do
nbd-client -d $nbd 1>/dev/null 2>/dev/null
fuser -km $nbd
done
pkill -9 nbd-client
modprobe -rq raid456
;;
*|--help)
echo "Usage: storage <assemble|-a>|<disassemble|-d> [--help]
"
;;
esac
exit 0