Клонирование дисков под FreeBSD

Однажды передо мной встала задача: нужно клонировать HDD под операционной системой FreeBSD. Сначала я понадеялся найти софт типа ghost или trueimage, но ни чего подобного найти не удалось, зато пока я лазил по сети, я наткнулся на пару заметок о клонировании с помощь утилиты dump. К сожалению я не нашел скрипта автоматизированного клонирования, все что я находил требывало вмешательство человека и не умело работать с дисками другого объема(на меньший диск клонирование вообще было не возможно на большем терялось место), пришлось писать его самому, вот о нем и пойдет речь в этой заметке.

Для чего это надо спросите Вы. Отвечаю к примеру вы админите сервак который находится от вас за тысячи километров. Вам постоянно приходится с ним плотно работать, но ведь все люди и ни кто не застрахован от ошибок, при этом там нет специалиста, который в случае вашей ошибки сможет поднять сервер сам. Вот тут то нам на помощь и придет этот маленький скриптик. После запуска по пришествию, какого то времени вы получите совершенно идентичную систему на втором диске, и если у вас что-то пойдет не так то вам нужно будет попросить кого-либо всего лишь поменять местами шлейфы.

Собственно вот исходник скрипта по ходу дела я его буду коментировать.

#!/bin/sh

export PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin

#Исходный диск

src="ad0"

# Принимающий диск
dst="ad2"

# После того как я отформатировал диск по ГОСТУ, для полного уничтожения инфы, bsdlabel не мог получить с него данные вот следующая команда и детектит такие диски.

fdisk -I $dst;

#получаем размер диска

d2size=`fdisk -s $dst |colrm 1 19| colrm 11 | tail -n 1| tr -d " "`;
d2size2=`expr $d2size / 2`;

#получаем общий размер всех фалов

allfilesize=`du -s /|tr -d " /"`;
if [ "${allfilesize}" -gt "$d2size2" ]
then echo "Disk naznachenia ne sootvetstvuet razneram"
exit 1
fi
#получаем проценты для расчета партишенов

d1size=`fdisk -s $src | colrm 1 19 | colrm 11 | tail -n 1| tr -d " "`;

d1size=`expr $d1size / 100`;
d2size=`expr $d2size / 100`;

#создаем файл разметки для bsdlabel с изменением размеров партишенов в соответствии с диском приемником
bsdlabel $src"s1" > /tmp/$src"s1" 2>/dev/null
head -n3 /tmp/$src"s1" > /tmp/$dst"s1";
c=4
e=`cat /tmp/$src"s1" | nl | tail -n 1 | cut -f1 | tr -d " "`;
while true
do
cat /tmp/$src"s1" | head -n $c | tail -n 1 | column -t > 1
w=`cat 1 | cut -d" " -f1 `;
y=`cat 1 | cut -d" " -f3`;
x=`cat 1 | cut -d" " -f5`;
z=`cat 1 | cut -d" " -f7`;
psize=`expr $y / $d1size`;
pout=`expr $d2size '*' $psize`;
if [ $x -ne "0" ]
then
x="*"
fi
echo " $w $pout $x $z" >> /tmp/$dst"s1"
if [ $c -eq $e ]
then break
fi
c=`expr $c + 1`;
done

#задаём структуру партишенов на новом диске и пишем бут

bsdlabel -R -B $dst"s1" /tmp/$dst"s1" 2>/dev/null >&1 >/dev/null
#следующий цикл сначала читает строку из fstab, проверяет партишен на #принадлежность к диску источнику и файловую систему, если она (файловая #система) соответствует ufs
#Получаем точку монтирования, создаем новую fs на диске приемнике и #клонируем туда данные с источника.
c=2
e=`cat /etc/fstab | nl | tail -n 1| cut -f1 | tr -d " "`;
while true
do
w=`cat /etc/fstab | head -n $c | tail -n 1 | column -t | cut -d" " -f1 |colrm 1 5| colrm 4`;
if [ $w = $src ]
then
y=`cat /etc/fstab |head -n $c |tail -n 1 | column -t| cut -d" " -f5 | tr -d " "`;
if [ $y = "ufs" ]
then
x=`cat /etc/fstab | head -n $c | tail -n 1 | column -t | cut -d" " -f1 | colrm 1 8`;
z=`cat /etc/fstab | head -n $c | tail -n 1 | column -t | cut -d" " -f3 | tr -d " "`;
echo "Createing file system: ${dst}$x $z"
newfs -O2 -U /dev/${dst}$x 2>/dev/null >&1 >/dev/null
if [ $? != 0 ]
then
rm -f /var/run/dumpfs.lock
echo "error"
exit 1
fi
echo "ok."
echo "Starting dumping: $z"
mount /dev/${dst}$x /mnt
cd /mnt
dump -f- $z 2>/dev/null | restore -rf- 2>/dev/null >&1 >/dev/null
cd ..
umount /mnt
echo "OK."
fi
fi
if [ $c -eq $e ]
then break
fi
c=`expr $c + 1`;
done

sleep 3
rm -f /var/run/dumpfs.lock

Главная тема: