De hardware waarop mijn server draaide was nog goed, maar wat traag. Ik had een kandidaat om de nieuwe server op te installeren. Maar met de software was eigenlijk niets mis, dus in plaats van een nieuwe install, besloot ik de software te klonen naar de nieuwe server.
Hierbij maakte ik gebruik van ploplinux via pxe boot. Verder was het plan om met rsync de software (inclusief user data) over te zetten. Dit heeft als voordeel dat de operatie niet in één keer hoeft te worden afgerond. Na een eerste rsync waarbij de bulk wordt overgezet, kunnen de laatste wijzigingen nog altijd op het laatste moment gesynchroniseerd worden.
Het klonen van een computer heeft ook een paar (operationele) nadelen. Om te beginnen mogen de servers (oud en nieuw) niet tegelijkertijd op het netwerk actief zijn. Ten tweede hoeven de omstandigheden op de kloon niet persé exact hetzelfde te zijn. Hieronder in het verslag mijn workaround:
Ik begon dus met een pxeboot met ploplinux op de nieuwe server. Op de harde schijf met fdisk de partities aangemaakt en van een filesystem voorzien met mkfs.ext3. Let bij het partitioneren er op dat de partitie waarin /boot komt te staan de bootable flag krijgt.
Vervolgens heb ik een script gemaakt die automatisch deze partities kunnen mounten zodat het complete target filesystem op zijn plek komt te staan. Een ander script zorgde ervoor dat dit ook weer automatisch unmount kan worden. Voor de source heb ik twee vergelijkbare scripts gemaakt. Zie hieronder de scripts.
Nu komt rsync in beeld. Bijna alles kan en moet worden overgezet. Maar sommige zaken niet. Je wilt bijvoorbeeld niet dat lost+found wordt overschreven. Maar ook het kopieren van /proc en /sys levert problemen op. Het kopieren van een externe disk of een cd is ook tamelijk overbodig. Hieronder staat het gebruikte rsync script (clone.sh) en de excludes die ik heb gemaakt.
Na afloop van de rsync moest er nog wat nazorg gedaan worden, in mijn geval moest de fstab worden aangepast, omdat de disk indeling en de partitionering afweek van het orgineel. Ook de udev regels gaven problemen. Dit deed ik met het script setfiles.sh, dit wordt aangeroepen vanuit clone.sh.
Om de zaak te kunnen booten moest het MBR nog worden aangepast met het draaien van grub-update. Met het commando chroot zorg je ervoor /mnt/target veranderd in /. Dan kan de grub-update gedraaid worden. Om de chroot weer te verlaten Ctrl D.
Voor de finale rsync heb ik op de server zoveel mogelijk stil gelegd en op de router de internet connectie tijdelijk onderbroken. Op de server heb ik alle niet essentiele services stil gelegd. Na de laatste rsync werd het dan tijd voor een test. Oude server uit en nieuwe server aan. Het was meteen goed! ;-)
De scripts:
# post clone operation | setfiles.sh
echo "setting fstab on target"
cp -v /media/ploplinux/myscripts/files/fstab /mnt/target/etc
echo "setting device.map on target"
cp -v /media/ploplinux/myscripts/files/device.map /mnt/target/boot/grub
echo "setting menu.lst on target"
cp -v /media/ploplinux/myscripts/files/menu.lst /mnt/target/boot/grub
echo "setting udev rules on target"
cp -v /media/ploplinux/myscripts/files/70-persistent-net.rules /mnt/target/etc/udev/rules.d
Hierbij maakte ik gebruik van ploplinux via pxe boot. Verder was het plan om met rsync de software (inclusief user data) over te zetten. Dit heeft als voordeel dat de operatie niet in één keer hoeft te worden afgerond. Na een eerste rsync waarbij de bulk wordt overgezet, kunnen de laatste wijzigingen nog altijd op het laatste moment gesynchroniseerd worden.
Het klonen van een computer heeft ook een paar (operationele) nadelen. Om te beginnen mogen de servers (oud en nieuw) niet tegelijkertijd op het netwerk actief zijn. Ten tweede hoeven de omstandigheden op de kloon niet persé exact hetzelfde te zijn. Hieronder in het verslag mijn workaround:
Ik begon dus met een pxeboot met ploplinux op de nieuwe server. Op de harde schijf met fdisk de partities aangemaakt en van een filesystem voorzien met mkfs.ext3. Let bij het partitioneren er op dat de partitie waarin /boot komt te staan de bootable flag krijgt.
Vervolgens heb ik een script gemaakt die automatisch deze partities kunnen mounten zodat het complete target filesystem op zijn plek komt te staan. Een ander script zorgde ervoor dat dit ook weer automatisch unmount kan worden. Voor de source heb ik twee vergelijkbare scripts gemaakt. Zie hieronder de scripts.
Nu komt rsync in beeld. Bijna alles kan en moet worden overgezet. Maar sommige zaken niet. Je wilt bijvoorbeeld niet dat lost+found wordt overschreven. Maar ook het kopieren van /proc en /sys levert problemen op. Het kopieren van een externe disk of een cd is ook tamelijk overbodig. Hieronder staat het gebruikte rsync script (clone.sh) en de excludes die ik heb gemaakt.
Na afloop van de rsync moest er nog wat nazorg gedaan worden, in mijn geval moest de fstab worden aangepast, omdat de disk indeling en de partitionering afweek van het orgineel. Ook de udev regels gaven problemen. Dit deed ik met het script setfiles.sh, dit wordt aangeroepen vanuit clone.sh.
Om de zaak te kunnen booten moest het MBR nog worden aangepast met het draaien van grub-update. Met het commando chroot zorg je ervoor /mnt/target veranderd in /. Dan kan de grub-update gedraaid worden. Om de chroot weer te verlaten Ctrl D.
Voor de finale rsync heb ik op de server zoveel mogelijk stil gelegd en op de router de internet connectie tijdelijk onderbroken. Op de server heb ik alle niet essentiele services stil gelegd. Na de laatste rsync werd het dan tijd voor een test. Oude server uit en nieuwe server aan. Het was meteen goed! ;-)
De scripts:
======
#!/bin/sh
echo "prepare targets clone operation"
echo "-------------------------------"
echo "creating mountpoint target"
echo "--- -------------------------"
mkdir /mnt/target
echo "mounting targets on target"
echo "-----------------------------"
mount /dev/hda3 /mnt/target
mount /dev/hda1 /mnt/target/boot
mount /dev/hda5 /mnt/target/home
mount /dev/hda10 /mnt/target/tmp
mount /dev/hda6 /mnt/target/var/mail
mount /dev/hda7 /mnt/target/var/spool/cups
mount /dev/hda8 /mnt/target/var/spool/mqueue
mount /dev/hda9 /mnt/target/var/spool/mqueue-client
echo "prepare targets clone operation"
echo "-------------------------------"
echo "creating mountpoint target"
echo "--- -------------------------"
mkdir /mnt/target
echo "mounting targets on target"
echo "-----------------------------"
mount /dev/hda3 /mnt/target
mount /dev/hda1 /mnt/target/boot
mount /dev/hda5 /mnt/target/home
mount /dev/hda10 /mnt/target/tmp
mount /dev/hda6 /mnt/target/var/mail
mount /dev/hda7 /mnt/target/var/spool/cups
mount /dev/hda8 /mnt/target/var/spool/mqueue
mount /dev/hda9 /mnt/target/var/spool/mqueue-client
======
#!/bin/sh
echo "umount targets clone operation"
echo "-------------------------------"
echo "umounting targets on target"
echo "-----------------------------"
umount /mnt/target/boot
umount /mnt/target/home
umount /mnt/target/tmp
umount /mnt/target/var/mail
umount /mnt/target/var/spool/cups
umount /mnt/target/var/spool/mqueue
umount /mnt/target/var/spool/mqueue-client
umount /mnt/target
echo "deleting mountpoint target"
echo "--- -------------------------"
rm -r /mnt/target
echo "umount targets clone operation"
echo "-------------------------------"
echo "umounting targets on target"
echo "-----------------------------"
umount /mnt/target/boot
umount /mnt/target/home
umount /mnt/target/tmp
umount /mnt/target/var/mail
umount /mnt/target/var/spool/cups
umount /mnt/target/var/spool/mqueue
umount /mnt/target/var/spool/mqueue-client
umount /mnt/target
echo "deleting mountpoint target"
echo "--- -------------------------"
rm -r /mnt/target
======
#!/bin/sh
echo "prepare source clone operation"
echo "------------------------------"
echo "creating mountpoint source"
echo "--- -----------------------"
mkdir /mnt/source
echo "mounting source source"
echo "-----------------------"
mount source:// /mnt/source
mount source://boot /mnt/source/boot
mount source://home /mnt/source/home
mount source://tmp /mnt/source/tmp
mount source://var/mail /mnt/source/var/mail
mount source://var/spool/cups /mnt/source/var/spool/cups
mount source://var/spool/mqueue-client /mnt/source/var/spool/mqueue-client
mount source://var/spool/mqueue /mnt/source/var/spool/mqueue
echo "prepare source clone operation"
echo "------------------------------"
echo "creating mountpoint source"
echo "--- -----------------------"
mkdir /mnt/source
echo "mounting source source"
echo "-----------------------"
mount source:// /mnt/source
mount source://boot /mnt/source/boot
mount source://home /mnt/source/home
mount source://tmp /mnt/source/tmp
mount source://var/mail /mnt/source/var/mail
mount source://var/spool/cups /mnt/source/var/spool/cups
mount source://var/spool/mqueue-client /mnt/source/var/spool/mqueue-client
mount source://var/spool/mqueue /mnt/source/var/spool/mqueue
======
#!/bin/sh
echo "umount source clone operation"
echo "------------------------------"
echo "umounting source source"
echo "- ----------------------"
umount /mnt/source/boot
umount /mnt/source/home
umount /mnt/source/tmp
umount /mnt/source/var/mail
umount /mnt/source/var/spool/cups
umount /mnt/source/var/spool/mqueue-client
umount /mnt/source/var/spool/mqueue
umount /mnt/source
echo "deting mountpoint source"
echo "--- ---------------------"
rm -r /mnt/source
echo "umount source clone operation"
echo "------------------------------"
echo "umounting source source"
echo "- ----------------------"
umount /mnt/source/boot
umount /mnt/source/home
umount /mnt/source/tmp
umount /mnt/source/var/mail
umount /mnt/source/var/spool/cups
umount /mnt/source/var/spool/mqueue-client
umount /mnt/source/var/spool/mqueue
umount /mnt/source
echo "deting mountpoint source"
echo "--- ---------------------"
rm -r /mnt/source
======
#!/bin/sh
# Script to do clone operation | clone.sh
# set path
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin
# excludes file
EXCLUDES=/media/ploplinux/myscripts/files/ExcludeFileRsync
# options
OPTIONS="--delete-after --exclude-from=$EXCLUDES -av"
# source
SOURCE=/mnt/source/
# target
TARGET=/mnt/target
# our actual rsyncing function
do_rsync()
{
rsync $OPTIONS $SOURCE $TARGET
setfiles.sh
}
# some error handling and/or run our backup
if [ -f $EXCLUDES ]; then
if [ -d $TARGET/home ]; then
# now the actual transfer
do_rsync
else
echo "cant find $TARGET/home"; exit
fi
else
echo "cant find $EXCLUDES"; exit
fi
# Script to do clone operation | clone.sh
# set path
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin
# excludes file
EXCLUDES=/media/ploplinux/myscripts/files/ExcludeFileRsync
# options
OPTIONS="--delete-after --exclude-from=$EXCLUDES -av"
# source
SOURCE=/mnt/source/
# target
TARGET=/mnt/target
# our actual rsyncing function
do_rsync()
{
rsync $OPTIONS $SOURCE $TARGET
setfiles.sh
}
# some error handling and/or run our backup
if [ -f $EXCLUDES ]; then
if [ -d $TARGET/home ]; then
# now the actual transfer
do_rsync
else
echo "cant find $TARGET/home"; exit
fi
else
echo "cant find $EXCLUDES"; exit
fi
=======
exclude file
lost+found
/proc
/sys
/media
/proc
/sys
/media
======
#!/bin/sh# post clone operation | setfiles.sh
echo "setting fstab on target"
cp -v /media/ploplinux/myscripts/files/fstab /mnt/target/etc
echo "setting device.map on target"
cp -v /media/ploplinux/myscripts/files/device.map /mnt/target/boot/grub
echo "setting menu.lst on target"
cp -v /media/ploplinux/myscripts/files/menu.lst /mnt/target/boot/grub
echo "setting udev rules on target"
cp -v /media/ploplinux/myscripts/files/70-persistent-net.rules /mnt/target/etc/udev/rules.d
Reacties