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