Клонирование дисков под 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