Сборка распределенного 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