Duplikace disků

Pokud se provádí duplikace disků pod Solarisem, jsou k dispozici dvě cesty. Tedy, určitě jich je k dispozici více, ale já používám tyto. Určitě by šlo využít ještě Sun Solstice nebo Veritas Volume Manager ;o))



Při kopírování stejně velkého disku na jiný, stejně velký (jen pozor na počet bloků na disku) lze s úspěchem použít příkaz dd. Duplikovaný disk by neměl být namountovaný aby nedošlo k poškození souborového systému, je tedy vhodné nabootovat systém z CD-ROM. Pro zrychlení je možné provést duplikaci i v single-user mode, riziko je zde minimální. Výsledný postup vypadá následujícím způsobem.

1) Přepnutí do Single User mode pomocí init 1 nebo init S. Používám raději Single User mode protože při bootu z CD je duplikace často pomalejší.
2) Kontrola běžících procesů a odmountování nepotřebných disků. V procesech by neměly běžet žádné servery, které přistupují k datům na pozadí, žádné logovací daemony (syslog) a podobně. Ze souborových systémů doporučuji také odmountovat nepotřebné souborové systémy, zvlášť pokud na nich jsou data.
3) Kontrola souborových systémů fsck -y. Tento krok má za účel minimalizovat množství kopírovaných chyb, ale občas může být účelem tyto chyby zachovat a opravu provést později.
4) Duplikace disků. Duplikace se provádí vždy na slice 2, tzn. celý disk.
dd if=/dev/dsk/c?t?d?s2 of=/dev/dsk/c?t?d?s2 bs=262144
5) Start duplikovaného systému by měl být proveden nejprve do Single User mode nebo z CD a zkontrolovat chyby pomocí fsck -y



Při kopírování disku na jiný, s rozdílnou velikostí (jen pozor na množství dat) lze použít jiný postup. oba disky by měly být namountované, je vhodné použít single-user mode.

1) Přepnutí do Single User mode pomocí init 1 nebo init S.
2) Zduplikovat VTOC table pomocí příkazu format nebo pomocí:
prtvtoc /dev/rdsk/c?t?d?s2 >/tmp/vtoc
tento soubor lze nyní upravit a následně naimportovat
fmthard -s /tmp/vtoc dev/rdsk/c?t?d?s2
3) Vytvořit nové souborové systémy na druhém disku (POZOR, nesplést si disky !!!!)
newfs /dev/rdsk/c?t?d?s0
newfs /dev/rdsk/c?t?d?s1
newfs /dev/rdsk/c?t?d?s3
newfs /dev/rdsk/c?t?d?s4
newfs /dev/rdsk/c?t?d?s5
newfs /dev/rdsk/c?t?d?s6
newfs /dev/rdsk/c?t?d?s7

4) Namountovat nový "root" například do adresáře /mnt , zkopírovat data ze stávajícího rootu a připravit systém pro rekonfiguraci zařízení:
mount /dev/dsk/c?t?d?s0 /mnt
ufsdump 0f - / | (cd /mnt/ ; ufsrestore xvf - )
touch /mnt/reconfigure

5) Namountovat další systémy a provést podobnout akci i s nimi, pro příklad:
mount /dev/dsk/c?t?d?s3 s0 /mnt/var
mount /dev/dsk/c?t?d?s4 s0 /mnt/export/home
mount /dev/dsk/c?t?d?s5 s0 /mnt/usr
mount /dev/dsk/c?t?d?s6 s0 /mnt/opt
ufsdump 0f - /usr | (cd /mnt/usr ; ufsrestore xvf - )
ufsdump 0f - /var | (cd /mnt/var ; ufsrestore xvf - )
ufsdump 0f - /opt | (cd /mnt/opt ; ufsrestore xvf - )
ufsdump 0f - /export/home | (cd /mnt/export/home ; ufsrestore xvf - )

6) A na závěr provést inicializaci boot sectoru zavaděče.
installboot /usr/platform/`uname -i`/lib/fs/ufs/bootblk /dev/rdsk/c?t?d?s0

Pokud se mění konfigurace disků, doporu4uji ještě zkontrolovat soubor /mnt/etc/vfstab



Pro tuto činnost používám následující script ... není ideální, ale možná pomůže, alespoň jako návod.

#!/bin/sh
# Disk Duplicating, menu driven interface
#
devices_list()
{
 var_num=1
 for device in $*
 do
     echo " $var_num) $device "
     var_num=`expr $var_num + 1`
 done
}

devices_test()
{
 var_num=1
 var_list=`ls /dev/rdsk/c*s2`
 for device in $var_list
 do
     if [ $var_num = $Device ];
     then
       Device=$device
     fi
     var_num=`expr $var_num + 1`
 done
}

device_path()
{
 base_device=`echo $1 | /usr/bin/awk '{print length($1)-2" "$1}' | /usr/bin/awk '{print substr($2,11,$1-10)}'`
 if [ $2 = "r" ] ;
 then
     base_path="/dev/rdsk/"
 else
     base_path="/dev/dsk/"
 fi
 WORKING=$base_path${base_device}s$3
}

