Клонирование дисков под 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
Linux I класса
Linux II класса
Linux III класса
Счетчики
  • Самый популярный сайт о Linux и Windows 10
О Либератуме

Liberatum — это новости мира дистрибутивов Linux, обзоры, сборки, блоги, а также лучший сайт об Ubuntu*.