In detail assuming:
-/dev/sda is the live disk and /dev/sdb is the replacement (you can further minimize downtime by installing sdb in a USB enclosure/chassis and doing all formatting/syncing through that)
-sdb is at LEAST the same size as sda
BE SURE to review it and adjust. I'm doing this with no prior knowledge of how your partitions are laid out and what your mountpoints are, etc. Post syncing shuffling of files etc. WILL be necessary. Pay close attention to the rsync line, as i'm assuming / is sda1 and you want it on sdb1.
# copy over the mbr. This has the added benefit over sfdisk in that the
# bootloader is also cloned over
dd if=/dev/sda of=/dev/sdb bs=512 count=1
#OPTIONAL: grow partition of sdbX, where X is the target partition number
#parted /dev/sdb
#(parted) print
#(parted) resize X
# make the new filesystem(s) and mount
for i in $(ls -1 /dev/sdb?);do mkfs.ext3 $i;done
for i in $(ls -1 /dev/sdb? | cut -f3 -d"/");mkdir -p /mnt/$i;\
umount /dev/$i;mount /dev/$i /mnt/$i;done
# start the sync. exclude stuff we don't need to save time/space.
echo "+ /dev/console\n+ /dev/initctl\n+ /dev/null\n+ /dev/zero\n\n- /tmp/*\n- \
/proc/*\n- /dev/*\n- /sys/*\n- /tmp/*\n- /mnt/*\n- /media/*" >> /tmp/exclude.rsync.lst
rsync -az --exclude-from=/tmp/exclude.rsync.lst /. /mnt/sdb1/.
#INSERT POST-SYNC TWEAKINGS HERE. doublecheck file/path locations, etc.
Congrats! done. The important parts are the exclude and making sure you dd the mbr BEFORE modifying the partition table.