disk_duplicate()
{
 echo "Duplicating disk using command:"
 echo "/usr/bin/dd if=$SOURCE of=$DESTINATION bs=262144"
 /usr/bin/dd if=$SOURCE of=$DESTINATION bs=262144
}

slice_dump()
{
 echo "Constructing new filesystem on device $2"
 echo "Please, answer for any questions bellow yes."
 /usr/sbin/newfs $2
 echo " "
 echo "Copying data from $1 to $2 device"
 /usr/sbin/mount $2 /mnt
 /usr/sbin/ufsdump 0f - $1 | (cd /mnt ; /usr/sbin/ufsrestore xf -)
 if [ $3 = "root" ];
 then
     touch /mnt/reconfigure
 fi
 /usr/sbin/umount /mnt
 if [ $3 = "root" ];
 then
     echo "Installing boot code:"
     /usr/sbin/installboot /usr/platform/`uname -i`/lib/fs/ufs/bootblk $2
 fi
 echo "Slice $1 has been duplicated to slice $2 "
 echo " "
}

disk_dump()
{
 /usr/sbin/prtvtoc $SOURCE >/tmp/vtoc
 echo " "
 echo "Actual VTOC table for destination disk."
 echo "---------------------------------------"
 cat /tmp/vtoc
 /usr/sbin/fmthard -s /tmp/vtoc $DESTINATION
 echo $DESTINATION
 echo "Do you want to make manual changes ? Yes/No"
 echo "Please, do not change number of slices, only slices size!"
 read answer
 case $answer in
   [Y,y][e,E][s,S,5])
     /usr/sbin/format $DESTINATION
     ;;
   [Y,y])
     /usr/sbin/format $DESTINATION
     ;;
   *)
     echo "This VTOC will be used without changes."
     ;;
 esac
 _slic=`/usr/bin/tail -8 /tmp/vtoc | /usr/bin/grep / | /usr/bin/awk '{ print $1}' | /usr/bin/tr '\012' ' '`
 for slices in $_slic
 do
     device_path $SOURCE r $slices
     Source_Slice=$WORKING
     device_path $DESTINATION d $slices
     Destination_Slice=$WORKING
     if [ $slices = "0" ];
     then
       slice_dump $Source_Slice $Destination_Slice root
     else
       slice_dump $Source_Slice $Destination_Slice nonroot
     fi
 done
}

/usr/sbin/mountall >/dev/null
echo "Actual disk usage and mount points"
echo "----------------------------------"
/usr/sbin/df -k
echo " "
echo "Actual swap space usage"
echo "-----------------------"
/usr/sbin/swap -l
echo " "
echo "Which copy method do you want to use?"
echo "-------------------------------------"
echo " "
echo " 1) Disk duplicate"
echo " 2) UFSDump/UFSRestore"
read _method
if [ $_method = "1" ] ;
then
   echo "Your choice is Disk Duplicating (dd)"
   METHOD="dd"
elif [ $_method = "2" ] ;
   then
     echo "Your choice is UFSDump/UFSRestore"
     METHOD="ufsdump"
   else
     echo "None of the above"
     exit
fi
echo " "
echo "Which device will be source disk?"
echo "---------------------------------"
devices_list `ls /dev/rdsk/c*s2 | /usr/bin/tr '\012' ' '`
read _source
Device=$_source
devices_test _source
SOURCE=$Device

echo " "
echo "Which device will be destination disk?"
echo "--------------------------------------"
devices_list `ls /dev/rdsk/c*s2 | /usr/bin/tr '\012' ' '`
read _destination
Device=$_destination
devices_test _destination
DESTINATION=$Device

ilevel=`who -r |awk '{print $3}'`

echo "You want to copy $SOURCE to $DESTINATION using $METHOD command."
case $ilevel in
     [1,a,s,S])
       echo "You are on initlevel $ilevel"
       ;;
     *)
       echo "Sorry. You must be in single user mode. Now you are on initlevel $ilevel"
       exit
       ;;
esac
echo "Do you want to continue ? Yes/No"
read answer
case $answer in
     [N,n][o,O,0])
       exit
       ;;
     [N,n])
       exit
       ;;
     *)
       echo "This can take a while ..."
       ;;
esac

WORKING=$SOURCE

if [ $_method = "1" ] ;
then
   disk_duplicate $SOURCE $DESTINATION
elif [ $_method = "2" ] ;
   then
     disk_dump $SOURCE $DESTINATION
fi

echo "Duplicating whole data has been finished."
echo "You can shutdown the machine now."
echo "For case of trouble:"
echo " 1) Use scsi-probe-all from OBP"
echo " 2) Check in OBP, if you machine booting from correct drive"
echo " 3) Check /etc/vfstab file, if you are mounting filesystem"
echo " from correct device"

Powered by Drupal - Design by artinet