Your best chance is possibly booting from a Live CD, mounting both the source and the destination volumes and performing the copy with tar like this:
This example assumes that
- your source is /dev/sda1
- your dest is /dev/sdb5, still unformatted and you want to use ext3
- you are using an Ubuntu Live CD:
As you might guess, the copy might take long. The -p flag to tar will preserve permissions, preventing havoc when rebooting. Take note that the last C (in -xpv -C) is a capital C meaning "change directory", as opposed to the fist (in -cp) meaning "create archive". After the copy finishes, you will need to check and possibly correct the following files and programs:
ubuntu@ubuntu:/$ sudo -s
/# mkdir /mnt/src /mnt/dest
/# mount -r /dev/sda1 /mnt/src
/# mkfs.ext3 /dev/sdb5
/# mount /dev/sdb5 /mnt/dest
/# cd /mnt/src
/mnt/src# tar -cp . | tar -xpv -C /mnt/dest
- /etc/fstab, which contains the table of filesystems to be mounted. Your root partition is identified by its UUID. Run "vol_id -u" on the target device and paste the new uuid.
- /boot/grub/menu.lst (for GRUB 0.9x) or /boot/grub/grub.cfg (for GRUB 1.9x). Either of these files contain the bootloader config. If you are going to remove the HD with the old root partition completely you might need to reinstall GRUB (grub-install /dev/sdb in this case), but even if you're not, you need to find all the instances of the old root UUID and switch it for the new one
If you are going to remove the old HD, make sure your /boot partition (if you kept it separate from the root) is copied too, then reinstall GRUB as specified above. Keep the Live CD handy for any possible problems, and good luck!