drag this is why I prefer to do a tar | tar to do the movement of an OS to another HDD. cp can (and in my experience has) caused issues with data not being copied properly since it has no built in error correction, where tar will always bomb out if it sees any problems with data corruption (in my experience).
oog one thing to remember is that cp and tar both will do the job, neither gets the boot block therefore you may need to reinstall your MBR so that you can boot. For lilo, you would need to run lilo or for grub run grub -install. dd will get the boot block BUT since it is a block based duplication if any blocks are marked bad on the filesystem, these will be moved as well. So, you are better off using cp or tar (with my preference being tar).
with tar you could do this:
boot into a rescue environment off CD, mount the source drive and all of its partitions under /tmp/source and do the same for the destination disk under /tmp/destination then run the following command "cd /tmp/source && tar cfv - . | (cd /tmp/destination;tar xf -)" without the quotes of course. This will do a file based copy from the source to the destination. Of course to do this the filesystems on the destination have to be created beforehand (the same needs to be done with cp). Then after tar is done, "cd /tmp/destination && chroot . && grub -install" if using grub, or "cd /tmp/destination && chroot . && lilo" then you can type exit, swap disks and reboot and test the new disk.
I hope this makes sense, I do this way too often unfortunately so I might not be clear enough in the explanation. 🙂